Хуки

Хук interpreter: позначення sinks динамічного виконання коду

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

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

Ці 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 динамічного виконання.

#МоваРозширенняЩо позначає
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, .ktsSinks 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, …)
Найкраще з можливого, але не вичерпно

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

порада

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

Часті запитання

Ні. Він позначає sinks динамічного виконання як застереження для перегляду, а не як підтверджену знахідку, бо статична перевірка не може визначити, чи доходять до sink вхідні дані під впливом зловмисника.

Він читає мови з таблиці "Підтримувані мови", визначаючи їх за розширенням файлу, і звіряє кожну з її власним набором sinks. Інші мови sinks не дають.