Skip to content

v0.6.0

Choose a tag to compare

@github-actions github-actions released this 20 Jul 13:56
· 83 commits to main since this release
4c8a156

Changelog

All notable changes to this project will be documented here

0.6.0 - 2026-07-20

✨ New features

  • Add agent skills for codex - (fbcc5d5)
  • Proper recursive descent parser (lexer + parser) that supports the full - (e6df569)
  • Feat: add attack surface recommender to enumerate reports - (02d6c15)
  • Feat: add --local flag for offline CI/CD enumeration - (0fb69e0)
  • Feat: add validate command for token scope probing - (7d23daf)
  • Feat: add pkg/validate for token scope probing - (bc6cecf)
  • Feat: add --self and --all-projects flags to enumerate command - (e1dc31a)
  • Fix: add env exfil artifacts and || true to 4 payload generators - (1dc573c)
  • Revert "docs: add Phase 2 CTF expansion plan for 7 unused attack modes" - (bbe288b)
  • Docs: add Phase 2 CTF expansion plan for 7 unused attack modes - (4fe2b68)
  • Feat: add --auto-encrypt for automatic RSA-4096 encrypted exfiltration - (788899e)
  • Feat: add artifact exfil to all 13 expansion payloads with varied techniques - (fafdb7d)
  • Docs: add OIDC CE limitation note to ctf-qa-validation skill - (2966184)
  • Docs: add cleanup and setup-lab.sh verification to ctf-qa-validation skill - (2c15db2)
  • Docs: add CTF expansion design spec and implementation plan - (6caf6bf)
  • Feat: add Sprint 4 attack vectors (V7, V11, V13) with analyzer rules - (b765967)
  • Feat: add Sprint 3 attack vectors (V1, V4, V6) with analyzer rules - (b866ddd)
  • Feat: add Sprint 2 attack vectors (V2, V9, V10) with analyzer rules - (430805e)
  • Feat: add Sprint 1 attack vectors (V3, V5, V8, V12) - (cd9b015)
  • Feat: add TLS support for pivot callback server and bump RSA default to 4096 - (2ed6f3e)
    • callback: add StartTLS() with --tls-cert/--tls-key for HTTPS callbacks - (2ed6f3e)
    • cmd/pivot: add --tls-cert and --tls-key flags - (2ed6f3e)
  • Fix: address bugs, concurrency issues, API compatibility, and code quality - (4c8e566)
    • pipeline: add StopCacheEvictor() to allow stopping the background goroutine - (4c8e566)
  • Feat: add group-level security dashboard (feature 23) - (e59f9bf)
  • Feat: add CI/CD config drift detection (feature 24) - (b6ecfb6)
  • Feat: add environment/deployment analysis with 4 finding rules - (4132e68)
  • Feat: add CI/CD variable inheritance analysis (feature 28) - (bd86c0b)
  • Feat: add SPDX 2.3 output and SBOM analyzer rules (feature 22) - (b76229f)
  • Feat: add GitLab Pages CI/CD security analysis (feature 19) - (ba2adc0)
  • Docs: add implementation plan for 6 new analysis features - (8467484)
  • Docs: add design spec for 6 new analysis features - (98bbf0d)
  • Refactor: address 8 code quality issues across analyze, attack, bloodhound, enumerate, pipeline, and pivot packages - (2ec3a94)
  • Docs: add Phase 4 cleanup to ctf-qa-validation skill - (8e49d54)
  • Refactor: address code review — fix bugs, reduce complexity, extract shared utilities - (1dd1411)
    • Fix callback correlation in pivot orchestrator: add Project field to - (cfe8cb7)
  • Feat: add CWE/ATT&CK/OWASP CI/CD Top 10 taxonomy and dependency graph visualization - (4ffd2bd)
  • Refactor: address code review items #15, #16, #17, #20 - (23554c7)
  • Fix: address code review findings — bugs, dead code, and missing wiring - (31722e8)
    • ai_config.go: add //nolint:gosec for finding ID constants (#2) - (31722e8)
  • Refactor: address code review — concurrent pivot, split attack.go, structured logging, and P2 fixes - (96f9487)
    • api/search.go, mcp/tools_search.go: add context cancellation in producer - (8f13068)
    • gitlabx/{search,tree,languages}.go, bloodhound/client.go: add io.LimitReader - (8f13068)
    • pipeline/resolve.go: add ClearRemoteCache() and max-entries eviction (1000 cap) - (8f13068)
  • Feat: add supply chain attack surface detection and attack techniques - (8508079)

✨: New features

  • Feat: replace rules:if evaluator with recursive descent AST parser - (e6df569)
  • Feat: extract runner metadata from job logs as fallback - (469fc9e)
  • Feat: integrate new findings into report pipeline and exploitable mappings - (525206d)
  • Feat: implement 14 supply chain attack surface enhancements (M1-M14) - (6fe8849)

🐛 Bug fixes

  • Fix(ctf): validate all challenge attack paths - (4576c80)
  • Fix: stop truncating recommendation URLs in pterm output - (676f1e8)
  • Fix: update logrunner regex for modern GitLab trace format - (6582c44)
  • Files, parses them, and runs the full analysis pipeline. - (0fb69e0)
  • Fix: make all expansion payloads work end-to-end against live CTF lab - (2fd2d1b)
  • fix xargs -0 exfil fallback (pipe + -I{} instead of redirect) - (2fd2d1b)
  • Fix: resolve all linter issues from attack vector expansion - (201616a)
  • Fix: global cache detection, runner data gap, MR trigger arg; add chain poisoning detection - (80884d9)
  • fields consistently across all runner scopes; consolidate into shared - (80884d9)
  • Fix: update UpsertFile dual-failure test for HTTP 500 retry behavior - (cb7e027)
    • pivot: fix MaxDepthReached off-by-one tracking (report last processed depth) - (4c8e566)
  • Fix: track dashboard HTML template by adding gitignore exception - (ca09bc4)
  • Fix: merge CWE and ATT&CK var blocks to resolve dupl lint warning - (b4db173)
  • Fix: remove dead code found in final review - (16742af)
  • Fix: replace unnecessary lambda wrappers with direct function references in detection step table - (e3ab90b)
  • Fix: correct CLI flags in ctf-qa-validation skill after QA run - (2d20fab)
  • Refactor: fix pivot correlation bug, add structured logging, extract attack handlers - (cfe8cb7)
  • Finding_id, title, job, evidence, recommendation) for SIEM/spreadsheet import. - (23554c7)
    • report.go: fix misleading CISummary comment (#12) - (31722e8)
  • Fix: resolve resource leaks, read-after-close, and code quality issues across pkg/ - (8f13068)
  • HIGH priority bugs: - (8f13068)
  • Fix: commit-prefix uses benign file instead of overwriting CI, release-tamper includes artifact upload - (5361c65)

📚 Documentation

  • Docs: update CLAUDE.md with session learnings - (9545417)
  • Docs: update analyze CLAUDE.md for AST-based rules:if parser - (e16b17a)
  • Docs: document validate, --local, logrunner, and recommender in CLAUDE.md - (70d1019)
  • Docs: document --self and --all-projects enumerate flags in CLAUDE.md - (e978a97)
  • Docs: update CLAUDE.md files with expansion track coverage - (dec778c)
  • Docs: update CLAUDE.md files with session learnings - (a900be7)
  • Docs: update ctf-qa-validation skill with flag submission and expansion payloads - (9a25131)

🛠 Improvements

  • Update .gitignore - (7b9f771)
  • Update golangci-lint command in Makefile - (a8ff3da)

⚙️ Miscellaneous

  • Merge pull request #35 from mr-pmillz/release/v0.6.0 - (4c8a156)
  • Release/v0.6.0 - (4c8a156)
  • Chore: update changelog - (33692f6)
  • Merge pull request #34 from mr-pmillz/feat/research - (3757b6f)
  • New testing features and techniques - (3757b6f)
  • Recommendation text contains actionable guidance with full URLs that - (676f1e8)
  • Were being cut to 160 chars, rendering the links useless. Evidence - (676f1e8)
  • Still truncates (it's raw data), but recommendations now render in full. - (676f1e8)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (676f1e8)
  • Add enumerate discovery modes (--self, --all-projects, --local), validate - (9545417)
  • Command, attack surface recommender, run-log runner detection, token-skip - (9545417)
  • Patterns, function || true gotcha, and SDK version bump to v1.46.0. - (9545417)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (9545417)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (e16b17a)
  • The old evaluator was a simple OR-of-ANDs string splitter that could - (e6df569)
  • Not handle parentheses, null comparisons, variable truthiness checks, - (e6df569)
  • Case-insensitive regex, or ${VAR} syntax. The new implementation is a - (e6df569)
  • GitLab CI/CD rules:if expression grammar: - (e6df569)
    • Operators: ==, !=, =, !, &&, ||, ! - (e6df569)
    • Parentheses with correct precedence (innermost first) - (e6df569)
    • null keyword for undefined/empty variable checks - (e6df569)
    • Variable truthiness ($VAR is true if defined and non-empty) - (e6df569)
    • ${VAR} brace-enclosed variables - (e6df569)
    • Case-insensitive regex via /pattern/i flag - (e6df569)
    • Proper operator precedence: ! > && > || - (e6df569)
  • 37 test cases cover all syntax forms including edge cases from the - (e6df569)
  • GitLab documentation. The EvaluateIf() and rulesRunInContext() public - (e6df569)
  • APIs are unchanged (drop-in replacement). - (e6df569)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (e6df569)
  • GitLab 19.x traces use split-line format ("Running on X..." + - (6582c44)
  • 'Preparing the "shell" executor') instead of the older combined - (6582c44)
  • "Running on X using Y executor" format. Handle both patterns. - (6582c44)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (6582c44)
  • Also fix errorlint issue in local_test.go (errors.Is instead of !=). - (70d1019)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (70d1019)
  • Synthesizes aggregate findings into actionable attack recommendations - (02d6c15)
  • With suggested gogatoz commands. Six rule categories: CI Injection, - (02d6c15)
  • Pwn Request, Secrets Exfiltration, Lateral Movement, Supply Chain, - (02d6c15)
  • And Persistence. Renders as a severity-colored PTerm table. - (02d6c15)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (02d6c15)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (469fc9e)
  • Enables scanning local directories and CI YAML files without a GitLab - (0fb69e0)
  • Token or API access. Walks directories recursively for .gitlab-ci.yml - (0fb69e0)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (0fb69e0)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (7d23daf)
  • Introduces ProbeToken() which validates a GitLab token and probes API - (bc6cecf)
  • Endpoints to map its effective capabilities (PAT self-introspection, - (bc6cecf)
  • User identity, project/group/user listing, admin runners, admin - (bc6cecf)
  • Settings). Includes httptest-based tests for full-access, read-only, - (bc6cecf)
  • And nil-client scenarios. - (bc6cecf)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (bc6cecf)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (e978a97)
  • --self discovers all projects the authenticated token owner is a member - (e1dc31a)
  • Of via the GitLab projects API (membership=true) and feeds them into the - (e1dc31a)
  • Existing enumeration pipeline. --all-projects discovers every project - (e1dc31a)
  • Visible to the token on the instance. Both use simple=true for lighter - (e1dc31a)
  • API responses and paginate automatically. - (e1dc31a)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (e1dc31a)
  • Npm_tamper, deadmanswitch, branchmutator, and sigstore payloads were - (1dc573c)
  • Missing artifacts blocks and failed hard when the attack function - (1dc573c)
  • Returned non-zero. Add printenv env dump + artifacts: when: always to - (1dc573c)
  • Each, and append || true to function invocations so the job always - (1dc573c)
  • Uploads captured CI variables regardless of attack outcome. - (1dc573c)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (1dc573c)
  • Chore: remove superpowers plans/specs from git tracking - (3416c31)
  • These are Claude Code working documents, not project deliverables. - (3416c31)
  • Already in .gitignore — this commit removes them from tracking. - (3416c31)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (3416c31)
  • This reverts commit 4fe2b68. - (bbe288b)
  • Plan covers: tamper-release, tamper-package, npm-tamper, dead-man-switch, - (4fe2b68)
  • Branch-mutator, sigstore, impersonate-maintainer (Flags 48-54). - (4fe2b68)
  • Plus walkthrough docs for existing Flag 33 (dep-confusion). - (4fe2b68)
  • Vault-enum and k8s-secrets skipped (need Vault/K8s infra). - (4fe2b68)
  • Implementation deferred to next session. - (4fe2b68)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (4fe2b68)
  • Root CLAUDE.md: - (dec778c)
    • Add 13 expansion payload names to attack modes section - (dec778c)
    • Add --auto-encrypt flag documentation - (dec778c)
    • Add 8 new finding IDs to analyze description - (dec778c)
    • Update pkg/store model list with KeyPair and missing models - (dec778c)
  • Pkg/analyze/CLAUDE.md: - (dec778c)
    • Add 8 new detection files to Files table - (dec778c)
  • Pkg/attack/CLAUDE.md: - (dec778c)
    • Update payloads directory listing with all 37 payload generators - (dec778c)
  • Pkg/store/CLAUDE.md (NEW): - (dec778c)
    • Complete package documentation: 14 models, exported API, gotchas - (dec778c)
    • KeyPair model for --auto-encrypt feature - (dec778c)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (dec778c)
  • When --auto-encrypt is passed with --secrets (and no --pubkey-file), - (788899e)
  • Gogatoz auto-generates an RSA-4096 keypair, embeds the public key in - (788899e)
  • The exfil CI job for AES-256-CBC envelope encryption, and uses the - (788899e)
  • Private key to auto-decrypt downloaded artifacts. The keypair is - (788899e)
  • Persisted to the SQLite DB for later decryption in separate sessions. - (788899e)
  • New components: - (788899e)
    • KeyPair model in pkg/store/models.go (Label, PublicPEM, PrivatePEM, - (788899e)
  • KeyBits, SessionID) - (788899e)
    • SaveKeyPair, GetKeyPair, GetKeyPairByLabel, ListKeyPairs store methods - (788899e)
    • --auto-encrypt flag on attack command - (788899e)
    • generateAndStoreKeyPair helper (extracted to keep gocognit under 30) - (788899e)
  • Unit tests: 4 new tests for KeyPair CRUD (save/retrieve, label lookup, - (788899e)
  • List ordering, not-found error). - (788899e)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (788899e)
  • Root CLAUDE.md: - (a900be7)
    • Payload generators must include exfil + artifacts to work on CTF lab - (a900be7)
    • No unreachable external refs in committed payloads (comment out) - (a900be7)
    • when:on_failure vs when:always for exploit jobs - (a900be7)
    • trigger:include:artifact CE limitation on non-protected branches - (a900be7)
    • renderPayload() split for gocognit compliance - (a900be7)
    • CTF variable name sync requirement across 3 repos - (a900be7)
    • setup-lab.sh idempotency: destroy_all not revoke!, curl || true, - (a900be7)
  • force-recreate not restart for flagserver .env reload - (a900be7)
  • Pkg/analyze/CLAUDE.md: - (a900be7)
    • stringutil.TruncateEvidence import path and signature - (a900be7)
    • jobTriggersOnMR/jobRulesAllowBroad value receiver signatures - (a900be7)
    • Shared severityTestCase test helper to avoid dupl linter - (a900be7)
  • Pkg/attack/CLAUDE.md: - (a900be7)
    • renderPayload/renderExpansionPayload split documentation - (a900be7)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (a900be7)
  • Fixes found during QA validation: - (2fd2d1b)
    • remote-include-cache: comment out include:remote (unreachable URL - (2fd2d1b)
  • causes 0-job pipeline failure); exfil via base64 /proc/self/environ - (2fd2d1b)
    • spec-inputs: comment out include:component (external resource); - (2fd2d1b)
    • needs-project: comment out needs:project (external project); - (2fd2d1b)
  • exfil via tar of /proc/self/environ binary - (2fd2d1b)
    • trigger-artifact: comment out trigger:include:artifact (child - (2fd2d1b)
  • pipelines don't work on non-default branches in CE); exfil via - (2fd2d1b)
  • hexdump reversal; fix heredoc indentation with indentBlock - (2fd2d1b)
    • interruptible: change when: on_failure → when: always (the setup - (2fd2d1b)
  • job succeeds normally, so on_failure never triggers) - (2fd2d1b)
  • All 13 payloads now produce working CI pipelines that successfully - (2fd2d1b)
  • Exfiltrate masked CI variables via artifacts on the CTF lab. - (2fd2d1b)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (2fd2d1b)
  • Each payload now includes an env dump + artifacts block using a unique - (fafdb7d)
  • Exfiltration method: - (fafdb7d)
    • remote-include-cache: /proc/self/environ → base64 - (fafdb7d)
    • pre-get-sources: /proc + git credential harvest - (fafdb7d)
    • cache-key-poison: python3 os.environ → JSON - (fafdb7d)
    • parallel-matrix: per-instance /proc read with matrix index - (fafdb7d)
    • interruptible: awk ENVIRON array in on_failure fallback - (fafdb7d)
    • oidc-federation: perl /proc/self/environ read - (fafdb7d)
    • artifact-reports: env hidden in XML CDATA block - (fafdb7d)
    • image-poison: dd binary read of /proc/self/environ - (fafdb7d)
    • workflow-vars: sed null-byte replacement from /proc - (fafdb7d)
    • spec-inputs: xargs -0 from /proc/self/environ - (fafdb7d)
    • rules-bypass: strings on /proc/self/environ - (fafdb7d)
    • trigger-artifact: hexdump + xxd in child pipeline - (fafdb7d)
    • needs-project: raw binary /proc/self/environ → tar - (fafdb7d)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (fafdb7d)
  • Flag 40 uses id_tokens: which requires GitLab Premium. On CE labs, - (2966184)
  • Enumerate still detects the pattern but the token isn't minted. - (2966184)
  • Solve with --payload secrets instead of --payload oidc-federation. - (2966184)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (2966184)
  • Add Phase 6 (Post-QA Cleanup) covering: - (2c15db2)
    • Per-challenge branch cleanup with gogatoz --cleanup - (2c15db2)
    • Bulk cleanup script for all expansion repos - (2c15db2)
    • Flagserver team/score reset procedure - (2c15db2)
    • setup-lab.sh idempotency verification checklist - (2c15db2)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (2c15db2)
  • Add Phase 5 (Flag Submission Validation) covering: - (9a25131)
    • Flagserver API reference (register/login/submit/scoreboard) - (9a25131)
    • Rate limiting guidance (2s delays between batch submissions) - (9a25131)
    • .env sync procedure for flagserver container updates - (9a25131)
    • Expansion track payload table (13 payloads, Flags 35-47) - (9a25131)
  • Also updates Phase 3b with expansion payload smoke test loop. - (9a25131)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (9a25131)
  • Design spec covering 13 new CTF challenges (Flags 35-47) across - (6caf6bf)
  • 3 tracks: Include & Workflow Abuse, Cloud & Container Federation, - (6caf6bf)
  • And Advanced Supply Chain II. Implementation plan with 10 tasks - (6caf6bf)
  • Covering setup-lab.sh, flagserver JSON, and docs site updates. - (6caf6bf)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (6caf6bf)
    • staticcheck QF1012: replace WriteString(Sprintf) with Fprintf in - (201616a)
  • oidc_federation.go and artifact_reports.go - (201616a)
    • gosec G101: nolint on test fixture credential in image_poison_test.go - (201616a)
    • dupl: extract shared severityTestCase + runSeverityDetectionTests helper - (201616a)
  • used by service_command_test.go and needs_project_test.go - (201616a)
    • gocognit: split renderPayload into renderPayload + renderExpansionPayload - (201616a)
  • to keep complexity under 30 - (201616a)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (201616a)
  • Add three new attack modules with corresponding detection: - (b765967)
    • trigger:include:artifact child pipeline poisoning - (b765967)
    • rules:changes/exists security job bypass (defense evasion) - (b765967)
    • needs:project cross-project artifact injection - (b765967)
  • New analyzer detection rules: - (b765967)
    • TRIGGER_ARTIFACT_RISK: flags dynamic child pipelines from artifacts - (b765967)
    • RULES_SECURITY_BYPASS: flags security jobs with restrictive rules - (b765967)
    • NEEDS_PROJECT_RISK: flags cross-project artifact dependencies - (b765967)
  • Includes CWE/OWASP/MITRE taxonomy entries and CLI integration. - (b765967)
  • All 13 planned attack vectors are now implemented. - (b765967)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (b765967)
  • Add three new attack modules with corresponding detection: - (b866ddd)
    • remote include cache poisoning (include:remote + cache, GitLab 19.0+) - (b866ddd)
    • workflow:rules:variables injection (workflow-level var override) - (b866ddd)
    • spec:inputs interpolation injection (YAML metachar breakout) - (b866ddd)
  • New analyzer detection rules: - (b866ddd)
    • INCLUDE_REMOTE_CACHED: flags cached remote includes - (b866ddd)
    • WORKFLOW_VAR_INJECTION: flags sensitive var overrides at workflow level - (b866ddd)
    • SPEC_INPUTS_INJECTION_RISK: flags inputs with YAML metacharacters - (b866ddd)
  • Includes CWE/OWASP/MITRE taxonomy entries and CLI integration. - (b866ddd)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (b866ddd)
  • Add three new attack modules: - (430805e)
    • OIDC federation token exfiltration (AWS/GCP/Azure exchange) - (430805e)
    • artifact reports injection (suppress security findings via clean SARIF) - (430805e)
    • image/service container poisoning (image:name + services:command) - (430805e)
  • New analyzer detection rules: - (430805e)
    • ARTIFACT_REPORT_INJECTION: flags security report artifacts without - (430805e)
  • recognized scanners - (430805e)
    • SERVICE_COMMAND_INJECTION: flags service container command overrides - (430805e)
  • Includes CWE/OWASP/MITRE taxonomy entries and CLI integration. - (430805e)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (430805e)
  • Add four new payload-only attack modules: - (cd9b015)
    • pre_get_sources_script injection (hooks before git fetch) - (cd9b015)
    • cache key prefix poisoning (structured cache:key:prefix) - (cd9b015)
    • parallel matrix combinatorial attack (parallel:matrix) - (cd9b015)
    • interruptible state loss (interruptible: true race condition) - (cd9b015)
  • Each includes payload generator, tests, and CLI integration via - (cd9b015)
  • RenderPayload() switch cases with new --cache-key-prefix, - (cd9b015)
  • --cache-key-files, and --matrix-vars flags. - (cd9b015)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (cd9b015)
  • Bug fixes: - (80884d9)
    • Parse global/default cache and array-of-caches in pipeline parser; add - (80884d9)
  • cache to reservedTopLevel to prevent misidentification as a job - (80884d9)
    • Switch ListProjectRunners from SDK to raw HTTP to get TagList/Executor - (80884d9)
  • accumulateRunners helper - (80884d9)
    • Fix jobTriggersOnMR(job) passing entire Job struct instead of job.Rules - (80884d9)
  • Quality improvements: - (80884d9)
    • Extract Run() pre-checks into focused helpers (checkIncludeRisks, - (80884d9)
  • checkJobTriggerExposure, checkArtifactExpiry, checkPlaintextVars); - (80884d9)
  • Run() drops from ~234 to ~80 lines, all functions pass gocognit ≤30 - (80884d9)
    • Add SendFindings batch method to Notifier; enumerate webhook loop now - (80884d9)
  • sends one POST per project instead of one per finding - (80884d9)
    • Change BloodHound edge dedup key from full JSON to start|end|kind - (80884d9)
  • Features: - (80884d9)
    • Add ARTIFACT_CHAIN_POISONING detection via transitive closure over - (80884d9)
  • artifact dependency graph; register in exploitableFindingMap - (80884d9)
    • Add IsExploitable count assertion and command coverage tests - (80884d9)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (80884d9)
  • The mock handler now drains the request body and returns 400 (non-retryable) - (cb7e027)
  • Instead of 500 (now retryable after the isRetryable fix), preventing the - (cb7e027)
  • Retry middleware from replaying with an empty body. - (cb7e027)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (cb7e027)
    • callback: log warning when running without TLS - (2ed6f3e)
    • options: bump RSA key default from 2048 to 4096 bits - (2ed6f3e)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (2ed6f3e)
  • Go fmt ./... - (0634c3e)
    • pivot: log warning on callback channel full instead of silent drop - (4c8e566)
    • report: track RawFindingCount separately from FP-adjusted FindingCount - (4c8e566)
    • gitlabx: retry on HTTP 500 (transient on GitLab under load) - (4c8e566)
    • cmd/enumerate: extract buildEnumerateOptions() from 395-line RunE closure - (4c8e566)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (4c8e566)
  • Go fix ./... - (31aa843)
  • Go fmt ./... - (4ecd5e1)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (ca09bc4)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (b4db173)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (16742af)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (525206d)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (e59f9bf)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (b6ecfb6)
  • Add API-driven environment metadata collection and analyzer rules for - (4132e68)
  • Deployment protection risks: ENV_UNPROTECTED_DEPLOY (High), - (4132e68)
  • ENV_NO_APPROVAL_GATE (Medium), ENV_MR_DEPLOY_RISK (High), - (4132e68)
  • ENV_STALE_DEPLOYMENT (Low). Wired into enumerate pipeline via - (4132e68)
  • --fetch-environments flag following the variable fetch pattern. - (4132e68)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (4132e68)
  • Add API-driven variable metadata collection during enumeration and - (bd86c0b)
  • Analyzer rules for variable inheritance risks. Four new finding IDs: - (bd86c0b)
  • VAR_INHERITANCE_SHADOW, VAR_UNMASKED_SECRET, VAR_UNPROTECTED_SECRET, - (bd86c0b)
  • VAR_MR_OVERRIDE_RISK. New --fetch-variables flag on enumerate command. - (bd86c0b)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (bd86c0b)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (b76229f)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (ba2adc0)
  • 7 tasks covering Pages analysis, SBOM/SPDX, variable inheritance, - (8467484)
  • Environments/deployments, config drift detection, group dashboard, - (8467484)
  • And integration/QA. Each task has TDD steps with complete code. - (8467484)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (8467484)
  • Features: variables inheritance (#28), environments/deployments (#25), - (98bbf0d)
  • Config drift detection (#24), group security dashboard (#23), - (98bbf0d)
  • SBOM/SPDX extension (#22), and GitLab Pages analysis (#19). - (98bbf0d)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (98bbf0d)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (e3ab90b)
  • Go fmt ./... - (4e10d43)
    • Refactor Run() in analyze.go into detection step registry pattern (29 steps in table + loop) - (2ec3a94)
    • Pre-allocate findings slice with capacity 64 to reduce allocations - (2ec3a94)
    • Add slog.Debug logging to toJSONString when json.Marshal fails - (2ec3a94)
    • Consolidate duplicate quoteJoin into exported stringutil.QuoteJoin, update 5 consumers - (2ec3a94)
    • Fix bumpSeverity to handle SeverityCritical explicitly and warn on unknown values - (2ec3a94)
    • Add structured Dependency type and Deps field to Finding; BloodHound builder prefers structured deps over regex evidence parsing - (2ec3a94)
    • Replace iterative strings.ReplaceAll in applyInputsSubstitution with single-pass strings.NewReplacer to prevent cross-substitution - (2ec3a94)
    • Unexport CredentialStore.ProjectsByToken to enforce lock-safe access - (2ec3a94)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (2ec3a94)
  • Go fmt ./... - (cecdc8a)
  • Documents all cleanup flags (--cleanup-ci, --cleanup-jobs, - (8e49d54)
  • --cleanup-branch, --cleanup-pipeline) with correct execution order, - (8e49d54)
  • QA cleanup example, and lab state verification check. - (8e49d54)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (8e49d54)
  • QA testing revealed several incorrect CLI flags in the skill: - (2d20fab)
    • enumerate uses --input (not --project) for project identifiers - (2d20fab)
    • parse requires subcommand (parse dedup, not bare parse) - (2d20fab)
    • pivot uses -t/--target (not --targets) and --external-url (not --webhook) - (2d20fab)
    • bloodhound export takes --input file (not --project flag) - (2d20fab)
    • removed hardcoded credentials, points to setup-lab.sh instead - (2d20fab)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (2d20fab)
  • Reorganized claude skills - (6f1a8f1)
  • Reorganized claude skills - (5cdb5bb)
  • Bug fixes: - (1dd1411)
    • Fix orchestrator OOB fallback for unmatched callback payloads (pivot) - (1dd1411)
    • Fix double job name generation in secrets exfil (attack) - (1dd1411)
    • Wire RecordTokenProject into harvestTokens for token reuse correlation (pivot) - (1dd1411)
    • Warn when --mr-comment used with multi-project scans (enumerate) - (1dd1411)
    • Fix isLocalScriptExecution false positive on ./subpkg paths (analyze) - (1dd1411)
  • Architecture: - (1dd1411)
    • Extract shared buildClientOptions()/newGitLabClient() into cmd/client.go, - (1dd1411)
  • replacing ~60 lines of duplicated HTTP client config across 8 command files - (1dd1411)
    • Add API key authentication (GOGATOZ_API_KEY / --api-key) with timing-safe - (1dd1411)
  • comparison via crypto/subtle; healthz endpoint bypasses auth - (1dd1411)
    • Extract pkg/stringutil.TruncateEvidence shared by analyze and enumerate - (1dd1411)
    • Add background cache evictor for remote include TTL cache (pipeline) - (1dd1411)
  • Cognitive complexity refactoring (all under gocognit threshold of 30): - (1dd1411)
    • runAttackSecrets: 63→23, runAttackCommitCI: 36→9 - (1dd1411)
    • runAttackSupplyChainWorm: 48→10 - (1dd1411)
    • buildSARIF: 38→1, runAttackCleanup: 37→13 - (1dd1411)
    • extractTriggerProject and TestTaxonomySpecificMappings: under 30 - (1dd1411)
  • Also adds CTF QA validation skill (.claude/skills/ctf-qa-validation.md). - (1dd1411)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (1dd1411)
  • Go fix ./... - (5363abc)
  • Go fmt ./... - (74b004f)
  • ExfilPayload, include CI_PROJECT_PATH in HTTP exfil callbacks, and - (cfe8cb7)
  • correlate by project path instead of arrival order (index fallback for - (cfe8cb7)
  • backward compat) - (cfe8cb7)
    • Add slog structured logging at key operational points across pivot, - (cfe8cb7)
  • enumerate, attack, and graph packages - (cfe8cb7)
    • Extract attack.go RunE (2178 lines) into 7 handler files with a clean - (cfe8cb7)
  • switch dispatcher (244 lines), removing attack_modes.go and unused - (cfe8cb7)
  • helpers - (cfe8cb7)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (cfe8cb7)
  • Taxonomy mappings (#25): - (4ffd2bd)
    • New pkg/analyze/taxonomy.go with CWE, MITRE ATT&CK, and OWASP CI/CD - (4ffd2bd)
  • Top 10 mappings for all 51 finding IDs - (4ffd2bd)
    • Taxonomy auto-merged into FindingCodeInfo via init() so all consumers - (4ffd2bd)
  • (LookupFinding, AllFindings, SARIF, GLSAST) get it automatically - (4ffd2bd)
    • SARIF output: CWE tags in properties.tags, relationships to CWE taxonomy, - (4ffd2bd)
  • ATT&CK and OWASP tags, taxonomies section with CWE taxa - (4ffd2bd)
    • GLSAST output: CWE and owasp_cicd identifiers per vulnerability - (4ffd2bd)
  • Dependency graph visualization (#24): - (4ffd2bd)
    • New pkg/graph/export.go with WriteDOT() and WriteMermaid() for job DAGs - (4ffd2bd)
  • with stage subgraph clusters, tag tooltips, deterministic output - (4ffd2bd)
    • New pkg/graph/cross_project.go with BuildCrossProject() for multi-project - (4ffd2bd)
  • graphs showing include and trigger relationships between projects - (4ffd2bd)
    • New gogatoz graph command with three modes: - (4ffd2bd)
  • --project (single project job DAG from GitLab) - (4ffd2bd)
  • --session (cross-project graph from DB scan session) - (4ffd2bd)
  • --all-projects (cross-project graph from all DB results) - (4ffd2bd)
    • New gogatoz parse graph subcommand for local files (no token needed) - (4ffd2bd)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (4ffd2bd)
  • #20: Add CSV output format to enumerate and report commands. - (23554c7)
  • New --format=csv option writes findings as CSV rows (project, severity, - (23554c7)
  • #17: Migrate webshell_utils.go from manual HTTP to GitLab SDK. - (23554c7)
  • WaitForPipelineForRef, listRecentPipelines, findJobInPipeline, and - (23554c7)
  • WaitForJobCompletion now use Pipelines.ListProjectPipelines and - (23554c7)
  • Jobs.ListPipelineJobs — benefits from SDK retries and rate limiting. - (23554c7)
  • #16: Add explicit context parameter to secretscan worker goroutines. - (23554c7)
  • #15: Extract attack mode helpers into cmd/attack_modes.go. - (23554c7)
  • CommitOrPrintPayload, runDepConfusion, runRunnerVarDump, and - (23554c7)
  • RunImpersonateMaintainer reduce attack.go RunE by ~57 lines and - (23554c7)
  • Provide a reusable pattern for future modes. - (23554c7)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (23554c7)
  • Bugs fixed: - (31722e8)
    • dep_confusion.go: strings.Index offBy1 → use SplitN (review #1) - (31722e8)
    • watch.go: new(branch) produced empty ref → use gitlab.Ptr (undocumented) - (31722e8)
    • watch.go: no signal handling → add SIGINT/SIGTERM graceful shutdown (#4) - (31722e8)
    • watch.go: --notify flag was dead code → implement webhook POST (#3) - (31722e8)
  • Code quality: - (31722e8)
    • runner_var_dump.go: document strace CAP_SYS_PTRACE limitation (#5) - (31722e8)
    • threatintel.go: replace global mutable cache with per-instance - (31722e8)
  • ThreatIntelCache struct (#8) - (31722e8)
  • Missing wiring: - (31722e8)
    • Wire --threat-intel-url and --threat-intel-file flags to enumerate - (31722e8)
  • command, thread ThreatIntelFeed through enumerate.Options → - (31722e8)
  • analyze.WithThreatIntel → detectSuspiciousNetworkTargets (#6, #19) - (31722e8)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (31722e8)
  • +kubebuilder hack to ignore omitzero change from go fix ./... - (887d40d)
  • Go fix ./... - (91278ab)
  • Go fmt ./... - (76cc3a0)
  • Detection rules (5 new): - (6fe8849)
    • Workflow secret exfil (disguised jobs, artifact-only exfil, push-triggered) - (6fe8849)
    • Dependency confusion risk (npm scoped, pip internal, go internal packages) - (6fe8849)
    • Monorepo release correlation (coordinated commits across namespace) - (6fe8849)
    • AI config credential harvester (Miasma pattern in .cursorrules et al.) - (6fe8849)
    • OIDC provenance anomaly (push-triggered OIDC without branch protection) - (6fe8849)
  • Attack payloads (2 new): - (6fe8849)
    • Dependency confusion (npm/pip/go public registry hijack) - (6fe8849)
    • Runner variable dump (procfs/printenv bypass of masked display) - (6fe8849)
  • Wiring (3 existing but dead): - (6fe8849)
    • --impersonate-maintainer flag connected to Attacker.ImpersonateMaintainer() - (6fe8849)
    • --monorepo-scope flag connected to discoverSiblings manifest filtering - (6fe8849)
    • SortByAccessLevel() called in pivot BFS queue, AccessLevel populated - (6fe8849)
  • Infrastructure (3 new): - (6fe8849)
    • pkg/config/threatintel.go — threat intel feed loading with cache - (6fe8849)
    • pkg/pivot/correlation.go — cross-project credential reuse detection - (6fe8849)
    • cmd/watch.go — gogatoz watch polling command - (6fe8849)
  • Reporting: - (6fe8849)
    • SupplyChainView extended with dep confusion, AI config, OIDC counters - (6fe8849)
    • PTerm Supply Chain Risk Summary section added - (6fe8849)
    • Remediation playbooks enriched for CRITICAL/HIGH findings - (6fe8849)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (6fe8849)
  • Go fmt ./... - (5dd0a5c)
    • P0: Refactor pivot attackAndHarvest to concurrent attack + batch receive - (96f9487)
  • pattern (N*5min → ~5min for multi-target pivots). Add ReceiveAll(), - (96f9487)
  • ReceiveTimeout, and AttackDelay options. - (96f9487)
    • P1: Split cmd/attack.go (3102→2166 lines) into attack_flags.go and - (96f9487)
  • attack_helpers.go. Replace 90-line mode counting with registry pattern. - (96f9487)
    • P1: Add log/slog structured logging via pkg/logging. New --log-level - (96f9487)
  • and --log-json global flags. Migrate all 37 fmt.Fprintf(os.Stderr) - (96f9487)
  • calls to slog across cmd/ and pkg/mcp/. - (96f9487)
    • P2: Add perl JSON::PP fallback in secrets exfil shell script to handle - (96f9487)
  • newlines in CI variable values. - (96f9487)
    • P2: Use errors.Join in UpsertFile when both update and create fail. - (96f9487)
    • P2: Extract magic numbers to named constants (MaxDeconflictSuffix, - (96f9487)
  • DefaultCommitMessage, DefaultConcurrency, DefaultReceiveTimeout). - (96f9487)
    • P2: Add --attack-delay and --receive-timeout flags to pivot command. - (96f9487)
  • No CLI syntax changes. Fully backward compatible. - (96f9487)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (96f9487)
  • Go fix ./... - (9164576)
  • Go fmt ./... - (5e6635e)
    • pipeline/resolve.go: wrap remote-include fetch in IIFE so defer cancel() and - (8f13068)
  • defer resp.Body.Close() execute per-fetch instead of accumulating in the - (8f13068)
  • enclosing closure scope - (8f13068)
    • bloodhound/client.go: reorder ImportQueries() to call readError() before - (8f13068)
  • closing the response body (was reading from already-closed body) - (8f13068)
  • Medium priority fixes: - (8f13068)
    • notify/notifier.go: default 30s HTTP timeout when none specified - (8f13068)
  • goroutine, panic recovery in workers, proper channel lifecycle - (8f13068)
  • safety for unbounded HTTP response reads - (8f13068)
    • mcp/tools_{search,enumerate,attack,secretscan,pivot}.go: log store persist - (8f13068)
  • errors instead of silently dropping them - (8f13068)
  • Refactoring: - (8f13068)
    • enumerate/enumerator.go: extract applyRunnerInfo() (3x dedup) and - (8f13068)
  • appendError() (18x dedup) helpers - (8f13068)
    • bloodhound/builder.go: use shared report.ExtractTagsFromEvidence() instead of - (8f13068)
  • duplicate function - (8f13068)
    • pivot/orchestrator.go: replace hand-rolled splitByComma/trimSpace with stdlib - (8f13068)
    • mcp/tools_attack.go: split 891-line file into tools_attack.go (187), - (8f13068)
  • tools_attack_modes.go (519), tools_attack_helpers.go (194) - (8f13068)
    • bloodhound/exporter.go: clean up partial file on error, check f.Close() error - (8f13068)
    • enumerate/enumerator.go: clarify double-lock design with comment - (8f13068)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (8f13068)
  • Go fix ./... - (bc368eb)
  • Go fmt ./... - (13b9beb)
  • Removed old e2e tests that are no longer used - (9c5f764)
    • commit-prefix mode now commits a docs/ file with the triggering prefix - (5361c65)
  • instead of replacing .gitlab-ci.yml, so the target's release pipeline fires - (5361c65)
    • release-tamper-pipeline always captures printenv to release-env.txt artifact - (5361c65)
    • exfil regex handles piped env dumps (printenv | sort > file) - (5361c65)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (5361c65)
  • Detection (8 new finding IDs): - (8508079)
    • SECRET_EXFIL_HTTP/ARTIFACT: env dump to curl/wget or artifact upload - (8508079)
    • SCRIPT_ENCODED_PAYLOAD: base64/hex blobs, binary magic bytes in scripts - (8508079)
    • SCRIPT_WHITESPACE_HIDING: 40+ leading spaces hiding code off-screen - (8508079)
    • CHARCODE_OBFUSCATION: String.fromCharCode, chr(), pack() C2 hiding - (8508079)
    • SUSPICIOUS_NETWORK_TARGET: .onion, pastebin, ngrok, direct IP C2 - (8508079)
    • CAMPAIGN_MATCH: Hades, Megalodon, worm, binary smuggle signatures - (8508079)
    • WEAK_BRANCH_PROTECTION: unprotected default branch, developer push - (8508079)
  • Attack techniques (3 new modes + 2 enhancements): - (8508079)
    • --workflow-exfil: stealthy artifact-based secret exfiltration - (8508079)
    • --commit-prefix: release trigger abuse via conventional commits - (8508079)
    • --release-tamper-pipeline: in-flight release artifact tampering - (8508079)
    • --monorepo-scope: npm/Go/Cargo sibling discovery for worm - (8508079)
    • --impersonate-maintainer: auto-lookup maintainer git identity - (8508079)
  • Pivot: AccessLevel priority sorting, cross-project credential correlation - (8508079)
  • Reporting: SupplyChainView section aggregating new finding categories - (8508079)
  • OIDC: extended detection for push-triggered jobs (not just MR) - (8508079)
  • Branch protection: GitLab API access level analysis in enumerate - (8508079)
  • Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (8508079)
  • Merge pull request #33 from mr-pmillz/main - (e4cea2f)
  • Sync main back to develop - (e4cea2f)