
Uma ferramenta de automação de ataques e detecção de vulnerabilidades em CI/CD multiplataforma para identificar fragilidades de segurança em configurações de pipeline.
O Trajan examina pipelines de CI/CD em busca de vulnerabilidades de segurança que atacantes usam para comprometer cadeias de suprimento de software. Ele suporta GitHub Actions, GitLab CI, Azure DevOps, Jenkins e JFrog.
O Trajan analisa arquivos YAML de workflow, constrói grafos de dependência, executa plugins de detecção e valida a explorabilidade por meio de capacidades de ataque integradas.
[!NOTE] Trajan está em desenvolvimento ativo. Alguns recursos podem estar incompletos e espera-se arestas ásperas. Se você encontrar problemas, por favor abra um.
Binários pré-compilados estão disponíveis na página de releases.
go install github.com/praetorian-inc/trajan/cmd/trajan@latest
Ou compile a partir do código-fonte:
git clone https://github.com/praetorian-inc/trajan.git
cd trajan && make build
repo (para repositórios privados) ou escopo public_repo (apenas para repositórios públicos)pkg/lib)O Trajan pode ser embutido como uma biblioteca Go para varredura de segurança programática em CI/CD. O pacote pkg/lib fornece um SDK público que encapsula o registro interno de plataforma do Trajan, o mecanismo de detecção e o scanner em uma única API de alto nível.
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
}
O SDK é usado pela plataforma de gerenciamento de superfície de ataque Chariot para executar varreduras de segurança de CI/CD como uma capacidade:
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
Para uso detalhado, explicações de detecção e guias de ataque, consulte a Wiki.
O Trajan também compila para um binário WebAssembly que roda inteiramente no navegador como um único arquivo HTML. Ele utiliza o mesmo mecanismo de detecção, plugins de ataque e lógica de enumeração que a CLI, apenas compilado para WASM. A versão web do Trajan permite a entrega com baixo atrito em ambientes-alvo como parte de uma avaliação.
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
Suporte adicional a plataformas de CI/CD está em desenvolvimento ativo:
Veja CONTRIBUTING.md para diretrizes de desenvolvimento, criação de plugins e estrutura do projeto.
Construído com base em pesquisas do Gato, Glato, Gato-X por Adnan Khan, e do GitHub Security Lab.
Apache 2.0. Veja LICENSE.
| Função | Descrição |
|---|
lib.Scan(ctx, cfg) | Varredura completa: inicialização da plataforma → descoberta de workflows → execução de detecção |
lib.GetPlatform(name) | Obter um adaptador de plataforma pelo nome (github, gitlab, azuredevops, bitbucket, jenkins, jfrog) |
lib.ListPlatforms() | Listar todos os nomes de plataforma registrados |
lib.GetDetections(platform) | Obter plugins de detecção para uma plataforma específica |
lib.GetDetectionsForPlatform(platform) | Obter detecções específicas da plataforma + multi-plataforma |
lib.ListDetectionPlatforms() | Listar plataformas com detecções registradas |
| Plataforma | Detecções | Ataques | Enumeração |
|---|
| GitHub Actions | 11 | 9 | token, repositórios, segredos |
| GitLab CI | 8 | 3 | token, projetos, grupos, segredos, runners, proteções de branch |
| Azure DevOps | 6 | 9 | token, projetos, repositórios, pipelines, conexões, pools de agentes, usuários, grupos e mais |
| Jenkins | 7 | 3 | acesso, jobs, nós, plugins |
| JFrog | apenas varredura | - | - |