Trail of Bits Security Skills: тройной удар по уязвимостям кода
Знакомьтесь с тремя скиллами от Trail of Bits, которые превратят вашего Claude Code агента в настоящую машину для поиска багов. CodeQL, Semgrep и SARIF-parsing — это not just инструменты, а целая экосистема для автоматического аудита безопасности.
Что это за зверь
Trail of Bits — топовая компания по аудиту безопасности (они проверяли Ethereum, Signal, всякие DeFi протоколы). И теперь они выпустили три скилла для Claude Code, которые автоматизируют их процессы поиска уязвимостей.
Состав банды:
- CodeQL** — глубокий анализ с отслеживанием потоков данных
- Semgrep** — быстрый поиск паттернов с параллельным сканированием
- SARIF-parsing** — обработка результатов всех статических анализаторов
Установка и настройка
Скиллы находятся в:
- /skills/tob-codeql/
- /skills/tob-semgrep/
- /skills/tob-sarif/
Зависимости:
# CodeQL (сложно, но мощно)
gh extension install github/gh-codeql
codeql --version
# Semgrep (просто и быстро)
pip install semgrep
# или
brew install semgrep
# SARIF-парсинг
pip install sarif-tools pysarif
npm install -g ajv-cliCodeQL: межпроцедурный анализ
Это тот самый инструмент, который GitHub использует для Security Advisories. Умеет отслеживать, как данные от пользователя попадают в SQL-запросы через цепочку из 20 функций.
Что умеет:
- Построить базу данных из кодовой базы (AST + CFG + data flow)
- Найти SQL injection, XSS, command injection через сложные цепочки вызовов
- Работает с Python, JS/TS, Go, Java, C/C++, C#, Ruby, Swift
Пример использования:
# Через агента просто:
"Scan this codebase for vulnerabilities with CodeQL"
# Или конкретно:
"Build CodeQL database for Python and run security analysis"Скилл автоматически:
- Определяет язык и билд-систему
- Создает базу данных (медленно, но качественно)
- Генерирует data extension модели для кастомных API
- Запускает все доступные ruleset'ы (official + Trail of Bits + community)
- Фильтрует результаты по важности
Результат: SARIF-файл с межпроцедурными уязвимостями, которые не найдет простой grep.
Semgrep: параллельное сканирование
Если CodeQL — это снайперская винтовка, то Semgrep — пулемет. Быстрый, точный, умеет находить известные паттерны багов.
Фишки:
- Запускает сканеры параллельно через Task subagents
- Автоматически детектит Pro-версию (cross-file taint tracking)
- Использует третьесторонние ruleset'ы (Trail of Bits, 0xdea, Decurity)
- Обязательно включает --metrics=off (приватность)
Два режима:
- Run all** — все ruleset'ы, все уровни серьезности
- Important only** — только security, medium-high confidence
Пример workflow:
# Агент сам:
"Security audit this codebase with Semgrep"
# Результат:
# ✅ Python detected (248 files)
# ✅ Semgrep Pro available
# ✅ Spawning 4 parallel scanners...
# ✅ Merged 47 findings into results.sarifАрхитектура:
MAIN AGENT
├── Detect languages + Pro
├── Select rulesets
├── Get approval ⛔ HARD GATE
├── Spawn parallel Tasks
└── Merge SARIF results
SCAN TASKS (parallel)
├── Python scanner
├── JS/TS scanner
├── Docker scanner
└── Generic scannerSARIF-parsing: агрегация результатов
После того, как CodeQL и Semgrep нашли баги, нужно их обработать. SARIF-parsing умеет:
Базовые операции:
- Парсить SARIF файлы от любых инструментов
- Дедуплицировать находки по отпечаткам
- Агрегировать результаты нескольких сканов
- Конвертировать в CSV, HTML, JSON
Продвинутые фишки:
- Сравнивать baseline vs current (найти новые баги)
- Фильтровать по severity/confidence
- Нормализовать пути (разные инструменты — разные форматы)
- Стримить большие файлы (100MB+)
Quick jq queries:
# Сколько всего багов?
jq '[.runs[].results[]] | length' results.sarif
# Только errors
jq '.runs[].results[] | select(.level == "error")' results.sarif
# Группировка по правилам
jq '[.runs[].results[]] | group_by(.ruleId) | map({rule: .[0].ruleId, count: length})' results.sarifPython обработка:
from sarif import loader
# Загрузить несколько файлов
sarif_set = loader.load_sarif_files(["codeql.sarif", "semgrep.sarif"])
# Дедуплицировать
unique_findings = deduplicate_by_fingerprint(sarif_set)
# Приоритизировать
errors = [f for f in findings if f.level == "error"]Реальный пример: аудит Django-приложения
Покажу, как три скилла работают в связке:
Шаг 1: Быстрая разведка Semgrep'ом
"Scan this Django app for security issues with Semgrep"
Результат: 12 findings
- SQL injection in views.py:45 (django-sql-injection)
- Hardcoded secret in settings.py:15 (hardcoded-password)
- XSS в template без |escapeШаг 2: Глубокий анализ CodeQL'ом
"Run CodeQL analysis on the same codebase"
Результат: 3 findings (но серьезных!)
- SQL injection через ORM с кастомным raw() wrapper
- Command injection в utils.py через subprocess
- Path traversal в file upload handlerШаг 3: Агрегация SARIF-parsing'ом
"Aggregate and deduplicate findings from both scans"
Результат: 14 unique findings (1 дубль)
- Priority: 6 high, 5 medium, 3 low
- Categories: injection (8), secrets (2), XSS (2), misc (2)Продвинутые техники
Кастомные data extensions (CodeQL):
Если у вас кастомная ORM или API wrapper, CodeQL не знает, что MyDB.execute() может быть уязвимой. Скилл автоматически генерирует extension модели:
extensions:
- addsTo:
pack: codeql/python-all
extensible: sinkModel
data:
- ["myapp.database", "MyDB", True, "execute", "", "", "Argument[0]", "sql-injection", "manual"]Parallel Task orchestration (Semgrep):
Скилл не запускает сканы последовательно. Он спавнит Task subagents параллельно:
# Spawns all at once:
Task("scan-python", subagent_type="semgrep-scanner")
Task("scan-javascript", subagent_type="semgrep-scanner")
Task("scan-docker", subagent_type="semgrep-scanner")Fingerprint-based deduplication (SARIF):
Разные инструменты находят один и тот же баг. SARIF-parsing дедуплицирует по stable fingerprints:
def compute_fingerprint(result):
return hash(result.ruleId + result.file + result.message[:100])Когда использовать что
CodeQL — когда:
- Нужен глубокий анализ с data flow tracking
- Есть время на построение базы данных (медленно)
- Ищете сложные межпроцедурные уязвимости
- Compiled languages (C++, Java) в проекте
Semgrep — когда:
- Нужен быстрый скан на известные паттерны
- CI/CD pipeline требует скорости
- Interpreted languages (Python, JS, PHP)
- Хотите покрыть много languages сразу
SARIF-parsing — когда:
- Есть результаты от нескольких инструментов
- Нужна дедупликация и приоритизация
- Интеграция в CI/CD с baseline comparison
- Конвертация в другие форматы
Tips & Tricks
Обязательно читать quality assessment:
CodeQL может построить базу, но извлечь ноль строк кода. Скилл автоматически проверяет:
- Baseline LoC > 0
- Extraction errors < 5%
- File count соответствует ожиданиям
Не полагайтесь на default suites:
Каждый pack имеет defaultSuiteFile, который может применить скрытые фильтры. Скиллы всегда генерируют explicit .qls suite files.
Третьи party rulesets критически важны:
Trail of Bits, 0xdea, Decurity находят баги, которых нет в официальных registry. Скиллы автоматически включают их.
Zero findings = повод для расследования:
Ноль багов может означать:
- Плохое качество базы данных
- Отсутствующие модели
- Неправильные query packs
- Скрытая фильтрация в suite
Заключение
Trail of Bits Security Skills — это не просто tools, а complete methodology автоматизированного аудита:
- CodeQL находит то, что спрятано глубоко
- Semgrep покрывает широко и быстро
- SARIF-parsing приводит все в порядок
Вместе они превращают Claude Code в security-focused агента, который работает как команда Trail of Bits, но 24/7 и за ваши деньги.
GitHub: https://github.com/trailofbits/skills
*Trail of Bits: меняем мир, по одной уязвимости за раз.* 🧪
> Пока нет комментариев