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

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

Канонічна URL-адреса: https://lagune.ai/uk-UA/docs/hooks/interpreter
Мова: uk-UA
Оригінал: https://lagune.ai/docs/hooks/interpreter
Останнє оновлення: 2026-11-03

Хук `interpreter` позначає **sinks динамічного виконання коду**: конструкції, що перетворюють дані на виконуваний код або передають їх в оболонку, від `eval` до нативної десеріалізації. Він враховує мову й читає кожен файл за його власними правилами. Це детермінований рушій [спеціалізації `interpreter`](https://lagune.ai/uk-UA/docs/catalog), який ви можете запускати самі в режимі **scan** або **check**.

## Запуск

**Перевірити кодову базу**

```bash
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
```

**Перевірити фрагмент**

```bash
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`](https://lagune.ai/uk-UA/docs/catalog).

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

### Чи підтверджує хук interpreter вразливість?

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

### Які мови охоплює хук interpreter?

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