Uno strumento multi-piattaforma di rilevamento delle vulnerabilità e automazione degli attacchi CI/CD per identificare le debolezze di sicurezza nelle configurazioni delle pipeline.
Trajan analizza le pipeline CI/CD alla ricerca di vulnerabilità di sicurezza che gli attaccanti sfruttano per compromettere le supply chain software. Supporta GitHub Actions, GitLab CI, Azure DevOps, Jenkins e JFrog.
Trajan analizza i file YAML dei workflow, costruisce grafi di dipendenze, esegue plugin di rilevamento e convalida la sfruttabilità attraverso capacità d'attacco integrate.
[!NOTE] Trajan è in fase di sviluppo attivo. Alcune funzionalità potrebbero essere incomplete e sono previsti spigoli. Se incontri problemi, ti preghiamo di aprire una segnalazione.
Binari precompilati sono disponibili nella pagina delle release.
go install github.com/praetorian-inc/trajan/cmd/trajan@latest
Oppure compila dal sorgente:
git clone https://github.com/praetorian-inc/trajan.git
cd trajan && make build
repo (per repository privati) o ambito public_repo (solo per repository pubblici)pkg/lib)Trajan può essere incorporato come libreria Go per la scansione della sicurezza CI/CD programmatica. Il pacchetto pkg/lib fornisce un SDK pubblico che racchiude il registro interno della piattaforma, il motore di rilevamento e lo scanner di Trajan in una singola API di alto livello.
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)
}
| Funzione | Descrizione |
|---|---|
lib.Scan(ctx, cfg) | Scansione completa: inizializzazione piattaforma → scoperta workflow → esecuzione rilevamento |
lib.GetPlatform(name) | Ottiene un adattatore di piattaforma per nome (github, gitlab, azuredevops, bitbucket, jenkins, jfrog) |
lib.ListPlatforms() | Elenca tutti i nomi delle piattaforme registrate |
lib.GetDetections(platform) | Ottiene i plugin di rilevamento per una piattaforma specifica |
lib.GetDetectionsForPlatform(platform) | Ottiene rilevamenti specifici della piattaforma + cross-platform |
lib.ListDetectionPlatforms() | Elenca le piattaforme con rilevamenti registrati |
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
}
L'SDK è utilizzato dalla piattaforma di gestione della superficie d'attacco Chariot per eseguire scansioni di sicurezza CI/CD come capacità:
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
# Scansiona un repository GitHub
export GH_TOKEN=ghp_your_token
trajan github scan --repo owner/repo
# Scansiona un'organizzazione GitHub
trajan github scan --org myorg --concurrency 20
# Scansiona progetti GitLab
export GITLAB_TOKEN=glpat_your_token
trajan gitlab scan --group mygroup
# Scansiona Azure DevOps
export AZURE_DEVOPS_PAT=your_pat
trajan ado scan --org myorg --repo myproject/myrepo
# Scansione offline: analizza file workflow locali senza accesso API
trajan github scan --path ./my-repo
trajan github scan --path ./.github/workflows/ci.yml
# Output JSON
trajan github scan --repo owner/repo -o json > results.json
Per un utilizzo dettagliato, spiegazioni sui rilevamenti e guide agli attacchi, consulta la Wiki.
| Piattaforma | Rilevamenti | Attacchi | Enumerazione |
|---|---|---|---|
| GitHub Actions | 11 | 9 | token, repository, secrets |
| GitLab CI | 8 | 3 | token, progetti, gruppi, secrets, runner, protezioni rami |
| Azure DevOps | 6 | 9 | token, progetti, repository, pipeline, connessioni, pool di agenti, utenti, gruppi e altro |
| Jenkins | 7 | 3 | accesso, job, nodi, plugin |
| JFrog | solo scansione | - | - |
Trajan viene anche compilato in un binario WebAssembly che viene eseguito interamente nel browser come un singolo file HTML. Utilizza lo stesso motore di rilevamento, gli stessi plugin d'attacco e la stessa logica di enumerazione della CLI, semplicemente compilati in WASM. La versione web di Trajan consente una distribuzione a basso attrito negli ambienti target come parte di una valutazione.
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 --> AFVedi CONTRIBUTING.md per linee guida sullo sviluppo, creazione di plugin e struttura del progetto.
Costruito sulla ricerca di Gato, Glato, Gato-X di Adnan Khan, e del GitHub Security Lab.
Apache 2.0. Vedi LICENSE.