Trajan 扫描 CI/CD 流水线中的安全漏洞,这些漏洞常被攻击者用于攻陷软件供应链。它支持 GitHub Actions、GitLab CI、Azure DevOps、Jenkins 和 JFrog。
Trajan 解析工作流 YAML 文件、构建依赖关系图、运行检测插件,并通过内置的攻击能力验证漏洞的可利用性。
[!NOTE] Trajan 正在积极开发中。部分功能可能不完整,存在不完善之处。如果遇到问题,请提出 issue。
预编译的二进制文件可在发布页面获取。
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 // 最长扫描持续时间(默认:5m)
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 的 Web 版本可在评估期间以低摩擦方式交付到目标环境。
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、Adnan Khan 的 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 | 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 等 |
| Jenkins | 7 | 3 | access、jobs、nodes、plugins |
| JFrog | 仅扫描 | - | - |