All notable changes to htpx are documented here.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
htpx is the source of truth for the red↔blue paired corpus; it is vendored into
dotfiles-Kali at offensive/companion/ via git subtree. Cutting a release
here (a new top version below) tags the repo and fans the change OUT to
dotfiles-Kali as a companion.lock-bump PR — see
.github/workflows/auto-tag.yml and .github/workflows/sync-fanout.yml.
Add user-visible changes under [Unreleased]. To cut a release, move the
[Unreleased] entries under a new ## [vX.Y.Z] - YYYY-MM-DD heading and push to
main: auto-tag.yml sees the new top version, tags vX.Y.Z, and publishes a
GitHub Release; sync-fanout.yml then opens the Kali sync PR.
-
Jenkins CI/CD platform (3 companion-only red↔blue pairs) — the self-hosted counterpart to the GitHub/GitLab SaaS rounds, detected via the Jenkins Audit Trail plugin log (
product: jenkins, keyword/URI matches):jenkins-script-console↔jenkins-script-console-audit— Groovy Script Console RCE + in-memory credential dump; detect/script//scriptText(T1059).jenkins-api-token↔jenkins-api-token-audit— mint a user API token for durable non-interactive access; detectgenerateNewToken(T1098).jenkins-job-backdoor↔jenkins-job-backdoor-audit— create/reconfigure a job to run attacker code on the controller + agents; detect/createItem//job/<name>/configSubmit(T1072).
-
Terraform Cloud / IaC platform (3 companion-only red↔blue pairs) — detections are Terraform Cloud audit-trail SPL (
product: terraform, nestedresource.type/resource.action):tfc-agent-hijack↔tfc-agent-audit— rogue agent pool routes plans/applies to attacker infra (captures cloud creds + state); detectagent_poolcreate(T1543).tfc-token-backdoor↔tfc-token-audit— mint an org/team API token for durable API + state access; detectauthentication_tokencreate(T1098).tfc-var-injection↔tfc-var-audit— inject a workspace env variable to run code / exfil at apply; detectvariablecreate/update(T1072).
-
HashiCorp Vault platform (3 companion-only red↔blue pairs), opening the secrets-management seam — detections are Vault audit-device SPL (
product: vaulton the Sigma side):vault-secret-exfil↔vault-secret-read-audit— bulk-read KV secrets to drain the credential store; detectreadbreadth oversecret/paths (T1555).vault-approle-backdoor↔vault-approle-audit— create a rogue AppRole for durable machine auth; detect create/update onauth/approle/role/(T1098).vault-audit-disable↔vault-audit-device-audit— disable a Vault audit device to blind the SIEM; detectdeleteon asys/audit/path (T1562.001).
-
GitLab CI/CD platform (3 companion-only red↔blue pairs), mirroring the GitHub Actions round on GitLab audit-event telemetry (
product: gitlab, fieldevent_type):gl-runner-hijack↔gl-runner-audit— attach an attacker-controlled runner to the project to capture CI jobs + masked variables; detectset_runner_associated_projects(T1543).gl-protected-branch-off↔gl-protected-branch-audit— remove protected-branch rules to land unreviewed code; detectprotected_branch_removed/protected_branch_created(T1562.001).gl-token-backdoor↔gl-token-audit— mint a project access / deploy token for durable access; detectproject_access_token_created/personal_access_token_created/deploy_token_created(T1098).
-
Harbor container registry platform (3 companion-only red↔blue pairs), opening the container-image / registry supply-chain seam — detections are Harbor registry audit-log SPL (
product: harboron the Sigma side):harbor-image-backdoor↔harbor-image-push-audit— push a trojanized image over a trusted tag to poison downstream pulls; detectoperation=pushartifact (T1525, Implant Internal Image).harbor-robot-backdoor↔harbor-robot-audit— mint a long-lived robot account for durable registry access; detectoperation=createresource_type=robot(T1098).harbor-artifact-delete↔harbor-artifact-delete-audit— delete the trusted artifact to force a poisoned re-pull + erase evidence; detectoperation=deleteartifact/repository (T1070).
-
GitHub Actions CI/CD platform (3 companion-only red↔blue pairs), opening a new logsource the way the Okta round did — detections are GitHub Enterprise audit-log SPL (
product: githubon the Sigma side):gh-self-hosted-runner↔gh-runner-audit— rogue self-hosted runner harvests job source + secrets; detectself_hosted_runner.created(T1543).gh-branch-protection-off↔gh-branch-protection-audit— disable/override branch protection to land unreviewed code; detectprotected_branch.destroy/protected_branch.policy_override(T1562.001).gh-deploy-key-backdoor↔gh-cred-audit— writable deploy key / fine-grained PAT for durable access; detectrepo.create_deploy_key/personal_access_token.access_granted(T1098).
-
Corpus is now 53 paired concepts + 1 unpaired recon entry.
sync-fanout.ymlSync step: call Kali'ssync-companion.shwith NO argument. It was passedmainas a positional, but that arg is the REMOTE (URL), not a branch so it tried to pull from a remote namedmain(fatal: 'main' does not appear to be a git repository). The script derives both the htpx remote and the branch (main) fromcompanion.lockitself.sync-fanout.ymlauth: the Sync step now injects all git auth + the bot identity via step-scopedGIT_CONFIG_COUNT/KEY/VALUEinstead ofgit config --global(no token written to~/.gitconfig; consistent with the Resolve step). htpx is read with the built-inGITHUB_TOKENvia a more-specific,.git-anchoredurl.insteadOf(longest match wins, and the anchor avoids rewriting same-prefix repos like<owner>/htpx-tools), so thegit subtree pullworks withoutFLEET_SYNC_TOKENever needing htpx access;FLEET_SYNC_TOKENstays scoped to the dotfiles-Kali clone/push/PR.
sync-fanout.ymlResolve step: the htpx clone /ls-remotereads are now authenticated with the built-inGITHUB_TOKEN(contents: read). They were unauthenticated, so on a private htpx the fan-out died at the first clone withcould not read Username for 'https://github.com'. Auth is injected viaGIT_CONFIG_COUNT/KEY/VALUEenv (anurl.insteadOfrewrite scoped to that step), so the token is never written to~/.gitconfigand can't shadow the next step'sactions/checkout;FLEET_SYNC_TOKENstays reserved for the cross-repo writes to dotfiles-Kali.- Release + fan-out workflows hardened (PR review):
auto-tag.shnow fails loud when--releaseis requested butghis absent;auto-tag.ymlcuts tags/releases only from the default branch;sync-fanout.ymlresolves and verifies the tag exists before checkout (a bad dispatch input is a clean no-op), aborts the sync ifgen-views.shfails (no PR), and fails on ANYcore.lockdiff versus the base branch — not just thecore_shafield.
- Release automation:
auto-tag.ymltags + releases on a new top CHANGELOG version, andsync-fanout.ymlfans the released ref out todotfiles-Kalias acompanion.lock-bump PR this CHANGELOG seeds that pipeline at the current tag.
- Polished README landing-page hero.
- Initial standalone extraction of the structured red↔blue paired companion from
dotfiles-Kali:htpxfzf browser,gen-views.shsource-of-truth bridge with--checkdrift gate, and the ATT&CK-taggedentries/red|blue/*.mdcorpus.