Trail of Bits Security Skills: тройной удар по уязвимостям кода

10.03.2026обновлено 6 апр

Знакомьтесь с тремя скиллами от 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-cli

CodeQL: межпроцедурный анализ

Это тот самый инструмент, который 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"

Скилл автоматически:

  1. Определяет язык и билд-систему
  2. Создает базу данных (медленно, но качественно)
  3. Генерирует data extension модели для кастомных API
  4. Запускает все доступные ruleset'ы (official + Trail of Bits + community)
  5. Фильтрует результаты по важности

Результат: 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 scanner

SARIF-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.sarif

Python обработка:

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 автоматизированного аудита:

  1. CodeQL находит то, что спрятано глубоко
  2. Semgrep покрывает широко и быстро
  3. SARIF-parsing приводит все в порядок

Вместе они превращают Claude Code в security-focused агента, который работает как команда Trail of Bits, но 24/7 и за ваши деньги.

GitHub: https://github.com/trailofbits/skills


*Trail of Bits: меняем мир, по одной уязвимости за раз.* 🧪

TG

> Пока нет комментариев