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

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

Канонический URL: https://lagune.ai/ru-RU/docs/hooks/interpreter
Язык: ru-RU
Оригинал: https://lagune.ai/docs/hooks/interpreter
Последнее обновление: 2026-11-03

Хук `interpreter` помечает **точки динамического выполнения кода** (sinks): конструкции, которые превращают данные в исполняемый код или передают их оболочке, от `eval` до нативной десериализации. Он учитывает язык и читает каждый файл по его собственным правилам. Это детерминированный движок, стоящий за [специализацией `interpreter`](https://lagune.ai/ru-RU/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
```

Эти точки двойного назначения: дойдет ли до них ввод, на который влияет злоумышленник, статическое сканирование определить не может, поэтому каждое совпадение служит **предостережением для проверки**, а не подтвержденной находкой. Сканирование выводит один раздел **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`](https://lagune.ai/ru-RU/docs/catalog).

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

### Подтверждает ли хук interpreter уязвимость?

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

### Какие языки охватывает хук interpreter?

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