AI-система обнаружения уязвимостей (SAST)
Традиционный SAST работает на правилах и AST-паттернах. Он хорошо ловит SQL injection и XSS по классическим шаблонам, но пропускает логические уязвимости, race conditions, сложные taint propagation пути через несколько функций. AI-powered SAST понимает контекст кода — не только «есть ли конкатенация строки в SQL-запросе», но и «доходит ли пользовательский input до этой точки».
Что ловит AI-SAST лучше традиционных инструментов
Taint analysis через граф. Пользовательский input → трансформации → потенциально опасные функции. Традиционный SAST теряет след через несколько вызовов функций или при передаче через очереди. ML-модель на code property graph (CPG) отслеживает data flow через весь codebase.
Логические уязвимости. Некорректная проверка прав доступа, race condition в многопоточном коде, бизнес-логические ошибки (integer overflow при расчёте скидок, уязвимости в реализации крипто). Паттерно-матчинг здесь бессилен.
Контекстно-зависимые уязвимости. Одна и та же функция может быть безопасной в одном контексте и уязвимой в другом. LLM понимает семантику кода, а не только синтаксис.
Снижение false positives. Классический SAST на крупном проекте даёт тысячи предупреждений, 70–90% из которых — false positives. AI с пониманием контекста снижает FPR до 20–40%.
Технический подход
Code Property Graph (CPG). Joern строит CPG: AST + CFG (control flow graph) + PDG (program dependence graph) в одном представлении. GNN на CPG — это SOTA подход для vulnerability detection.
LLM-based анализ. GPT-4 / Claude с кодом в контексте — для объяснения найденных уязвимостей и оценки exploitability. Модель не только находит, но и объясняет: «здесь SQL injection потому что переменная user_id из HTTP-параметра конкатенируется без санитизации, вот proof-of-concept эксплоит».
Fine-tuned модели. CodeBERT или StarCoder fine-tuned на датасетах уязвимостей (SARD, CVEfixes, BigVul). Классификация: уязвимый/безопасный + тип уязвимости. Лучше работают для конкретных языков.
from transformers import AutoTokenizer, AutoModelForSequenceClassification
# Fine-tuned CodeBERT для детекции уязвимостей
tokenizer = AutoTokenizer.from_pretrained("microsoft/codebert-base")
model = AutoModelForSequenceClassification.from_pretrained(
"vuln-detector-codebert-finetuned",
num_labels=len(VULN_TYPES) # CWE категории
)
def analyze_function(code_snippet: str) -> VulnAnalysis:
inputs = tokenizer(code_snippet, return_tensors="pt",
max_length=512, truncation=True)
outputs = model(**inputs)
probs = torch.softmax(outputs.logits, dim=-1)
return VulnAnalysis(
vuln_type=VULN_TYPES[probs.argmax()],
confidence=probs.max().item()
)
Интеграция в CI/CD
SAST запускается автоматически при каждом PR. Критически важно настроить правильные пороги:
- High severity + high confidence: блокируем merge автоматически
- High severity + low confidence: обязательный security review без автоблокировки
- Medium severity: комментарий в PR, не блокируем
- Low severity: периодический отчёт, не в PR
Время сканирования на реальном проекте: 100K строк Python → 3–7 минут на AI-SAST vs. 30–60 секунд на традиционный. Компромисс: запускаем быстрый rule-based на каждый commit, AI-SAST — на PR перед merge.
Практический кейс
Финтех-стартап, 180K строк Python/Go, 4 разработчика. Традиционный Bandit + Semgrep: 340 предупреждений за неделю, 80% false positives. Команда перестала их читать.
После внедрения AI-SAST (Semgrep AI + LLM-объяснения):
- 340 → 47 prioritized findings с детальным объяснением и CVSS score
- 3 критические уязвимости, пропущенные традиционным SAST: SQL injection через ORM (тонкий случай с динамическим field name), insecure deserialization в API endpoint, race condition в обработке платежей
- Время на triage одного finding снизилось с 15 до 4 минут — объяснение уже готово
- Security debt снизился за 3 месяца: исправили все Critical и High находки
Самая интересная находка: race condition в биллинге — два одновременных запроса могли привести к двойному списанию при определённом timing. Традиционный SAST это не поймал бы никогда.
Ограничения
AI-SAST не заменяет penetration testing и manual code review для критических компонентов. LLM может ошибаться в сложных случаях. Правильное применение: автоматический первый уровень фильтрации + приоритизация для человека, а не замена эксперта.
Сроки: 2–4 недели для интеграции AI-SAST в CI/CD, 2–3 месяца для полного решения с custom правилами и обучением на кодовой базе клиента.







