Hooks

Hook interpreter : signaler les sinks d'exécution dynamique de code

Analysez une base de code à la recherche de sinks d'exécution dynamique de code dans plusieurs langages, ou évaluez un seul extrait, en ligne de commande.

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​

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

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.

Lisez le code signalé, ne l'exécutez jamais !

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​

VerdictSignification
carefulL'extrait contient un sink d'exécution dynamique pour son langage. Examinez-le en le lisant, jamais en l'exécutant.
safeAucun sink d'exécution dynamique n'a été trouvé pour le langage indiqué.

Options de la CLI​

OptionValeurDescription
--patternun extrait de codeVérifie un extrait. Répétez-la pour en vérifier plusieurs, un verdict par ligne.
--langun langageRequise avec --pattern : javascript, python, php, ruby, java, kotlin, go, rust, c, cpp ou csharp.
--dirun répertoireLimite l'analyse à un répertoire. Peut être répétée et combinée avec --file.
--fileun fichierLimite 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.

#LangageExtensionsSinks signalés
1JavaScript / TypeScript.js, .jsx, .mjs, .cjs, .ts, .tsx, .mts, .cts, .astro, .vue, .svelte, .marko, .rioteval(), constructeur Function, setTimeout/setInterval avec un corps en chaîne, module vm, exec de child_process, require() dynamique, import() dynamique
2Python.py, .pyieval/exec, __import__(), os.system/os.popen, subprocess shell=True, pickle.load/loads, yaml.load (non sûr)
3Ruby.rbfamille eval (instance_eval/class_eval/module_eval/eval), system/exec, backticks ou %x, Kernel#open / IO.popen/read/binread / Open3, Process.spawn, Marshal.load
4Go.goexec.Command/exec.CommandContext, plugin.Open
5PHP.phpeval(), 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
6Rust.rsCommand::new, process::Command
7Java.javaRuntime.exec, ProcessBuilder, ScriptEngine, ObjectInputStream.readObject
8Kotlin.kt, .ktsLes sinks de la JVM : Runtime.exec, ProcessBuilder, ScriptEngine, ObjectInputStream.readObject
9C#.csProcess.Start / new Process, BinaryFormatter, Assembly.Load
10C.c, .hsystem(), popen(), la famille exec* (execl, execve, execvp, …)
11C++.cc, .cpp, .cxx, .hpp, .hh, .hxxsystem(), popen(), la famille exec* (execl, execve, execvp, …)
Au mieux, pas de façon exhaustive

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.

astuce

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.