Хук 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
Ці sinks мають подвійне призначення: чи доходять до них вхідні дані під впливом зловмисника, статична перевірка визначити не може, тож кожен збіг є застереженням для перегляду, а не підтвердженою знахідкою. Перевірка виводить один розділ Dynamic-execution sinks to review, згрупований за файлами. Чистий запуск виводить no dynamic-execution sinks found.
Аналізуйте кожен sink статично, простежуючи, чи доходять до нього недовірені вхідні дані. Ніколи не виконуйте й не передавайте в eval позначений код чи будь-який віддалений або отриманий під час виконання код, який він підтягує, щоб "перевірити", що він робить.
Як читати вердикт
| Вердикт | Значення |
|---|---|
careful | Фрагмент містить sink динамічного виконання для своєї мови. Переглядайте його, читаючи, а не запускаючи. |
safe | Для вказаної мови sink динамічного виконання не знайдено. |
Параметри CLI
| Параметр | Значення | Опис |
|---|---|---|
--pattern | фрагмент коду | Перевірити один фрагмент. Повторіть, щоб перевірити кілька, по вердикту на рядок. |
--lang | мова | Обов'язковий із --pattern: одна з javascript, python, php, ruby, java, kotlin, go, rust, c, cpp, csharp. |
--dir | каталог | Обмежити перевірку каталогом. Повторюється й поєднується з --file. |
--file | файл | Обмежити перевірку одним файлом. Повторюється й поєднується з --dir. |
Без параметрів хук перевіряє весь проєкт. --pattern потребує --lang і не поєднується з --dir чи --file.
Підтримувані мови
Перевірка читає ці мови, визначаючи їх за розширенням файлу, і звіряє кожну з її власним набором sinks динамічного виконання.
| # | Мова | Розширення | Що позначає |
|---|---|---|---|
| 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 | Sinks 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, …) |
Хук читає вихідний код як текст, тож sink, зібраний під час виконання, прихований за псевдонімом або записаний у формі, яку хук не розпізнає, може прослизнути. Сприймайте таблицю як надійну відправну точку, а не як повний перелік.
Хук гарантує мінімум (ці sinks існують, і відомо де): чи справді до одного з них доходить недовірене значення, вирішує судження, яке охоплює спеціалізація interpreter.
Часті запитання
Ні. Він позначає sinks динамічного виконання як застереження для перегляду, а не як підтверджену знахідку, бо статична перевірка не може визначити, чи доходять до sink вхідні дані під впливом зловмисника.
Він читає мови з таблиці "Підтримувані мови", визначаючи їх за розширенням файлу, і звіряє кожну з її власним набором sinks. Інші мови sinks не дають.
