
Un outil de détection des vulnérabilités CI/CD et d'automatisation des attaques multi-plateforme pour identifier les faiblesses de sécurité dans les configurations de pipelines.
Trajan analyse les pipelines CI/CD à la recherche de vulnérabilités de sécurité que les attaquants utilisent pour compromettre les chaînes d'approvisionnement logicielles. Il prend en charge GitHub Actions, GitLab CI, Azure DevOps, Jenkins et JFrog.
Trajan analyse les fichiers YAML de workflows, construit des graphes de dépendances, exécute des plugins de détection et valide l'exploitabilité via des capacités d'attaque intégrées.
[!NOTE] Trajan est en cours de développement actif. Certaines fonctionnalités peuvent être incomplètes et des aspérités sont attendues. Si vous rencontrez des problèmes, veuillez en ouvrir un.
Les binaires précompilés sont disponibles sur la page des releases.
go install github.com/praetorian-inc/trajan/cmd/trajan@latest
Ou construire depuis les sources :
git clone https://github.com/praetorian-inc/trajan.git
cd trajan && make build
repo (pour les dépôts privés) ou le scope public_repo (pour les dépôts publics uniquement)pkg/lib)Trajan peut être intégré comme une bibliothèque Go pour le scanning programmatique de sécurité CI/CD. Le paquet pkg/lib fournit un SDK public qui regroupe le registre de plateformes interne, le moteur de détection et le scanner de Trajan en une seule API de haut niveau.
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 platform (required)
Token string // API authentication token
BaseURL string // Custom base URL for self-hosted instances
Org string // Organization/owner name
Repo string // Repository name (empty = scan all org repos)
Concurrency int // Parallel detection workers (default: 10)
Timeout time.Duration // Max scan duration (default: 5m)
LocalPath string // Local filesystem path (file or dir) for offline scan
}
type ScanResult struct {
Findings []detections.Finding // Security vulnerabilities detected
Workflows []platforms.Workflow // CI/CD workflow files discovered
Errors []error // Non-fatal errors during scanning
SkippedDetections []string // Detection names skipped in LocalPath mode (API-only); always empty in API-mode scans
}
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
# Scan a GitHub repo
export GH_TOKEN=ghp_your_token
trajan github scan --repo owner/repo
# Scan a GitHub org
trajan github scan --org myorg --concurrency 20
# Scan GitLab projects
export GITLAB_TOKEN=glpat_your_token
trajan gitlab scan --group mygroup
# Scan Azure DevOps
export AZURE_DEVOPS_PAT=your_pat
trajan ado scan --org myorg --repo myproject/myrepo
# Offline scan: scan local workflow files without API access
trajan github scan --path ./my-repo
trajan github scan --path ./.github/workflows/ci.yml
# JSON output
trajan github scan --repo owner/repo -o json > results.json
Pour une utilisation détaillée, des explications sur les détections et des démonstrations d'attaques, consultez le Wiki.
Trajan se compile également en un binaire WebAssembly qui s'exécute entièrement dans le navigateur sous la forme d'un fichier HTML unique. Il utilise le même moteur de détection, les mêmes plugins d'attaque et la même logique d'énumération que l'interface en ligne de commande, simplement compilé en WASM. La version web de Trajan permet une livraison à faible friction dans les environnements cibles dans le cadre d'une évaluation.
make wasm # build browser/trajan.wasm
make wasm-dist # build self-contained 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
La prise en charge de plateformes CI/CD supplémentaires est en cours de développement actif :
Voir CONTRIBUTING.md pour les directives de développement, la création de plugins et la structure du projet.
Construit sur les recherches de Gato, Glato, Gato-X par Adnan Khan, et du GitHub Security Lab.
Apache 2.0. Voir LICENSE.
| Fonction | Description |
|---|
lib.Scan(ctx, cfg) | Scan complet : initialisation de la plateforme → découverte des workflows → exécution des détections |
lib.GetPlatform(name) | Obtenir un adaptateur de plateforme par nom (github, gitlab, azuredevops, bitbucket, jenkins, jfrog) |
lib.ListPlatforms() | Lister tous les noms de plateformes enregistrés |
lib.GetDetections(platform) | Obtenir les plugins de détection pour une plateforme spécifique |
lib.GetDetectionsForPlatform(platform) | Obtenir les détections spécifiques à la plateforme + multi-plateformes |
lib.ListDetectionPlatforms() | Lister les plateformes avec des détections enregistrées |
| Plateforme | Détections | Attaques | Énumérer |
|---|
| 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, et plus |
| Jenkins | 7 | 3 | access, jobs, nodes, plugins |
| JFrog | scan uniquement | - | - |