v0.5.9
Changelog
All notable changes to this project will be documented here
0.5.9 - 2026-07-15
✨ New features
- Feat: add missing attack modes to report + update BloodHound icons - (7a8e244)
- Report exploit map: add 9 new finding-to-attack mappings for LOTP, - (7a8e244)
- Added bump deps claude skill for dependabot alerts - (10bd467)
- Feat: add built-in listener for supply chain worm callback exfiltration - (3a785b5)
- --ror-listen, extended with Project field support for the - (3a785b5)
- Docs: add CTF lab screenshots to gogatoz Astro docs - (da02284)
🐛 Bug fixes
- Fixed bugs and improved features - (8a5f87a)
- Fix: auto-merge retry on 405 and pivot BFS project discovery at depth > 0 - (f63520b)
- Fix: correct pipeline URL reporting, cache-poison mkdir, and nested-runner download - (b460f90)
- Fix: worm listener should wait for callbacks regardless of promoted count - (82f9ad2)
- Fix: resolve remaining SA5011 staticcheck nil pointer warnings in test files - (79e036a)
- Files so staticcheck recognizes subsequent pointer dereferences as - (79e036a)
- Fix: correct FLAG regex and sanitize worm stage name extraction - (44b3284)
-
- memorydump.go: fix broken ERE pattern FLAG+[^+]++ → FLAG[+][^+]+[+] - (44b3284)
- Fix: resolve SA5011 staticcheck nil pointer warnings in test files - (1d56868)
- Fix: prevent gitlab.com and seed nodes from polluting BloodHound graphs - (dd658b3)
- Fix: update BloodHound schema CICD_Project color and CICD_Job icon - (379055a)
- Fix: supply chain worm injected duplicate stages key breaking YAML - (a3a1908)
- Fix: multiple payload generators produced invalid YAML + runtime failures - (072fdff)
- The same YAML indentation bug: script content inserted into
- |block - (072fdff) - Fix: LOTP Phantom Gyp payload output was silently discarded - (80e38f1)
📚 Documentation
- Docs: update CLAUDE.md with payload generator gotchas from CTF session - (9be7b4f)
🛠 Improvements
⚙️ Miscellaneous
- Merge pull request #32 from mr-pmillz/release/v0.5.9 - (da023d8)
- Release/v0.5.9 - (da023d8)
- Chore: update changelog - (9f5fd6f)
- Merge pull request #31 from mr-pmillz/fix/bugz - (8a5f87a)
- Expand memory dump secrets grep - (10754bb)
- Go fix ./... - (473c126)
-
- auto-merge retries MergeMergeRequest up to 10 times with backoff, - (f63520b)
- allowing the MR pipeline to complete before merging (fixes 405) - (f63520b)
-
- pivot orchestrator discovers projects via token membership at - (f63520b)
- depth > 0 instead of re-scanning only the initial targets, enabling - (f63520b)
- full BFS lateral movement across gateway → middleware → crown - (f63520b)
- Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (f63520b)
-
- commit-ci now reports the CI-file pipeline instead of the stale - (b460f90)
- branch-creation pipeline by snapshotting the prior ID and waiting - (b460f90)
- for a newer one - (b460f90)
-
- cache-poison default payload adds mkdir -p .git/hooks before writing - (b460f90)
- the post-checkout hook (fixes "No such file or directory") - (b460f90)
-
- nested-runner payload checks for existing gitlab-runner binary before - (b460f90)
- downloading, falling back to system binary or fresh download - (b460f90)
- Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (b460f90)
- When --webhook was provided but the worm propagated to 0 repos, the - (82f9ad2)
- Listener was immediately stopped without waiting. Now the listener - (82f9ad2)
- Always waits for the full timeout when --webhook is set, allowing - (82f9ad2)
- Callbacks from previously infected repos or manual testing. - (82f9ad2)
- Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (82f9ad2)
- Add explicit return after t.Fatal/t.Fatalf in nil guards across 9 test - (79e036a)
- Unreachable. - (79e036a)
- Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (79e036a)
- Resolve SA5011 staticcheck nil pointer warnings in test files - (cbffbe0)
-
- supplychain_worm.go: validate detected stage name against safe pattern - (44b3284)
- to prevent YAML injection from crafted target CI configs - (44b3284)
- Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (44b3284)
- Chore: apply linter auto-fixes to memorydump, worm, bloodhound, and exporter test - (b276879)
- Linter/formatter changes applied by golangci-lint and goimports. - (b276879)
- Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (b276879)
- Add explicit return after t.Fatal/t.Fatalf in nil-check guard blocks. - (1d56868)
- Staticcheck SA5011 doesn't track that t.Fatal terminates the test, so - (1d56868)
- It flags subsequent field access as a possible nil pointer dereference. - (1d56868)
- The return makes the control flow explicit for the linter. - (1d56868)
- Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (1d56868)
- Two fixes to eliminate junk nodes in BloodHound attack surface graphs: - (dd658b3)
-
- buildGraphFromInputs: when gitlab-url is unset or is the default - (dd658b3)
- "https://gitlab.com", infer the actual URL from the most recent - (dd658b3)
- non-gitlab.com scan session in the database. This prevents the - (dd658b3)
- builder from creating a CICD_GitLabInstance node for gitlab.com - (dd658b3)
- when the user forgot to set GITLAB_URL. - (dd658b3)
-
- ExportToWriter: skip seed_data.json in the ZIP when the real graph - (dd658b3)
- has edges. The seed data bootstraps BH-CE's kind registry but - (dd658b3)
- creates a junk "GoGatoZ Seed Node (ignore)" instance node that - (dd658b3)
- pollutes the graph. Only include it for empty graphs. - (dd658b3)
- Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (dd658b3)
- Go fix ./... - (1b090e5)
- Go fmt ./... - (48c5e09)
-
- CICD_Project: color changed from #1F75CB to #E24329 (GitLab orange) - (379055a)
- to match the custom-nodes API entry - (379055a)
-
- CICD_Job: icon changed from "gears" to "faucet-drip" per user request - (379055a)
- Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (379055a)
- Closes PR #15 and #30 go version bump 1.26.5 - (f23750c)
- Version bump astro docs - (a883a68)
- Container escape, C2 channel, AI injection, OIDC, cache key injection, - (7a8e244)
- DIND, and fork script execution. PRIVILEGED_RUNNER_RISK now maps to - (7a8e244)
- --container-escape instead of --commit-ci --payload ror-shell. - (7a8e244)
- BloodHound schema.json icon updates (Font Awesome free solid names): - (7a8e244)
-
- CICD_Project: "cat" (GoGatoZ mascot) - (7a8e244)
-
- CICD_Group: "layer-group" (stacked layers) - (7a8e244)
-
- CICD_Job: "gears" (multiple gears) - (7a8e244)
-
- CICD_Finding: "triangle-exclamation" (warning triangle) - (7a8e244)
-
- CICD_Pipeline: "diagram-project" (pipeline flow) - (7a8e244)
-
- Server, microchip, file-code, key, id-badge unchanged - (7a8e244)
- Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (7a8e244)
- Add learnings from the CTF walkthrough session: YAML block scalar - (9be7b4f)
- Indentation, set -e dangers, gyp output routing, container escape - (9be7b4f)
- Env capture, worm CI injection, worm listener mode, and the || true - (9be7b4f)
- Pattern for payload function calls. - (9be7b4f)
- Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (9be7b4f)
- When --supply-chain-worm is used with --webhook, gogatoz now: - (3a785b5)
-
- Starts a built-in HTTP listener (port extracted from webhook URL) - (3a785b5)
-
- Auto-generates a curl callback payload that sends JSON with - (3a785b5)
- project path + base64-encoded printenv from each infected repo - (3a785b5)
-
- Propagates the worm to sibling repos in the target group - (3a785b5)
-
- Waits for callbacks with a 3-minute timeout + 5s grace period - (3a785b5)
-
- Pretty-prints exfiltrated secrets per-project with CI var filtering - (3a785b5)
-
- Persists all collected secrets to the SQLite database - (3a785b5)
- The listener reuses the existing Listener infrastructure from - (3a785b5)
- {"project":"...","data":"..."} JSON format the worm payload sends. - (3a785b5)
- Usage: - (3a785b5)
- gogatoz attack --supply-chain-worm \ - (3a785b5)
-
--target worm-labs/vuln-worm \ - ([3a785b5](https://github.com/mr-pmillz/gogatoz/commit/3a785b58117d1a7d7e7bb400e7e2e483580ba561)) -
--worm-target-group worm-labs \ - ([3a785b5](https://github.com/mr-pmillz/gogatoz/commit/3a785b58117d1a7d7e7bb400e7e2e483580ba561)) -
--webhook http://host.docker.internal:9445 - ([3a785b5](https://github.com/mr-pmillz/gogatoz/commit/3a785b58117d1a7d7e7bb400e7e2e483580ba561)) - Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (3a785b5)
- The worm CI generator prepended a separate
stages: [worm]block - (a3a1908) - Before the existing CI config, causing duplicate
stages:keys that - (a3a1908) - GitLab silently rejected (0 jobs, no yaml_errors). Fixed by using the - (a3a1908)
- Existing CI's first stage name ("build") for the worm job and omitting - (a3a1908)
- The separate stages key. Also added
rules: [- when: always]to - (a3a1908) - Ensure the worm job runs on all pipeline triggers. - (a3a1908)
- Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (a3a1908)
- Container escape, C2 channel, and variable injection payloads all had - (072fdff)
- Scalars without proper indentation, causing GitLab to silently reject - (072fdff)
- The YAML (pipeline created with 0 jobs, no yaml_errors). Fixed by using - (072fdff)
- IndentBlock() to indent script content under the block scalar. - (072fdff)
- Memory dump payload fixes: - (072fdff)
-
- Removed
set -ethat killed the script when credential sweep found - (072fdff)
- Removed
- no files (the
[ -e ] && cppattern returns 1 on missing files) - (072fdff) -
- Added
|| trueto all credential sweep copy commands - (072fdff)
- Added
-
- Ported Python-based /proc//mem scanner from the GitHub Actions - (072fdff)
- Runner.Worker memory dump technique — uses proper seek/read instead - (072fdff)
- of byte-by-byte dd, with regex extraction for token patterns - (072fdff)
-
- Added FLAG+ pattern to token extraction regex - (072fdff)
- Container escape payload fixes: - (072fdff)
-
- Added env_dump.txt capture step (printenv) so CI variables including - (072fdff)
- flags are captured in the bundle artifacts - (072fdff)
-
- Added
|| trueon _ESCAPE function call to prevent pipeline failure - (072fdff)
- Added
-
- Added escape_env_dump.txt to artifacts paths - (072fdff)
- C2 channel payload fixes: - (072fdff)
-
- Fixed
find /command missing|| true(returns non-zero on - (072fdff)
- Fixed
- permission errors in /proc, /sys) - (072fdff)
-
- Added
|| trueon _C2CHANNEL function call - (072fdff)
- Added
- Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (072fdff)
- Add 23 screenshots from the CTF lab environment showing exploited - (da02284)
- Pipelines, job logs, CI variables, merge requests, and the flag server. - (da02284)
- Screenshots are added to the scanning, supply chain, and lateral - (da02284)
- Movement use-case pages to illustrate real attack artifacts. - (da02284)
- Also adds tag poisoning (Trivy-style) section to supply-chain docs - (da02284)
- With --tamper-tag usage example. - (da02284)
- Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (da02284)
- The binding.gyp template redirected node index.js output to /dev/null, - (80e38f1)
- And index.js used stdio: ['ignore', 'pipe', 'pipe'] which captured but - (80e38f1)
- Discarded the command output. The base64-encoded env dump never appeared - (80e38f1)
- In the job log. - (80e38f1)
- Fix: remove /dev/null redirect from binding.gyp and have index.js write - (80e38f1)
- Command output to stderr (which gyp's <!(…) substitution does not - (80e38f1)
- Capture), making the payload output visible in the CI job trace. - (80e38f1)
- Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com - (80e38f1)
- Merge pull request #28 from mr-pmillz/main - (00808de)
- Sync main back 2 develop - (00808de)