v0.6.0
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)
- 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)
- 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
⚙️ 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)
- Operators: ==, !=, =
-
- 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 graphcommand with three modes: - (4ffd2bd)
- New
- --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 graphsubcommand for local files (no token needed) - (4ffd2bd)
- New
- 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)
-
- watch.go: new(branch) produced empty ref → use gitlab.Ptr (undocumented) - (31722e8)
- Code quality: - (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)