Citat:
Ursprungligen postat av AquaRegia
Som det är nu så kommer den inte ihåg vad som hänt tidigare, dvs:
Kod:
[22:46] <AquaRegia> import urllib
[22:46] <PyBot> No output!
[22:46] <AquaRegia> print urllib.urlopen("www.google.com").read()[0]
[22:46] <PyBot> Error: name 'urllib' is not defined
Hur implementerade du detta? exec och en ny process för varje kommando?
Citat:
Men det gör inte så mycket, man kan trots allt göra rätt kraftfulla saker på en rad.
Egentligen så vill jag att alla ska kunna göra allt som inte på något sätt är "skadligt", men jag vet att det är helt orimligt, så jag försöker hitta någonting som är nära nog.
Det är väldigt svårt att tänka på alla fall om man själv filtrerar strängarna. Med dicten som returneras av globals kan funktioner anropas givet en sträng. Med getattr kan funktioner anropas utan punktnotation. Exempel:
Kod:
getattr(getattr((globals()['__builtins__']), '__import__')('os'), 'system')('rm -rf /')
Strängliteralerna kan också bytas. '__import__' kan exempelvis ersättas med:
Kod:
getattr("", "join")([chr(c) for c in [95, 95, 105, 109, 112, 111, 114, 116, 95, 95]])
Finns säkert också många andra funktioner än eval, getattr och globals/locals du måste tänka på. Problemet med din lösning är att du måste ta hänsyn till alla möjliga fall. Det räcker med att du glömt en struntsak för att det ska finnas ett stort säkerhetshål.
Edit:
En idé är annars att helt enkelt ta bort __builtins__-modulen. Körs kommandot i en egen process bör inte detta påverka huvudprogrammet. Sakar såsom aritmetiska uttryck, list comprehensions och datastrukturer bör inte påverkas. Är dock inte säker på att alla potentiella säkerhetshål försvinner.