
AI Code Security — четыре агента, которые ловят то, что пропускает SAST в коде, сгенерированном ИИ. Построено на платформе GitLab Duo Agent.
Безопасность AI-кода — ловим то, что пропускает SAST в коде, сгенерированном ИИ Построено на платформе GitLab Duo Agent
40-62% кода, созданного ИИ, содержит уязвимости безопасности. Традиционные SAST ловят CVE. Мы ловим то, что пропускает SAST — инъекции промптов, выполнение вывода LLM, небезопасная десериализация ML.
Начало работы · Архитектура · Правила обнаружения · Руководство по настройке · Реализация
ИИ ускоряет генерацию кода, но создаёт новые узкие места в безопасности:
Источник: Отчет GitLab 2025 Global DevSecOps
AgentFlow Auditor — Четыре AI-агента, которые ловят риски безопасности, пропускаемые традиционными SAST в коде, созданном ИИ. 41 правило обнаружения, включая инъекции промптов LLM, выполнение вывода, небезопасную десериализацию, SQL-инъекции, SSRF и обход путей. Публикует сканируемые отчеты, генерирует патчи для исправлений, отслеживает дрейф рисков. Один @mention запускает все.
Developer opens MR │ ▼ @duo-agentflow-auditor review this MR │ ▼ ┌───────────────────────────────────────────────────────┐ │ │ │ ┌─────────────┐ ┌──────────────────┐ │ │ │ Scanner │──────▶│ Reporter │ │ │ │ Agent │ │ Agent │ │ │ │ │ │ │ │ │ │ Read diffs │ │ Grade risk │ │ │ │ Match 34 │ │ Risk heatmap │ │ │ │ rules │ │ Post MR comment │ │ │ │ Score risk │ │ Create issue │ │ │ └─────────────┘ └────────┬─────────┘ │ │ │ │ │ ┌───────┴────────┐ │ │ │ SAFE? │ │ │ │ ├─ Yes ──────────────┐ │ │ │ └─ No ───┐ │ │ │ │ └───────────┘ │ │ │ │ │ │ │ │ │ ┌─────────────┐ ┌────────▼───────┘┐ │ │ │ │ Metrics │◀──────│ Fixer │ │ │ │ │ Agent │ │ Agent │ │ │ │ │ │◀──────────────────────────────┘ │ │ │ Baseline │ │ Confidence-scored│ │ │ │ Cross-MR │ │ patches │ │ │ │ Green │ │ Fix branch + MR │ │ │ │ Posture │ │ │ │ │ └─────────────┘ └─────────────────┘ │ │ │ │ GitLab Duo Agent Platform (ambient) │ │ │ │ ┌───────────────────────────────────────────┐ │ │ │ External SAST Agent (CI/CD container) │ │ │ │ bandit + semgrep + custom rules merge │ │ │ └───────────────────────────────────────────┘ │ └───────────────────────────────────────────────────────┘
### Состав агентов
| Агент | Роль | Инструменты | Ключевая возможность |
|:------|:-----|:------|:---------------|
| **Scanner** | Анализировать MR-дифы | 10 инструментов | 41 правило (26 regex + 15 Semgrep), обнаружение угроз, специфичных для ИИ, интеграция с уязвимостями |
| **Reporter** | Публиковать отчёты по аудиту | 7 инструментов | Сканирование за 10 сек (оценка + тепловая карта + топ-5), привязка уязвимостей, автоматическое создание задачи при DANGER |
| **Fixer** | Генерировать исправления кода | 8 инструментов | Патчи с оценкой уверенности (HIGH/MEDIUM/LOW), автоматическое создание MR с исправлением |
| **Metrics** | Отслеживать базовый уровень риска | 6 инструментов | Обучение между MR, состояние команды, отклонение базы, отслеживание энергии/углерода |
| **SAST Scanner** | Внешний SAST | CI/CD | Запускает bandit + semgrep, объединяет с пользовательскими правилами через Python-скрипт |
---
## Возможности
<table>
<tr>
<td width="50%">
### Сканирование безопасности
- **41 правило обнаружения** — 26 regex + 15 пользовательских правил Semgrep
- **8 категорий риска** — От разрушительных команд до внедрения промптов
- **Обнаружение, специфичное для ИИ** — Внедрение промптов LLM, выход-в-исполнение, небезопасная десериализация
- **Оценка риска** — 0-100 за находку (серьёзность x контекст x категория)
- **Система оценок** — SAFE / WARNING / DANGER
</td>
<td width="50%">
### Автоматизация
- **Одно событие для активации** — `@упоминание` или назначение рецензента
- **Условная маршрутизация** — SAFE сканирование пропускает Fixer, экономя токены
- **Структурированные комментарии к MR** — Таблицы рисков, предложения по исправлению, сворачиваемые детали
- **Автоматическое создание исправлений** — Патчи кода в новой ветке
- **Создание задачи** — Автоматически при оценке DANGER
</td>
</tr>
<tr>
<td width="50%">
### Отслеживание базового уровня
- **Обнаружение отклонений риска** — Сравнение результатов сканирования с течением времени
- **Анализ трендов** — Улучшение / ухудшение / стабильно
- **Уровень принятия исправлений** — Отслеживание количества применённых предложений
- **Журнал истории** — JSONL-добавление при каждом сканировании
</td>
<td width="50%">
### «Зелёные» метрики
- **Отслеживание токенов** — Использование за сканирование
- **Оценка энергии** — кВт·ч за сканирование
- **Углеродный след** — кг CO2 с реальными аналогиями
- **Предложения по оптимизации** — Уменьшить область сканирования, кэшировать базовые уровни
</td>
</tr>
</table>
---
## Категории обнаружения
### Пользовательские правила Semgrep
15 правил Semgrep производственного качества по 6 категориям:
| Правило | Категория | Серьёзность | Обнаружение |
|:-----|:---------|:---------|:----------|
| `llm-prompt-injection` | Безопасность ИИ | WARNING | Поток пользовательского ввода в вызовы LLM API |
| `llm-output-code-exec` | Безопасность ИИ | ERROR | Вывод LLM, переданный в exec/eval |
| `unsafe-deserialization-ml` | Безопасность ИИ | WARNING | pickle.load, torch.load на ненадёжных моделях |
| `sql-injection` | Безопасность веба | ERROR | SQL-запросы, формируемые через строки (f-строка, .format, конкатенация) |
| `path-traversal` | Безопасность веба | ERROR | Пользовательский ввод в операциях с путями файлов (../ обход) |
| `ssrf-request-forgery` | Безопасность веба | ERROR | Управляемые пользователем URL в HTTP-запросах |
| `open-redirect` | Безопасность веба | WARNING | Пользовательский ввод в функциях перенаправления |
| `missing-input-validation` | Безопасность веба | WARNING | Данные запроса, используемые без проверки схемы |
| `dangerous-eval-exec` | Python | WARNING | eval/exec с динамическим содержимым |
| `subprocess-shell-true` | Python | WARNING | subprocess с shell=True |
| `dangerous-os-system` | Python | WARNING | os.system/popen (устарело) |
| `insecure-random-python` | Криптография | WARNING | Модуль random для токенов безопасности |
| `insecure-random-javascript` | Криптография | WARNING | Math.random() для токенов безопасности |
| `hardcoded-credentials` | Секреты | WARNING | Жёстко заданные пароли, ключи API, токены |
| `insecure-http` | Сеть | INFO | HTTP URL (с автоматическим исправлением на HTTPS) |
### Категории обнаружения регулярными выражениями
| Категория | Серьёзность | Примеры шаблонов |
|:---------|:---------|:-----------------|
| Разрушительные команды | 🚨 Danger | `rm -rf /`, `mkfs`, `dd на диск` |
| Кража учётных данных | 🚨 Danger | `curl`, отправляющий секреты на внешние URL |
| Внедрение промптов (серьёзное) | 🚨 Danger | «Игнорировать предыдущие инструкции», переопределение ролей |
| Обфусцированное выполнение | 🚨 Danger | `base64 -d \| bash`, удалённый конвейер в оболочку |
| Выполнение в оболочке | ⚠️ Warning | `shell=True`, `eval()`, `exec()`, `os.system()` |
| Сетевые вызовы | ⚠️ Warning | `curl`/`wget`/`fetch` на внешние URL |
| Небезопасный транспорт | ⚠️ Warning | `http://` там, где должен быть `https://` |
| Жёстко заданные учётные данные | ⚠️ Warning | Пароли, ключи API, токены в исходном коде |
### Формула оценки риска```
score = severity_weight + category_weight + executable_context + actionable + risk_modifier
= clamp(0, 100)
severity_weight: danger=50, warning=25
category_weight: destructive-command=15, credential-exfil=15, prompt-injection=10, ...
executable_context: +20 if file is .sh/.py/.js/.ts
actionable: +15 if executable AND not in trusted domain allowlist
risk_modifier: per-rule adjustment (0-15)
git clone https://gitlab.com/centisgood/duo-agentflow-auditor.git cd duo-agentflow-auditor
> 📖 Полное руководство по зеркалированию (3 метода, настройка CI, стратегии синхронизации): [`docs/GITLAB_MIRROR_GUIDE.md`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/docs/GITLAB_MIRROR_GUIDE.md)
### 2. Автоматическая публикация агентов и потоков
Группа хакатона обеспечивает [центральный CI-пайплайн](https://gitlab.com/gitlab-ai-hackathon/ci) через [политику безопасности](https://gitlab.com/gitlab-ai-hackathon/security-policies). Когда вы отправляете изменения в GitLab, задача `catalog-sync` **автоматически** публикует все `agents/*.yml` и `flows/*.yml` в AI Catalog — без ручной настройки или необходимости в git-тегах.
> Файл `.gitlab-ci.yml` вашего проекта переопределяется центральным пайплайном хакатона. Включённый `.gitlab-ci.yml` служит только для справки.
| # | Агент | Файл каталога | Документация промптов | Инструменты |
|---|-------|-------------|-------------|-------|
| 1 | Сканер | [`agents/scanner.yml`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/agents/scanner.yml) | [`agents/scanner.md`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/agents/scanner.md) | 8 инструментов |
| 2 | Репортер | [`agents/reporter.yml`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/agents/reporter.yml) | [`agents/reporter.md`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/agents/reporter.md) | 6 инструментов |
| 3 | Исправитель | [`agents/fixer.yml`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/agents/fixer.yml) | [`agents/fixer.md`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/agents/fixer.md) | 8 инструментов |
| 4 | Метрики | [`agents/metrics.yml`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/agents/metrics.yml) | [`agents/metrics.md`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/agents/metrics.md) | 5 инструментов |
Поток: [`flows/security-audit.yml`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/flows/security-audit.yml) — 4-агентный пайплайн с маршрутизацией Сканер → Репортер → Исправитель → Метрики.
<details>
<summary>Альтернатива: ручная настройка через интерфейс GitLab</summary>
**Агенты**: Автоматизация → Агенты → Новый агент → вставьте системный промпт из файлов `.md`
**Поток**: Автоматизация → Потоки → Новый поток → вставьте определение из [`flows/security-audit.yml`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/flows/security-audit.yml)
</details>
### 3. Включение триггеров
| Триггер | Как |
|---------|-----|
| Упоминание | Напишите `@duo-agentflow-auditor` в комментарии к любому MR |
| Назначение рецензента | Назначьте сервисную учётную запись рецензентом MR |
### 4. Попробуйте```bash
# Create test branch with vulnerable code
git checkout -b test/security-audit
cp examples/vulnerable-mr/* .
git add . && git commit -m "test: add vulnerable code for audit"
git push origin test/security-audit
# Open MR → Comment: @duo-agentflow-auditor please review this MR
Подробное описание: См.
docs/SETUP_GUIDE.md
Grade: 🚨 DANGER Recommendation: FAIL — do not merge without fixes
🚨 unsafe_script.py:55 — rm -rf (95/100) 🚨 unsafe_script.py:13 — shell=True (88/100) 🚨 unsafe_script.py:27 — eval() (85/100) ⚠️ insecure_fetch.js:41 — HTTP (62/100)
### Зеленые метрики```markdown
### 🌱 Sustainability Report
| Metric | Value |
|---------------------|---------------------|
| Tokens Used | 12,450 |
| Energy | 0.0037 kWh |
| CO₂ Footprint | 0.0014 kg |
| Efficiency | 2.4 findings/1K tok |
💡 LED bulb for 13 seconds | 🚗 Car driving 5.6 meters
duo-agentflow-auditor/ │ ├── agents/ │ ├── scanner.yml # Catalog agent — security scanner │ ├── reporter.yml # Catalog agent — report generator │ ├── fixer.yml # Catalog agent — auto-fix patches │ ├── metrics.yml # Catalog agent — green metrics │ ├── scanner.md # Detailed prompt documentation │ ├── reporter.md # Detailed prompt documentation │ ├── fixer.md # Detailed prompt documentation │ └── metrics.md # Detailed prompt documentation │ ├── flows/ │ └── security-audit.yml # Catalog flow — conditional routing pipeline │ ├── scripts/ │ ├── merge_sast_results.py # SAST result merger (bandit + semgrep + custom rules) │ └── demo.sh # E2E demo automation (glab CLI) │ ├── tests/ │ └── test_merge_sast_results.py # 76 pytest tests — scoring, grading, parsing │ ├── .gitlab/ │ └── duo/ │ └── flows/ │ └── sast-scanner.yaml # External SAST agent (CI/CD container) │ ├── rules/ │ ├── danger_rules.json # 11 high-severity detection patterns │ ├── warning_rules.json # 15 medium-severity detection patterns │ └── semgrep/ # 15 Semgrep custom rules │ ├── ai-security/ # LLM prompt injection, output exec, unsafe deser │ ├── web-security/ # SQL injection, path traversal, SSRF, open redirect, input validation │ ├── python-security/ # eval/exec, subprocess, os.system │ ├── crypto/ # Insecure random (Python + JavaScript) │ ├── secrets/ # Hardcoded credentials │ └── network/ # Insecure HTTP (with autofix) │ ├── Dockerfile # Production SAST container (python:3.11-slim) ├── requirements.txt # bandit + semgrep dependencies │ ├── examples/ │ ├── vulnerable-mr/ # Intentionally risky code (demo) │ │ ├── unsafe_script.py # shell=True, eval(), rm -rf, cred leak │ │ ├── risky_config.yaml # Prompt injection, hardcoded secrets │ │ └── insecure_fetch.js # HTTP, exec(), token exposure │ └── safe-mr/ # Secure code for contrast (demo) │ ├── safe_script.py │ ├── safe_config.yaml │ └── safe_script.js # HTTPS, execFile, env vars │ ├── docs/ │ ├── SETUP_GUIDE.md # Step-by-step setup │ ├── EXECUTION_PLAN.md # Implementation plan │ ├── WOW_MOMENTS.md # Visual impact & demo choreography │ ├── DEVPOST_SUBMISSION.md # Devpost submission draft │ └── GITLAB_MIRROR_GUIDE.md # GitHub → GitLab mirroring │ ├── .gitlab-ci.yml # CI — catalog-sync + validation ├── AGENTS.md # Project-level agent customization ├── IMPLEMENTATION.md # Architecture & design document ├── CONTRIBUTING.md # Contribution guidelines ├── LICENSE # MIT License └── README.md # This file
---
## Технологии
| Компонент | Технология |
|:----------|:-----------|
| **Платформа** | Платформа GitLab Duo Agent (GA в GitLab 18.8) |
| **ИИ-модель** | Anthropic Claude Sonnet |
| **Схема потока** | Flow Registry v1 (`ambient` environment) |
| **Триггеры** | Упоминание, Назначение, Назначение рецензента |
| **Инструменты агентов** | 30+ встроенных инструментов GitLab в 4 агентах (включая связывание уязвимостей) |
| **Обнаружение** | 41 правило: 26 regex + 15 Semgrep (безопасность ИИ, веб-безопасность, криптография, секреты, сеть) |
| **Внешний SAST** | Docker-контейнеры bandit + semgrep с конвейером объединения результатов |
| **Тестирование** | 76 pytest-тестов, охватывающих оценку, ранжирование и парсинг |
| **Вывод** | Комментарии MR в Markdown, задачи GitLab, MR с исправлениями |
---
## Документация
| Документ | Описание |
|:---------|:-----------|
| [`IMPLEMENTATION.md`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/IMPLEMENTATION.md) | Архитектура, формула оценки, демо-сценарий, согласование с критериями оценки |
| [`docs/SETUP_GUIDE.md`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/docs/SETUP_GUIDE.md) | Пошаговое руководство из 7 шагов с устранением неполадок |
| [`docs/EXECUTION_PLAN.md`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/docs/EXECUTION_PLAN.md) | План из 6 фаз с ~35 детальными задачами |
| [`docs/WOW_MOMENTS.md`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/docs/WOW_MOMENTS.md) | Дизайн визуального воздействия и хореография демонстрации |
| [`docs/DEVPOST_SUBMISSION.md`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/docs/DEVPOST_SUBMISSION.md) | Текст формы отправки для копирования |
| [`AGENTS.md`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/AGENTS.md) | Настройка сканирования на уровне проекта |
| [`docs/GITLAB_MIRROR_GUIDE.md`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/docs/GITLAB_MIRROR_GUIDE.md) | Зеркалирование GitHub → GitLab (3 метода) |
| [`CONTRIBUTING.md`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/CONTRIBUTING.md) | Как внести вклад |
---
## Тестирование```bash
# Run the full test suite (76 tests)
python -m pytest tests/ -v
# Run with coverage
python -m pytest tests/ --cov=scripts --cov-report=term-missing
Тесты охватывают: загрузку JSON, разбор правил, нормализацию серьезности/категории, формулу расчета риска, классификацию оценок, разбор вывода bandit/semgrep, дедупликацию находок, и точку входа CLI.
scripts/demo.sh
scripts/demo.sh --gitlab-remote origin
scripts/demo.sh --cleanup
Скрипт демонстрации создаёт тестовый MR с уязвимым кодом, запускает аудитор через `@mention` и опрашивает результаты.
---
## Вклад
См. [`CONTRIBUTING.md`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/CONTRIBUTING.md) для получения рекомендаций.
**Краткое описание:**
1. Форкните репозиторий
2. Создайте ветку для функции (`git checkout -b feature/amazing`)
3. Зафиксируйте изменения (`git commit -m 'feat: add amazing feature'`)
4. Отправьте в ветку (`git push origin feature/amazing`)
5. Откройте запрос на слияние
---
## Парадокс ИИ — почему это важно
<div align="center">
| Без AgentFlow Auditor | С AgentFlow Auditor |
|:----------------------|:-------------------|
| MR ждёт рецензию 2+ дня | **45 секунд** до полного аудита |
| SAST пропускает риски, специфичные для ИИ | **41 правило**, включая 3 ИИ-специфичных + 7 угроз веб-безопасности |
| Нет предложений по исправлению | **Исправления с оценкой уверенности** (ВЫСОКАЯ/СРЕДНЯЯ/НИЗКАЯ) |
| SAFE-сканы тратят токены фиксера | **Условная маршрутизация** пропускает фиксер |
| Нет отслеживания со временем | **Обучение между MR** + состояние команды |
| Нет осведомлённости об энергии | **Зелёные метрики** при каждом сканировании |
</div>
---
## Лицензия
Этот проект лицензирован в соответствии с [лицензией MIT](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/LICENSE).
---
<div align="center">
**Один триггер. Четыре агента. Ноль слепых зон ИИ.**
Создано с помощью [GitLab Duo Agent Platform](https://docs.gitlab.com/user/duo_agent_platform/) и [Anthropic Claude](https://www.anthropic.com/)
</div>
| Проблема | Влияние |
|---|
| Проверки безопасности блокируют MR на часы или дни | 7 часов/неделю теряет каждый член команды |
| ИИ усложняет управление соответствием требованиям | 70% команд сообщают об этом |
| Проблемы соответствия обнаружены после развертывания | 76% организаций |
| Традиционные SAST-инструменты пропускают риски, специфичные для ИИ | Инъекции промптов, выполнение вывода LLM, небезопасная десериализация ML |
| 40-62% кода, созданного ИИ, содержит уязвимости | Ни один существующий инструмент не обнаруживает угрозы, специфичные для ИИ |
| Оценка | Условие | Действие |
|---|
| 🚨 ОПАСНОСТЬ | max_risk >= 90 OR high_risk_findings >= 3 | Заблокировать слияние + создать issue |
| ⚠️ ПРЕДУПРЕЖДЕНИЕ | max_risk >= 70 OR high_risk_findings >= 1 | Проверить перед слиянием |
| ✅ БЕЗОПАСНО | Нет значимых сигналов риска | Можно безопасно сливать |
| Risk | File | Findings | Max Score |
|---|
| 🟥🟥🟥🟥🟥 | unsafe_script.py | 5 | 95 |
| 🟥🟥🟥🟧⬜ | risky_config.yaml | 3 | 78 |
| 🟧🟧⬜⬜⬜ | insecure_fetch.js | 2 | 62 |