
マルチプラットフォーム対応のCI/CD脆弱性検出および攻撃自動化ツールで、パイプライン構成のセキュリティ上の弱点を特定します。
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 は、プログラムによる CI/CD セキュリティスキャンのために Go ライブラリとして埋め込むことができます。pkg/lib パッケージは、Trajan の内部プラットフォームレジストリ、検出エンジン、スキャナーを単一の高レベル API にラップする公開 SDK を提供します。
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
}
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,
})
// 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
詳細な使い方、検出の説明、攻撃のウォークスルーについては、Wiki を参照してください。
Trajan は、単一の HTML ファイルとしてブラウザ内で完全に動作する WebAssembly バイナリにもコンパイルされます。CLI と同じ検出エンジン、攻撃プラグイン、列挙ロジックを使用し、WASM にコンパイルされています。Trajan の Web バージョンは、評価の一環として対象環境への低摩擦な配信を可能にします。
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
追加の CI/CD プラットフォームサポートを活発に開発中:
開発ガイドライン、プラグイン作成、プロジェクト構造については CONTRIBUTING.md を参照してください。
Adnan Khan による Gato、Glato、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 | トークン, リポジトリ, シークレット |
| GitLab CI | 8 | 3 | トークン, プロジェクト, グループ, シークレット, ランナー, ブランチ保護 |
| Azure DevOps | 6 | 9 | トークン, プロジェクト, リポジトリ, パイプライン, 接続, エージェントプール, ユーザー, グループ, など |
| Jenkins | 7 | 3 | アクセス, ジョブ, ノード, プラグイン |
| JFrog | スキャンのみ | - | - |