Le hook interpreter signale les sinks d'exécution dynamique de code : les constructions qui transforment des données en code exécuté ou les confient à un shell, d'eval à la désérialisation native. Il est adapté au langage et lit chaque fichier selon ses propres règles. C'est le moteur déterministe derrière la spécialisation interpreter, que vous pouvez exécuter vous-même en mode scan ou check.
Exécution
- Analyser la base de code
- Vérifier un extrait
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
Ces sinks sont à double usage : une analyse statique ne peut pas trancher si une entrée influencée par un attaquant en atteint un, donc chaque correspondance est un point de vigilance à examiner, jamais un constat confirmé. L'analyse affiche une seule section Dynamic-execution sinks to review, regroupée par fichier. Une analyse propre affiche no dynamic-execution sinks found.
Raisonnez sur chaque sink de façon statique, en traçant si une entrée non fiable l'atteint. N'exécutez jamais et ne passez jamais à eval le code signalé, ni le code distant ou récupéré à l'exécution qu'il charge, pour "tester" ce qu'il fait.
Lire le verdict
| Verdict | Signification |
|---|---|
careful | L'extrait contient un sink d'exécution dynamique pour son langage. Examinez-le en le lisant, jamais en l'exécutant. |
safe | Aucun sink d'exécution dynamique n'a été trouvé pour le langage indiqué. |
Options de la CLI
| Option | Valeur | Description |
|---|---|---|
--pattern | un extrait de code | Vérifie un extrait. Répétez-la pour en vérifier plusieurs, un verdict par ligne. |
--lang | un langage | Requise avec --pattern : javascript, python, php, ruby, java, kotlin, go, rust, c, cpp ou csharp. |
--dir | un répertoire | Limite l'analyse à un répertoire. Peut être répétée et combinée avec --file. |
--file | un fichier | Limite l'analyse à un seul fichier. Peut être répétée et combinée avec --dir. |
Sans option, il analyse tout le projet. --pattern exige --lang et ne peut pas être combinée avec --dir ou --file.
Langages pris en charge
L'analyse lit ces langages, selon l'extension du fichier, chacun confronté à son propre ensemble de sinks d'exécution dynamique.
| # | Langage | Extensions | Sinks signalés |
|---|---|---|---|
| 1 | JavaScript / TypeScript | .js, .jsx, .mjs, .cjs, .ts, .tsx, .mts, .cts, .astro, .vue, .svelte, .marko, .riot | eval(), constructeur Function, setTimeout/setInterval avec un corps en chaîne, module vm, exec de child_process, require() dynamique, import() dynamique |
| 2 | Python | .py, .pyi | eval/exec, __import__(), os.system/os.popen, subprocess shell=True, pickle.load/loads, yaml.load (non sûr) |
| 3 | Ruby | .rb | famille eval (instance_eval/class_eval/module_eval/eval), system/exec, backticks ou %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() sur une chaîne, create_function(), exécution shell (system/exec/shell_exec/passthru/popen/proc_open), call_user_func/call_user_func_array, include/require avec un chemin calculé à l'exécution |
| 6 | Rust | .rs | Command::new, process::Command |
| 7 | Java | .java | Runtime.exec, ProcessBuilder, ScriptEngine, ObjectInputStream.readObject |
| 8 | Kotlin | .kt, .kts | Les sinks de la JVM : Runtime.exec, ProcessBuilder, ScriptEngine, ObjectInputStream.readObject |
| 9 | C# | .cs | Process.Start / new Process, BinaryFormatter, Assembly.Load |
| 10 | C | .c, .h | system(), popen(), la famille exec* (execl, execve, execvp, …) |
| 11 | C++ | .cc, .cpp, .cxx, .hpp, .hh, .hxx | system(), popen(), la famille exec* (execl, execve, execvp, …) |
Il lit le code source comme du texte, donc un sink assemblé à l'exécution, caché derrière un alias ou écrit sous une forme qu'il ne reconnaît pas peut lui échapper. Considérez le tableau comme un point de départ solide, pas comme un inventaire complet.
Le hook garantit le socle (ces sinks existent, et à tel endroit) : savoir si une valeur non fiable en atteint réellement un relève du jugement que couvre la spécialisation interpreter.
Questions fréquentes
Non. Il signale les sinks d'exécution dynamique comme des points de vigilance à examiner, jamais comme des constats confirmés, parce qu'une analyse statique ne peut pas trancher si une entrée influencée par un attaquant atteint le sink.
Il lit les langages du tableau Langages pris en charge, selon l'extension du fichier, chacun confronté à son propre ensemble de sinks. Les autres langages ne produisent aucun sink.
