Хуки

Хук interpreter: поиск точек динамического выполнения кода

Проверьте кодовую базу на точки динамического выполнения кода на разных языках или оцените отдельный фрагмент из командной строки.

Хук 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

Эти точки двойного назначения: дойдет ли до них ввод, на который влияет злоумышленник, статическое сканирование определить не может, поэтому каждое совпадение служит предостережением для проверки, а не подтвержденной находкой. Сканирование выводит один раздел 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.

Поддерживаемые языки​

Сканирование читает эти языки, определяя их по расширению файла, и проверяет каждый по его собственному набору точек динамического выполнения.

#ЯзыкРасширенияЧто помечает
1JavaScript / TypeScript.js, .jsx, .mjs, .cjs, .ts, .tsx, .mts, .cts, .astro, .vue, .svelte, .marko, .rioteval(), конструктор Function, setTimeout/setInterval со строковым телом, модуль vm, exec из child_process, динамический require(), динамический import()
2Python.py, .pyieval/exec, __import__(), os.system/os.popen, subprocess с shell=True, pickle.load/loads, yaml.load (небезопасный)
3Ruby.rbсемейство eval (instance_eval/class_eval/module_eval/eval), system/exec, обратные кавычки или %x, Kernel#open / IO.popen/read/binread / Open3, Process.spawn, Marshal.load
4Go.goexec.Command/exec.CommandContext, plugin.Open
5PHP.phpeval(), assert() со строкой, create_function(), выполнение в оболочке (system/exec/shell_exec/passthru/popen/proc_open), call_user_func/call_user_func_array, include/require с путем, вычисляемым во время выполнения
6Rust.rsCommand::new, process::Command
7Java.javaRuntime.exec, ProcessBuilder, ScriptEngine, ObjectInputStream.readObject
8Kotlin.kt, .ktsТочки JVM: Runtime.exec, ProcessBuilder, ScriptEngine, ObjectInputStream.readObject
9C#.csProcess.Start / new Process, BinaryFormatter, Assembly.Load
10C.c, .hsystem(), popen(), семейство exec* (execl, execve, execvp, …)
11C++.cc, .cpp, .cxx, .hpp, .hh, .hxxsystem(), popen(), семейство exec* (execl, execve, execvp, …)
По мере возможностей, а не исчерпывающе

Хук читает исходный код как текст, поэтому точка, собранная во время выполнения, спрятанная за псевдонимом или записанная в нераспознаваемой форме, может проскользнуть. Считайте таблицу надежной отправной точкой, а не полной инвентаризацией.

подсказка

Хук гарантирует минимум (эти точки существуют, и известно где): доходит ли до них на самом деле недоверенное значение, решает суждение, которое охватывает специализация interpreter.

Частые вопросы

Нет. Он помечает точки динамического выполнения как предостережение для проверки, а не как подтвержденную находку, потому что статическое сканирование не может определить, доходит ли до точки ввод, на который влияет злоумышленник.

Он читает языки из таблицы поддерживаемых языков, определяя их по расширению файла, и проверяет каждый по его собственному набору точек. Для других языков точки не выдаются.