
Мультиплатформенный инструмент для обнаружения уязвимостей CI/CD и автоматизации атак, предназначенный для выявления уязвимостей в конфигурациях пайплайнов.
Trajan сканирует конвейеры CI/CD на уязвимости безопасности, которые злоумышленники используют для компрометации цепочек поставок ПО. Он поддерживает GitHub Actions, GitLab CI, Azure DevOps, Jenkins и JFrog.
Trajan анализирует YAML-файлы рабочих процессов, строит графы зависимостей, запускает плагины обнаружения и проверяет эксплуатацию через встроенные возможности атаки.
[!NOTE] Trajan находится в активной разработке. Некоторые функции могут быть неполными, возможны шероховатости. Если вы столкнулись с проблемами, пожалуйста, откройте их.
Предварительно собранные бинарные файлы доступны на странице релизов.
go install github.com/praetorian-inc/trajan/cmd/trajan@latest
Или соберите из исходников:
git clone https://github.com/praetorian-inc/trajan.git
cd trajan && make build
repo (для частных репозиториев) или public_repo (только для публичных репозиториев)pkg/lib)Trajan может быть встроен как библиотека Go для программного сканирования безопасности CI/CD. Пакет pkg/lib предоставляет публичный SDK, который объединяет внутренний реестр платформ Trajan, движок обнаружения и сканер в единый высокоуровневый API.
import "github.com/praetorian-inc/trajan/pkg/lib"
result, err := lib.Scan(ctx, lib.ScanConfig{
Platform: "github",
Token: os.Getenv("GH_TOKEN"),
Org: "myorg",
Repo: "myrepo",
Concurrency: 10,
Timeout: 5 * time.Minute,
})
if err != nil {
log.Fatal(err)
}
for _, f := range result.Findings {
fmt.Printf("[%s] %s in %s: %s\n", f.Severity, f.Type, f.WorkflowFile, f.Evidence)
}
type ScanConfig struct {
Platform string // Платформа CI/CD (обязательно)
Token string // Токен аутентификации API
BaseURL string // Пользовательский базовый URL для самостоятельных экземпляров
Org string // Организация/владелец
Repo string // Имя репозитория (пустое = сканировать все репозитории организации)
Concurrency int // Параллельные рабочие процессы обнаружения (по умолчанию: 10)
Timeout time.Duration // Максимальная длительность сканирования (по умолчанию: 5 мин)
LocalPath string // Локальный путь файловой системы (файл или каталог) для офлайн-сканирования
}
type ScanResult struct {
Findings []detections.Finding // Обнаруженные уязвимости безопасности
Workflows []platforms.Workflow // Обнаруженные файлы рабочих процессов CI/CD
Errors []error // Нефатальные ошибки во время сканирования
SkippedDetections []string // Имена обнаружений, пропущенных в режиме LocalPath (только API); всегда пусто в режиме API
}
SDK используется платформой управления поверхностью атаки Chariot для выполнения сканирования безопасности CI/CD как возможности:
import trajanlib "github.com/praetorian-inc/trajan/pkg/lib"
result, err := trajanlib.Scan(ctx, trajanlib.ScanConfig{
Platform: platformName,
Token: token,
Org: repo.Org,
Repo: repo.Name,
})
// Преобразование result.Findings → capmodel.Risk emissions
# Сканирование репозитория GitHub
export GH_TOKEN=ghp_your_token
trajan github scan --repo owner/repo
# Сканирование организации GitHub
trajan github scan --org myorg --concurrency 20
# Сканирование проектов GitLab
export GITLAB_TOKEN=glpat_your_token
trajan gitlab scan --group mygroup
# Сканирование Azure DevOps
export AZURE_DEVOPS_PAT=your_pat
trajan ado scan --org myorg --repo myproject/myrepo
# Офлайн-сканирование: сканирование локальных файлов рабочих процессов без доступа к API
trajan github scan --path ./my-repo
trajan github scan --path ./.github/workflows/ci.yml
# Вывод в JSON
trajan github scan --repo owner/repo -o json > results.json
Подробное использование, объяснение обнаружений и примеры атак см. в Wiki.
Trajan также компилируется в WebAssembly-бинарник, который работает полностью в браузере как единый HTML-файл. Он использует тот же движок обнаружения, плагины атак и логику перечисления, что и CLI, только скомпилированный в WASM. Веб-версия Trajan позволяет легко доставлять сканер в целевые среды в рамках оценки.
make wasm # собрать browser/trajan.wasm
make wasm-dist # собрать автономный trajan-standalone.html
graph TD
subgraph CLI
CMD[Cobra Commands]
end
subgraph Platforms
GH[GitHub]
GL[GitLab]
ADO[Azure DevOps]
JK[Jenkins]
JF[JFrog]
end
CMD --> GH & GL & ADO & JK & JF
subgraph SF[Scan Flow]
API[Platform API] --> |fetch workflows| YAML[Workflow YAML]
YAML --> P
subgraph P[Parser]
direction LR
GHP[GitHub] ~~~ GLP[GitLab] ~~~ ADP[Azure] ~~~ JKP[Jenkins]
end
P --> NW[Normalized Workflow]
NW --> GB[Graph Builder]
GB --> Graph[Workflow → Job → Step Graph]
end
subgraph AE[Analysis Engine]
direction LR
TT[Taint Tracker] --> Tagged[Tagged Graph]
Tagged --> DP[Detection Plugins]
DP --> GA[Gate Analysis]
GA --> Findings
end
subgraph AF[Attack Flow]
direction LR
AP[Attack Plugins] --> |artifacts| Session[Session Tracker]
Session --> Cleanup
end
Graph --> AE
AE --> AF
В активной разработке поддержка дополнительных платформ CI/CD:
Руководство по разработке, созданию плагинов и структуре проекта см. в CONTRIBUTING.md.
Основано на исследованиях из Gato, Glato, Gato-X от Аднана Хана и GitHub Security Lab.
Apache 2.0. См. LICENSE.
| Функция | Описание |
|---|
lib.Scan(ctx, cfg) | Полное сканирование: инициализация платформы → обнаружение рабочих процессов → выполнение обнаружения |
lib.GetPlatform(name) | Получить адаптер платформы по имени (github, gitlab, azuredevops, bitbucket, jenkins, jfrog) |
lib.ListPlatforms() | Список всех зарегистрированных имён платформ |
lib.GetDetections(platform) | Получить плагины обнаружения для конкретной платформы |
lib.GetDetectionsForPlatform(platform) | Получить платформо-специфичные и кроссплатформенные обнаружения |
lib.ListDetectionPlatforms() | Список платформ с зарегистрированными обнаружениями |
| Платформа | Обнаружения | Атаки | Перечисление |
|---|
| GitHub Actions | 11 | 9 | токены, репозитории, секреты |
| GitLab CI | 8 | 3 | токены, проекты, группы, секреты, раннеры, защита веток |
| Azure DevOps | 6 | 9 | токены, проекты, репозитории, конвейеры, подключения, пулы агентов, пользователи, группы и другое |
| Jenkins | 7 | 3 | доступ, задания, узлы, плагины |
| JFrog | только сканирование | - | - |