Hooks

Hook interpreter: Sinks für dynamische Codeausführung melden

Durchsuche eine Codebasis sprachübergreifend nach Sinks für dynamische Codeausführung, oder bewerte einen einzelnen Codeausschnitt, direkt über die Kommandozeile.

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​

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

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.

Lies den gemeldeten Code, führe ihn nie 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​

UrteilBedeutung
carefulDer Codeausschnitt enthält einen Sink für dynamische Ausführung in seiner Sprache. Prüfe ihn durch Lesen, nie durch Ausführen.
safeFür die angegebene Sprache wurde kein Sink für dynamische Ausführung gefunden.

CLI-Optionen​

OptionWertBeschreibung
--patternein CodeausschnittPrüft einen Codeausschnitt. Wiederhole die Option, um mehrere zu prüfen, ein Urteil pro Zeile.
--langeine SpracheErforderlich bei --pattern: eine von javascript, python, php, ruby, java, kotlin, go, rust, c, cpp, csharp.
--direin VerzeichnisBeschränkt den Durchlauf auf ein Verzeichnis. Wiederholbar und mit --file kombinierbar.
--fileeine DateiBeschrä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.

#SpracheDateiendungenGemeldete Sinks
1JavaScript / TypeScript.js, .jsx, .mjs, .cjs, .ts, .tsx, .mts, .cts, .astro, .vue, .svelte, .marko, .rioteval(), Function-Konstruktor, setTimeout/setInterval mit einem String als Rumpf, Modul vm, exec von child_process, dynamisches require(), dynamisches import()
2Python.py, .pyieval/exec, __import__(), os.system/os.popen, subprocess shell=True, pickle.load/loads, yaml.load (unsicher)
3Ruby.rbeval-Familie (instance_eval/class_eval/module_eval/eval), system/exec, Backticks oder %x, Kernel#open / IO.popen/read/binread / Open3, Process.spawn, Marshal.load
4Go.goexec.Command/exec.CommandContext, plugin.Open
5PHP.phpeval(), 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
6Rust.rsCommand::new, process::Command
7Java.javaRuntime.exec, ProcessBuilder, ScriptEngine, ObjectInputStream.readObject
8Kotlin.kt, .ktsDie JVM-Sinks: Runtime.exec, ProcessBuilder, ScriptEngine, ObjectInputStream.readObject
9C#.csProcess.Start / new Process, BinaryFormatter, Assembly.Load
10C.c, .hsystem(), popen(), die Familie exec* (execl, execve, execvp, …)
11C++.cc, .cpp, .cxx, .hpp, .hh, .hxxsystem(), popen(), die Familie exec* (execl, execve, execvp, …)
Bestmöglich, aber nicht lückenlos

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.

tipp

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.