2014-04-24 16 views
5

Ich denke, einige Bytecode-Manipulation (denke genetische Programmierung) in Python.Wie validiere ich Python-Bytecode?

stieß ich auf ein Testfall in crashers test section von Quellbaum Python, die besagt:

Broken bytecode objects can easily crash the interpreter. This is not going to be fixed.

So ist die Frage, wie angegeben gezwickt Byte-Code zu bestätigen, dass es Dolmetscher wird nicht abstürzen? Ist es überhaupt möglich?

Testquelle, nach http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html

cc = (lambda fc=(
    lambda n: [ 
     c for c in 
      ().__class__.__bases__[0].__subclasses__() 
      if c.__name__ == n 
     ][0] 
    ): 
    fc("function")(
     fc("code")(
      0, 0, 0, 0, "KABOOM",(),(),(), "", "", 0, "" 
     ), {} 
    )() 
) 

Hier legt dieses Modul cc, dass, wenn genannt, mymod.cc() Abstürze Interpreter. Zugegeben, dies ist ein sehr schwieriges Beispiel, das ein neues Code-Objekt mit dem benutzerdefinierten Bytecode "KABOOM" erstellt und dann ausführt.

Ich würde etwas akzeptieren, das vordefinierte Bytecode, z. aus einer .pyc Datei.

+4

Ich kenne keine Methode, die Bytecode validieren wird, nein. Dies ist eine schwierige Aufgabe. Besser nur einen gültigen Bytecode erzeugen. –

+2

Ich denke, das kann unentscheidbar sein. Angenommen, Sie haben einen Bytecode, der äquivalent ist zu: 'if method_that_may_loop_forever(): crash()'. Sie müssten das [Halting Problem] (http://en.wikipedia.org/wiki/Halting_problem) lösen, um festzustellen, ob es abstürzt oder nicht. – Kevin

+3

@Kevin Ich möchte das Problem nicht lösen. Ich möchte nur feststellen, ob eine bestimmte Bytecode-Sequenz garantiert sicher oder möglicherweise unsicher ist. Ähnlich wie JVM. –

Antwort

1

Beide veraltet, der erste ohne Code (zumindest kann ich nicht finden), kann aber sinnvoll sein, eine Vorstellung davon zu geben, was/wie getan werden kann und Was sind die Beschränkungen?

+0

Zumindest für ein einfaches '" KABOOM "' wird von 'Python-Bytecode-Verifier' mit' bemerkt verifier.VerificationError: Nicht verifizierbarer Code: Stack-Unterlauf. Versatz: 0 Stapel: 0 Begrenzung: 0 Erforderlich: 2'; Natürlich ist das Paket hoffnungslos veraltet. –

1

Python ist aus den in der Frage angegebenen Gründen möglicherweise keine ideale Sprache für solche Aufgaben.

Ein Ansatz: Erzeuge oder akzeptiere keinen Raw-Bytecode, akzeptiere nur Python-Quellcode und kompiliere ihn selbst.

Weiter gibt es Bibliotheken (RestrictedPython), die Python auf AST-Ebene manipulieren, um einige Sicherheitsgarantien z. um das Entweichen von Sandbox zu verhindern.

+0

Bitte korrigieren Sie mich, wenn ich falsch liege, aber 'RestrictedPython' benötigt Python-Quelle als Eingabe, nicht wahr? –

+0

Ja. Das ist AST - Abstract Syntax Tree. Wenn Sie pedantisch sein wollen, ist das nicht der Quellcode selbst. Daher ist der Haftungsausschluss (möglicherweise nicht für Ihren Ansatz) geeignet. –

3

Verwenden eines Bytecodes Assembler führt den Stack über Sprünge hinweg aus, überprüft global die Konsistenz der Stacklevelvorhersage und weist automatisch Versuche zurück, toten Code zu generieren. Es ist praktisch unmöglich, versehentlich Bytecode zu erzeugen, der den Interpreter zum Absturz bringen kann. Diese Link könnte Ihnen helfen.

+1

Gute Bibliothek/Link, ich muss überprüfen, dass es in der Tat Bytecode in dem Grad validiere, den ich möchte. Ich vermute, dass die Validierung von beliebigen Code-Sprüngen technisch unentscheidbar ist, also die Frage ist, ob Byte-Code-Assembler auf der Seite der Vorsicht (lehnt möglicherweise schlechten Bytecode) oder auf der Seite des Benutzers (ermöglicht potenziell guten Code). –

+0

Wenn Sie das BytecodeAssembler-Modul (http://pypi.python.org/pypi/BytecodeAssembler) verwenden, müssen Sie diese Dinge nicht herausfinden. In der Tat, es hat viel Unterstützung für Etiketten, Block-Handling, etc. Das vollständige Handbuch dafür ist bei (http://peak.telecommunity.com/DevCenter/BytecodeAssembler) – devst3r

+1

Ich fürchte, diese Aussage gilt nur für die Generierung Code mit 'BytecodeAssembler' und nicht beim Analysieren von vorhandenem Byte-Code. Es kann sich als möglich herausstellen, existierender Byte-Code Sequenzen von API-Aufrufen zuzuordnen, obwohl ich versuche, etwas zu hacken ... –