Хук interpreter помечает точки динамического выполнения кода (sinks): конструкции, которые превращают данные в исполняемый код или передают их оболочке, от eval до нативной десериализации. Он учитывает язык и читает каждый файл по его собственным правилам. Это детерминированный движок, стоящий за специализацией interpreter, и вы можете запускать его сами в режиме scan или check.
Запуск
- Сканировать кодовую базу
- Проверить фрагмент
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
Эти точки двойного назначения: дойдет ли до них ввод, на который влияет злоумышленник, статическое сканирование определить не может, поэтому каждое совпадение служит предостережением для проверки, а не подтвержденной находкой. Сканирование выводит один раздел Dynamic-execution sinks to review, сгруппированный по файлам. Если ничего не найдено, выводится no dynamic-execution sinks found.
Рассуждайте о каждой точке статически, прослеживая, доходит ли до нее недоверенный ввод. Никогда не выполняйте и не передавайте в eval помеченный код или любой удаленный код, загружаемый им во время выполнения, чтобы "проверить", что он делает.
Как читать вердикт
| Вердикт | Значение |
|---|---|
careful | Фрагмент содержит точку динамического выполнения для своего языка. Проверяйте его чтением, а не запуском. |
safe | Для указанного языка точек динамического выполнения не найдено. |
Параметры CLI
| Параметр | Значение | Описание |
|---|---|---|
--pattern | фрагмент кода | Проверяет один фрагмент. Повторите, чтобы проверить несколько, по одному вердикту на строку. |
--lang | язык | Обязателен с --pattern: один из javascript, python, php, ruby, java, kotlin, go, rust, c, cpp, csharp. |
--dir | директория | Ограничивает сканирование директорией. Можно повторять и сочетать с --file. |
--file | файл | Ограничивает сканирование одним файлом. Можно повторять и сочетать с --dir. |
Без параметров хук сканирует весь проект. --pattern требует --lang и не сочетается с --dir или --file.
Поддерживаемые языки
Сканирование читает эти языки, определяя их по расширению файла, и проверяет каждый по его собственному набору точек динамического выполнения.
| # | Язык | Расширения | Что помечает |
|---|---|---|---|
| 1 | JavaScript / TypeScript | .js, .jsx, .mjs, .cjs, .ts, .tsx, .mts, .cts, .astro, .vue, .svelte, .marko, .riot | eval(), конструктор Function, setTimeout/setInterval со строковым телом, модуль vm, exec из child_process, динамический require(), динамический import() |
| 2 | Python | .py, .pyi | eval/exec, __import__(), os.system/os.popen, subprocess с shell=True, pickle.load/loads, yaml.load (небезопасный) |
| 3 | Ruby | .rb | семейство eval (instance_eval/class_eval/module_eval/eval), system/exec, обратные кавычки или %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() со строкой, create_function(), выполнение в оболочке (system/exec/shell_exec/passthru/popen/proc_open), call_user_func/call_user_func_array, include/require с путем, вычисляемым во время выполнения |
| 6 | Rust | .rs | Command::new, process::Command |
| 7 | Java | .java | Runtime.exec, ProcessBuilder, ScriptEngine, ObjectInputStream.readObject |
| 8 | Kotlin | .kt, .kts | Точки JVM: Runtime.exec, ProcessBuilder, ScriptEngine, ObjectInputStream.readObject |
| 9 | C# | .cs | Process.Start / new Process, BinaryFormatter, Assembly.Load |
| 10 | C | .c, .h | system(), popen(), семейство exec* (execl, execve, execvp, …) |
| 11 | C++ | .cc, .cpp, .cxx, .hpp, .hh, .hxx | system(), popen(), семейство exec* (execl, execve, execvp, …) |
Хук читает исходный код как текст, поэтому точка, собранная во время выполнения, спрятанная за псевдонимом или записанная в нераспознаваемой форме, может проскользнуть. Считайте таблицу надежной отправной точкой, а не полной инвентаризацией.
Хук гарантирует минимум (эти точки существуют, и известно где): доходит ли до них на самом деле недоверенное значение, решает суждение, которое охватывает специализация interpreter.
Частые вопросы
Нет. Он помечает точки динамического выполнения как предостережение для проверки, а не как подтвержденную находку, потому что статическое сканирование не может определить, доходит ли до точки ввод, на который влияет злоумышленник.
Он читает языки из таблицы поддерживаемых языков, определяя их по расширению файла, и проверяет каждый по его собственному набору точек. Для других языков точки не выдаются.
