Der Hook interpreter meldet Sinks für dynamische Codeausführung: Konstrukte, die Daten in ausgeführten Code verwandeln oder an eine Shell übergeben, von eval bis zur nativen Deserialisierung. Er arbeitet sprachspezifisch und liest jede Datei nach ihren eigenen Regeln. Er ist die deterministische Engine hinter der Spezialisierung interpreter, und du kannst ihn selbst im Modus scan oder check ausführen.
Ausführen
- Codebasis durchsuchen
- Codeausschnitt prüfen
npx lagune read interpreter # scans the whole project
npx lagune read interpreter --dir src # scans a directory
npx lagune read interpreter --file app.py # scans a single file
npx lagune read interpreter --lang javascript --pattern 'eval(x)' # => careful
npx lagune read interpreter --lang python --pattern 'json.loads(x)' # => safe
Diese Sinks sind Dual-Use: Ob eine vom Angreifer beeinflusste Eingabe einen davon erreicht, kann ein statischer Durchlauf nicht entscheiden, deshalb ist jeder Treffer eine Warnung zur Prüfung, nie ein bestätigter Befund. Der Durchlauf gibt einen einzigen Abschnitt Dynamic-execution sinks to review aus, nach Datei gruppiert. Findet er nichts, gibt er no dynamic-execution sinks found aus.
Analysiere jeden Sink statisch und verfolge, ob nicht vertrauenswürdige Eingaben ihn erreichen. Führe den gemeldeten Code nie aus und übergib ihn nie an eval, ebenso wenig entfernten oder erst zur Laufzeit geladenen Code, den er nachlädt, um zu "testen", was er tut.
So liest du das Urteil
| Urteil | Bedeutung |
|---|---|
careful | Der Codeausschnitt enthält einen Sink für dynamische Ausführung in seiner Sprache. Prüfe ihn durch Lesen, nie durch Ausführen. |
safe | Für die angegebene Sprache wurde kein Sink für dynamische Ausführung gefunden. |
CLI-Optionen
| Option | Wert | Beschreibung |
|---|---|---|
--pattern | ein Codeausschnitt | Prüft einen Codeausschnitt. Wiederhole die Option, um mehrere zu prüfen, ein Urteil pro Zeile. |
--lang | eine Sprache | Erforderlich bei --pattern: eine von javascript, python, php, ruby, java, kotlin, go, rust, c, cpp, csharp. |
--dir | ein Verzeichnis | Beschränkt den Durchlauf auf ein Verzeichnis. Wiederholbar und mit --file kombinierbar. |
--file | eine Datei | Beschränkt den Durchlauf auf eine einzelne Datei. Wiederholbar und mit --dir kombinierbar. |
Ohne Option durchsucht er das gesamte Projekt. --pattern erfordert --lang und lässt sich nicht mit --dir oder --file kombinieren.
Unterstützte Sprachen
Der Durchlauf liest diese Sprachen, erkannt an der Dateiendung, und prüft jede gegen ihre eigene Menge an Sinks für dynamische Ausführung.
| # | Sprache | Dateiendungen | Gemeldete Sinks |
|---|---|---|---|
| 1 | JavaScript / TypeScript | .js, .jsx, .mjs, .cjs, .ts, .tsx, .mts, .cts, .astro, .vue, .svelte, .marko, .riot | eval(), Function-Konstruktor, setTimeout/setInterval mit einem String als Rumpf, Modul vm, exec von child_process, dynamisches require(), dynamisches import() |
| 2 | Python | .py, .pyi | eval/exec, __import__(), os.system/os.popen, subprocess shell=True, pickle.load/loads, yaml.load (unsicher) |
| 3 | Ruby | .rb | eval-Familie (instance_eval/class_eval/module_eval/eval), system/exec, Backticks oder %x, Kernel#open / IO.popen/read/binread / Open3, Process.spawn, Marshal.load |
| 4 | Go | .go | exec.Command/exec.CommandContext, plugin.Open |
| 5 | PHP | .php | eval(), assert() auf einem String, create_function(), Shell-Ausführung (system/exec/shell_exec/passthru/popen/proc_open), call_user_func/call_user_func_array, include/require mit einem zur Laufzeit gebildeten Pfad |
| 6 | Rust | .rs | Command::new, process::Command |
| 7 | Java | .java | Runtime.exec, ProcessBuilder, ScriptEngine, ObjectInputStream.readObject |
| 8 | Kotlin | .kt, .kts | Die JVM-Sinks: Runtime.exec, ProcessBuilder, ScriptEngine, ObjectInputStream.readObject |
| 9 | C# | .cs | Process.Start / new Process, BinaryFormatter, Assembly.Load |
| 10 | C | .c, .h | system(), popen(), die Familie exec* (execl, execve, execvp, …) |
| 11 | C++ | .cc, .cpp, .cxx, .hpp, .hh, .hxx | system(), popen(), die Familie exec* (execl, execve, execvp, …) |
Er liest den Quellcode als Text, deshalb kann ihm ein Sink entgehen, der erst zur Laufzeit zusammengesetzt wird, hinter einem Alias steckt oder in einer Form geschrieben ist, die er nicht erkennt. Betrachte die Tabelle als soliden Ausgangspunkt, nicht als vollständige Bestandsaufnahme.
Der Hook garantiert das Minimum (dass diese Sinks existieren und wo): Ob ein nicht vertrauenswürdiger Wert tatsächlich einen davon erreicht, ist die Ermessensfrage, die die Spezialisierung interpreter abdeckt.
Häufige Fragen
Nein. Er meldet Sinks für dynamische Ausführung als Warnung zur Prüfung, nie als bestätigten Befund, weil ein statischer Durchlauf nicht entscheiden kann, ob eine vom Angreifer beeinflusste Eingabe den Sink erreicht.
Er liest die Sprachen aus der Tabelle "Unterstützte Sprachen", erkannt an der Dateiendung, und prüft jede gegen ihre eigene Menge an Sinks. Andere Sprachen ergeben keine Sinks.
