
# Когда сканер видит контекст: как Metis меняет поиск уязвимостей в коде
Представьте две ситуации. В первой традиционный SAST-инструмент проверяет функцию и сообщает: «Потенциальная утечка памяти». Разработчик открывает код, видит, что память освобождается двумя строками ниже в другом файле, и отклоняет алерт как ложный. Во второй система анализирует ту же функцию, но сначала восстанавливает её место в архитектуре проекта, читает документацию, проверяет, как этот код вызывается из других модулей, и выдаёт: «Здесь действительно утечка, потому что обработчик исключений в caller не гарантирует вызов cleanup, а вот этот путь выполнения его пропускает». Разница не в магии, а в том, что второй подход видит граф, а не строки.
Arm открыла Metis как раз в момент, когда эта проблема стала особенно заметной. Традиционный SAST работает на основе правил и сигнатур: он видит паттерны, но не контекст. Результат — либо пропущенные сложные уязвимости, которые требуют понимания взаимодействия компонентов, либо поток ложных срабатываний, из-за которых разработчики перестают доверять инструменту. Metis пытается решить эту проблему не через более сложные правила, а через другой принцип работы: контекстное рассуждение о коде с помощью LLM и RAG.
## Почему традиционный SAST упирается в потолок
Статический анализ существует давно и работает по простому принципу: найти паттерны, которые обычно означают проблему. Неинициализированная переменная, использование функции без проверки return-кода, буфер без проверки границ — всё это можно описать правилом или сигнатурой. SAST-инструменты вроде Checkmarx, SonarQube или Semgrep хорошо ловят такие проблемы на уровне отдельной функции или файла.
Но реальные уязвимости редко живут в одном месте. Проблема может возникнуть, когда функция A вызывает функцию B в одном модуле, B передаёт данные в C в другом модуле, а C не проверяет, что B иногда возвращает NULL. Традиционный SAST может заметить недостаток проверки в C, но не поймёт, что B действительно может вернуть NULL в этом контексте. Результат: либо алерт, который разработчик отклоняет как false positive, либо пропуск реальной уязвимости.
Вторая проблема — масштаб. Большие кодовые базы генерируют сотни алертов. Если значительная часть из них ложная, команда тратит дни и недели на triage, а доверие к инструменту падает. Усталость от ревью — это не просто неудобство, а архитектурная проблема: когда шума слишком много, даже реальные проблемы теряются в массе.
## Архитектура: RAG, граф зависимостей и валидация
Metis строится на трёх опорах. Первая — retrieval-augmented generation, или RAG. Вместо того чтобы просто передать LLM фрагмент кода, система сначала индексирует весь репозиторий: исходный код, build-конфиги и документацию. Когда модель анализирует функцию, RAG подтягивает релевантный контекст — определения используемых функций, комментарии, примеры вызовов. Модель видит не изолированный код, а его место в системе.
Вторая опора — reasoning о зависимостях. Metis не просто классифицирует код по правилам. Он использует LLM, способный к семантическому пониманию и рассуждению. Модель может проследить цепочку вызовов, понять, при каких условиях переменная может быть NULL, проанализировать обработку ошибок на нескольких уровнях абстракции. Это не линейное сканирование — это анализ связей между компонентами.
Третья опора — валидация. Metis не просто выдаёт находку. Он проверяет её: собирает доказательства, строит детальный граф кода, оценивает вероятность. Система может даже триажировать результаты от других SAST-инструментов, помогая отличить реальные уязвимости от шума. Это важно, потому что позволяет использовать Metis не как замену, а как дополнительный слой проверки.
| Аспект | Традиционный SAST | Agentic AI security framework |
| — | — | — |
| Принцип работы | Правила, сигнатуры, pattern matching | Семантическое рассуждение с контекстом |
| Область видимости | Функция, файл, иногда несколько файлов | Весь репозиторий, зависимости, документация |
| Источник контекста | Жёсткие правила | RAG: код, документация, build-конфиги |
| Типы находок | Простые, очевидные проблемы | Сложные, контекстно-зависимые уязвимости |
| Ложные срабатывания | Высокие | Ниже благодаря валидации и рассуждению |
| Объяснение находки | Название правила, строка кода | Подробное объяснение на естественном языке |
| Место в процессе | Первичный скрининг | Дополнение, triage, валидация других инструментов |
## Как Metis проходит путь от кода к объяснённой находке
«`mermaid
graph LR
A[«Репозиторий
код + docs + config»] —>|индексирование| B[«Векторная база
RAG-индекс»]
B —>|контекст| C[«LLM
reasoning»]
C —>|гипотеза| D[«Граф зависимостей
анализ путей»]
D —>|доказательства| E[«Валидация
проверка находки»]
E —>|confidence| F[«Объяснение
естественный язык»]
F —> G[«Разработчик
быстрое решение»]
«`
Процесс начинается с индексирования. Metis сканирует весь репозиторий, разбивает код и документацию на чанки и встраивает их в векторное пространство. Это позволяет позже быстро найти релевантный контекст для любого фрагмента кода.
Когда начинается анализ — например, `review_code` или `review_file` — система передаёт LLM фрагмент кода вместе с контекстом, подтянутым RAG. LLM рассуждает: может ли здесь быть уязвимость? Какие условия должны быть выполнены? Какие функции вызываются?
Затем Metis строит граф зависимостей и проверяет гипотезу. Может ли эта переменная действительно быть NULL в этом месте? Существует ли путь выполнения, при котором происходит утечка памяти? Система собирает доказательства: цепочки вызовов, условия, обработчики исключений.
Наконец, если находка валидирована, Metis выдаёт объяснение на естественном языке: не просто «Buffer overflow at line 42», а развёрнутое описание того, почему конкретный путь выполнения опасен и что именно в коде это подтверждает.
## Где это работает, а где нет
Согласно внутренним бенчмаркам Arm, Metis показывает до 10× более высокий true positive rate и примерно на 50% меньше false positives по сравнению с традиционными SAST-инструментами. Но это именно внутренние результаты компании, а не независимая оценка.
Metis особенно интересен для сложных и больших кодовых баз, где уязвимость зависит от связей между компонентами, а не от одной строки кода. Он поддерживает C, C++, Python, Go, TypeScript, Rust и другие языки. При этом эффективность такого подхода может зависеть от качества контекста, индекса и настройки модели.
Есть и сценарии, где подход может быть менее устойчивым. Если проект слабо документирован, имеет нестандартную архитектуру или плохо поддерживаемый индекс, RAG может не подтянуть нужный контекст. Простые, очевидные уязвимости традиционный SAST иногда находит быстрее. И хотя Metis валидирует находки, это не означает автоматическое устранение всех спорных результатов: triage всё равно остаётся частью процесса.
## Практическое развёртывание и расширяемость
Metis открыт под Apache 2.0 и рассчитан на гибкость. Его можно использовать с любым OpenAI-compatible LLM, а также разворачивать локально через Ollama или vLLM. Для хранения индекса поддерживаются ChromaDB по умолчанию и PostgreSQL с pgvector для более масштабных сценариев и multi-project поддержки.
Архитектура плагинов позволяет расширять поддержку языков, моделей и кастомных промптов. В проекте можно использовать `.metis.md`, чтобы добавить собственные требования к security review, не меняя базовую конфигурацию.
Внутри Arm Metis уже работает более чем на 130 проектах. Это не просто proof of concept, а инструмент, который уже встроен в рабочий процесс компании.
## Главная ценность: контекст вместо магии
Вокруг ИИ в security легко возникает ореол магии: будто нейросеть просто «умнее» и поэтому видит больше. На деле ценность Metis в другом. Это не замена разработчику и не автоматический фиксер. Это слой контекстной проверки и валидации, который позволяет команде тратить меньше времени на шум и больше — на реальные риски.
Главная проблема, которую решает такая система, — не «найти больше уязвимостей», а «найти реальные уязвимости и не утонуть в ложных срабатываниях». Когда инструмент показывает путь выполнения, объясняет, почему находка важна, и подкрепляет выводы контекстом из репозитория, ему проще доверять. А когда разработчик тратит минуты на понимание и исправление вместо часов на ручную проверку, выигрывает уже весь процесс.
Именно поэтому Metis интересен не как очередной ИИ-сканер, а как попытка переосмыслить саму модель security tooling: от правил к рассуждению, от сканирования к пониманию, от шума к сигналу.
## Источники
1. Arm Open-Sources Metis, an AI Security Framework Outperforming Traditional SAST Tools — https://www.infoq.com/news/2026/05/arm-metis-agentic-security/?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global
2. GitHub — arm/metis: Metis is an open-source, AI-driven tool for deep security code review — https://github.com/arm/metis
3. Agentic AI-powered Arm Metis advances security vulnerability discovery in software — https://newsroom.arm.com/blog/arm-metis-agentic-ai-security


