
Ein plattformübergreifendes CI/CD-Schwachstellenerkennungs- und Angriffsautomatisierungswerkzeug zur Identifizierung von Sicherheitsschwächen in Pipeline-Konfigurationen.
Trajan scannt CI/CD-Pipelines auf Sicherheitslücken, die Angreifer nutzen, um Software-Lieferketten zu kompromittieren. Es unterstützt GitHub Actions, GitLab CI, Azure DevOps, Jenkins und JFrog.
Trajan parst Workflow-YAML-Dateien, erstellt Abhängigkeitsgraphen, führt Erkennungs-Plugins aus und validiert die Ausnutzbarkeit durch integrierte Angriffsfunktionen.
[!NOTE] Trajan befindet sich in aktiver Entwicklung. Manche Funktionen sind möglicherweise unvollständig und es können Kanten auftreten. Falls du auf Probleme stößt, öffne bitte ein Issue.
Vorkompilierte Binärdateien sind auf der verfügbar.
go install github.com/praetorian-inc/trajan/cmd/trajan@latest
Oder aus dem Quellcode bauen:
git clone https://github.com/praetorian-inc/trajan.git
cd trajan && make build
repo-Bereich (für private Repositorys) oder public_repo-Bereich (nur für öffentliche Repositorys)pkg/lib)Trajan kann als Go-Bibliothek eingebettet werden, um programmatische CI/CD-Sicherheitsscans durchzuführen. Das pkg/lib-Paket bietet ein öffentliches SDK, das das interne Plattform-Register, die Erkennungs-Engine und den Scanner in eine einzige High-Level-API kapselt.
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)
}
| Funktion | Beschreibung |
|---|---|
lib.Scan(ctx, cfg) | Vollständiger Scan: Plattforminitialisierung → Workflow-Erkennung → Ausführung der Erkennung |
lib.GetPlatform(name) | Einen Plattform-Adapter nach Name abrufen (github, gitlab, azuredevops, bitbucket, jenkins, jfrog) |
lib.ListPlatforms() | Alle registrierten Plattformnamen auflisten |
lib.GetDetections(platform) | Erkennungs-Plugins für eine bestimmte Plattform abrufen |
lib.GetDetectionsForPlatform(platform) | Plattformspezifische + plattformübergreifende Erkennungen abrufen |
lib.ListDetectionPlatforms() | Plattformen mit registrierten Erkennungen auflisten |
type ScanConfig struct {
Platform string // CI/CD-Plattform (erforderlich)
Token string // API-Authentifizierungstoken
BaseURL string // Benutzerdefinierte Basis-URL für selbst gehostete Instanzen
Org string // Organisation/Eigentümername
Repo string // Repository-Name (leer = alle Org-Repos scannen)
Concurrency int // Parallele Erkennungs-Worker (Standard: 10)
Timeout time.Duration // Maximale Scandauer (Standard: 5m)
LocalPath string // Lokaler Dateisystempfad (Datei oder Verzeichnis) für Offline-Scan
}
type ScanResult struct {
Findings []detections.Finding // Erkannte Sicherheitslücken
Workflows []platforms.Workflow // Erkannte CI/CD-Workflow-Dateien
Errors []error // Nicht-fatale Fehler während des Scans
SkippedDetections []string // Namen der im LocalPath-Modus übersprungenen Erkennungen (nur API); im API-Modus immer leer
}
Das SDK wird von der Chariot-Plattform für das Angriffsflächenmanagement verwendet, um CI/CD-Sicherheitsscans als Fähigkeit auszuführen:
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,
})
// Convert result.Findings → capmodel.Risk emissions
# Ein GitHub-Repo scannen
export GH_TOKEN=ghp_your_token
trajan github scan --repo owner/repo
# Eine GitHub-Organisation scannen
trajan github scan --org myorg --concurrency 20
# GitLab-Projekte scannen
export GITLAB_TOKEN=glpat_your_token
trajan gitlab scan --group mygroup
# Azure DevOps scannen
export AZURE_DEVOPS_PAT=your_pat
trajan ado scan --org myorg --repo myproject/myrepo
# Offline-Scan: lokale Workflow-Dateien ohne API-Zugriff scannen
trajan github scan --path ./my-repo
trajan github scan --path ./.github/workflows/ci.yml
# JSON-Ausgabe
trajan github scan --repo owner/repo -o json > results.json
Ausführliche Nutzung, Erklärungen zu Erkennungen und Angriffs-Durchgänge findest du im Wiki.
| Plattform | Erkennungen | Angriffe | Enumeration |
|---|---|---|---|
| GitHub Actions | 11 | 9 | token, repos, secrets |
| GitLab CI | 8 | 3 | token, projects, groups, secrets, runners, branch-protections |
| Azure DevOps | 6 | 9 | token, projects, repos, pipelines, connections, agent-pools, users, groups, and more |
| Jenkins | 7 | 3 | access, jobs, nodes, plugins |
| JFrog | scan-only | - | - |
Trajan kann auch zu einer WebAssembly-Binärdatei kompiliert werden, die vollständig im Browser als einzelne HTML-Datei läuft. Es verwendet dieselbe Erkennungs-Engine, Angriffs-Plugins und Enumeration-Logik wie die CLI, nur kompiliert zu WASM. Die Webversion von Trajan ermöglicht eine reibungslose Auslieferung in Zielumgebungen im Rahmen einer Bewertung.
make wasm # build browser/trajan.wasm
make wasm-dist # build trajan-standalone.html (eigenständig)
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 --> AFDie Unterstützung für weitere CI/CD-Plattformen befindet sich in aktiver Entwicklung:
Siehe CONTRIBUTING.md für Entwicklungsrichtlinien, Plugin-Erstellung und Projektstruktur.
Basiert auf Forschung von Gato, Glato, Gato-X von Adnan Khan und dem GitHub Security Lab.
Apache 2.0. Siehe LICENSE.