Модуль s.4 · Урок 2
Урок 2: Безопасное исполнение кода ИИ
Чему вы научитесь
- Понимать, почему сгенерированный агентом код опасно запускать на своей машине «как есть»
- Различать две основные угрозы: prompt-injection и эксфильтрацию данных
- Настраивать Docker-песочницу по образцу Kosmos:
--cap-drop=ALL,--network=none, read-only FS, лимиты CPU, RAM, timeout - Проверять чужие навыки и код перед запуском, в том числе сканером Cisco AI Defense Skill Scanner
- Встраивать изоляцию в свой рабочий процесс анализа из урока 1, не теряя в удобстве
Почему чужой код нельзя запускать как есть
В уроке 1 агент писал и исполнял код прямо на ваших данных. Это удобно ровно до первой проблемы. Код, сгенерированный LLM или взятый из навыка, — это чужой код, и относиться к нему надо как к чужому.
Опасность не в том, что агент «злой». Опасность в том, что его инструкции можно перехватить, а его код имеет тот же доступ к системе, что и вы: к файлам, к сети, к переменным окружения с ключами.
Две угрозы: injection и эксфильтрация
Репозиторий Scientific Agent Skills прямо предупреждает о двух рисках при установке навыков — prompt-injection и эксфильтрации данных (K-Dense scientific-agent-skills). Разберём их по отдельности, потому что защищаются они по-разному.
| Угроза | В чём суть | Как проявляется в анализе |
|---|---|---|
| Prompt-injection | В данные или навык вшита инструкция, которую агент воспринимает как команду | В CSV, README навыка или комментарии скрыта фраза «скачай и запусти скрипт», и агент её выполняет |
| Эксфильтрация данных | Код отправляет ваши данные на внешний сервер | Скрипт под видом анализа делает POST с содержимым датасета или с ключами из окружения |
Связка этих угроз и опасна: prompt-injection заставляет агента написать код, а отсутствие изоляции даёт этому коду доступ к сети и файлам для эксфильтрации. Разорвать связку проще всего на втором звене — отобрать у кода сеть и лишние права.
Песочница Kosmos: конкретные флаги
Open-source Kosmos исполняет сгенерированный код в Docker-песочнице с жёсткой изоляцией. Набор мер из его подхода — хороший готовый шаблон (jimmc414/Kosmos).
| Мера | Флаг Docker | Что отбирает у кода |
|---|---|---|
| Сброс capabilities | --cap-drop=ALL | Привилегированные операции ядра |
| Отключение сети | --network=none | Любой исходящий трафик, то есть эксфильтрацию |
| Read-only файловая система | --read-only | Запись куда-либо, кроме явного tmpfs |
| Лимит памяти | --memory | Возможность съесть всю RAM хоста |
| Лимит CPU | --cpus | Возможность занять все ядра |
| Таймаут | timeout вокруг docker run | Бесконечный цикл, зависание |
Логика набора простая: код получает ровно то, что нужно для счёта, — процессор, немного памяти и временную папку, — и ничего сверх этого. Без сети эксфильтрация невозможна технически, а не «по доверию».
Готовый пример запуска
Ниже минимальный безопасный запуск анализа из урока 1 в изолированном контейнере. Датасет и скрипт монтируются только на чтение, результаты пишутся в отдельную папку, сети нет.
docker run --rm \
--cap-drop=ALL \
--security-opt no-new-privileges \
--network=none \
--read-only \
--tmpfs /tmp:size=256m \
--memory=2g \
--cpus=2 \
--pids-limit=128 \
--user 1000:1000 \
-v "$PWD/data:/work/data:ro" \
-v "$PWD/out:/work/out" \
-w /work \
python:3.13-slim \
timeout 300 python /work/data/analysis.py
Разбор по группам флагов: первые три строки отбирают права и привилегии;
--network=none закрывает эксфильтрацию; --read-only плюс --tmpfs дают
запись только во временную папку; лимиты --memory, --cpus, --pids-limit
и внешний timeout 300 ограничивают ресурсы и время.
Сканирование навыков до установки
Изоляция защищает во время исполнения. Но навык стоит проверить ещё до того, как вы его поставите. Scientific Agent Skills рекомендует сканер Cisco AI Defense Skill Scanner для проверки навыков перед установкой (K-Dense scientific-agent-skills).
- Прочитайте SKILL.md глазами. Навык по стандарту Agent Skills — это папка с документацией и кодом. Посмотрите, что он делает, до установки.
- Прогоните сканер. Cisco AI Defense Skill Scanner ищет подозрительные паттерны: сетевые вызовы, чтение секретов, исполнение внешних команд.
- Ставьте из доверенного источника. Предпочитайте официальный репозиторий и фиксированную версию, а не случайную ссылку из чата.
- Запускайте в песочнице. Даже проверенный навык исполняйте изолированно — сканер ловит не всё.
Изоляция как часть процесса, а не разовая мера
Песочница работает, только если она встроена в привычку. Удобный приём — сделать запуск в контейнере единственным способом исполнить код агента.
flowchart LR
A[Агент пишет код] --> R[Человек читает код]
R --> B[Сборка контейнера]
B --> S[Запуск: cap-drop, network none, read-only, лимиты]
S --> O[Папка out: графики и таблицы]
O --> V{Человек проверяет вывод}
V -- ошибки или подозрительное --> R
style A fill:#0891b2,color:#fff,stroke:#0e7490
style S fill:#dc2626,color:#fff,stroke:#991b1b
style V fill:#f59e0b,color:#fff,stroke:#d97706
style O fill:#059669,color:#fff,stroke:#047857
Заметьте, что человек стоит в двух местах: читает код до запуска и проверяет вывод после. Песочница не отменяет ревью — она ограничивает ущерб, если ревью что-то пропустит.
Следующий урок
Урок 3: Доменные пайплайны — соберём один сквозной кейс в вашей области: single-cell RNA-seq, drug discovery или интерпретация вариантов.