{
  "generatedAt": "2026-10-12T16:01:05.493Z",
  "edition": {
    "edition": "2026-Q4",
    "reviewedAt": "2026-10-11",
    "nextReview": "2027-01-15",
    "windowMonths": 12,
    "windowStart": "2025-10-11"
  },
  "note": "Framework mappings are ghtier's own reading. Tags with review: true are not yet confirmed. All window counts use firstSeen and the edition's reviewedAt, not the build date.",
  "frameworks": [
    {
      "id": "owasp-cicd",
      "name": "OWASP Top 10 CI/CD Security Risks",
      "short": "OWASP CI/CD",
      "version": "2022",
      "url": "https://owasp.org/www-project-top-10-ci-cd-security-risks/",
      "status": "seeded",
      "items": [
        {
          "id": "CICD-SEC-1",
          "title": "Insufficient Flow Control Mechanisms",
          "summary": "Code or artifacts can reach production without a second person or an automated gate approving them. On GitHub that is a default branch, tag or release anyone with write access can change alone.",
          "url": "https://owasp.org/www-project-top-10-ci-cd-security-risks/CICD-SEC-01-Insufficient-Flow-Control-Mechanisms"
        },
        {
          "id": "CICD-SEC-2",
          "title": "Inadequate Identity and Access Management",
          "summary": "Too many identities, with too much access, that nobody reviews: stale accounts, shared logins, broad roles and outside collaborators. Every one of them is a way in if its credentials leak.",
          "url": "https://owasp.org/www-project-top-10-ci-cd-security-risks/CICD-SEC-02-Inadequate-Identity-And-Access-Management"
        },
        {
          "id": "CICD-SEC-3",
          "title": "Dependency Chain Abuse",
          "summary": "The build pulls in code the team did not write and cannot fully check, from packages to third-party Actions. A compromised or look-alike dependency runs with the build's own access.",
          "url": "https://owasp.org/www-project-top-10-ci-cd-security-risks/CICD-SEC-03-Dependency-Chain-Abuse"
        },
        {
          "id": "CICD-SEC-4",
          "title": "Poisoned Pipeline Execution (PPE)",
          "summary": "An attacker who can change what the pipeline runs (a workflow file, a script it calls, or input it interpolates) gets the pipeline's secrets and permissions. Pull requests from forks are the usual way.",
          "url": "https://owasp.org/www-project-top-10-ci-cd-security-risks/CICD-SEC-04-Poisoned-Pipeline-Execution"
        },
        {
          "id": "CICD-SEC-5",
          "title": "Insufficient PBAC (Pipeline-Based Access Controls)",
          "summary": "Pipelines and the jobs inside them get more access than they need: write tokens, every secret, shared runners. Once one step is compromised, the rest of the pipeline's access comes with it.",
          "url": "https://owasp.org/www-project-top-10-ci-cd-security-risks/CICD-SEC-05-Insufficient-PBAC"
        },
        {
          "id": "CICD-SEC-6",
          "title": "Insufficient Credential Hygiene",
          "summary": "Long-lived tokens and secrets end up where they can be read: in code, logs, caches, artifacts or a developer's machine. Nobody notices until someone uses them.",
          "url": "https://owasp.org/www-project-top-10-ci-cd-security-risks/CICD-SEC-06-Insufficient-Credential-Hygiene"
        },
        {
          "id": "CICD-SEC-7",
          "title": "Insecure System Configuration",
          "summary": "The CI/CD systems themselves are left unpatched or loosely configured, from self-hosted runners to the source control server. A flaw in the platform bypasses every control built on top of it.",
          "url": "https://owasp.org/www-project-top-10-ci-cd-security-risks/CICD-SEC-07-Insecure-System-Configuration"
        },
        {
          "id": "CICD-SEC-8",
          "title": "Ungoverned Usage of 3rd Party Services",
          "summary": "Third-party apps and services are connected to the organization with broad access and little review. Their compromise becomes yours, through tokens you granted and forgot.",
          "url": "https://owasp.org/www-project-top-10-ci-cd-security-risks/CICD-SEC-08-Ungoverned-Usage-of-3rd-Party-Services"
        },
        {
          "id": "CICD-SEC-9",
          "title": "Improper Artifact Integrity Validation",
          "summary": "Nothing checks that what gets deployed or published is what the build produced from reviewed code. A tampered artifact or a moved tag goes out as if it were genuine.",
          "url": "https://owasp.org/www-project-top-10-ci-cd-security-risks/CICD-SEC-09-Improper-Artifact-Integrity-Validation"
        },
        {
          "id": "CICD-SEC-10",
          "title": "Insufficient Logging and Visibility",
          "summary": "The logs that would show an attack are missing, not collected, or not watched. Incidents are found by outsiders, weeks later, without a trail to follow.",
          "url": "https://owasp.org/www-project-top-10-ci-cd-security-risks/CICD-SEC-10-Insufficient-Logging-And-Visibility"
        }
      ]
    },
    {
      "id": "nist-800-204d",
      "name": "NIST SP 800-204D",
      "short": "NIST 800-204D",
      "version": "February 2024",
      "url": "https://csrc.nist.gov/pubs/sp/800/204/d/final",
      "status": "seeded",
      "items": [
        {
          "id": "5.1.1",
          "title": "Secure build",
          "summary": "Build in isolated, hardened environments and produce signed provenance for what was built. Covers build workers, the build's own dependencies and the attestations it emits.",
          "url": "https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-204D.pdf"
        },
        {
          "id": "5.1.2",
          "title": "Secure pull-push operations on repositories",
          "summary": "Who and what may pull from or push to a repository, and the checks a change goes through on the way in. This is where pull request triggers and repository write access land.",
          "url": "https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-204D.pdf"
        },
        {
          "id": "5.1.3",
          "title": "Integrity of evidence generation during software updates",
          "summary": "The evidence that a release is genuine (signatures, provenance, update metadata) must be produced by a process an attacker cannot tamper with, and must be checked by consumers.",
          "url": "https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-204D.pdf"
        },
        {
          "id": "5.1.4",
          "title": "Secure code commits",
          "summary": "Commits should be attributable and should not carry secrets, which includes scanning and blocking secrets before they are pushed. Signed commits and push protection sit here.",
          "url": "https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-204D.pdf"
        },
        {
          "id": "5.2",
          "title": "Securing workflows in CD pipelines",
          "summary": "Deployment workflows should only deploy what was built and approved, with credentials scoped to the deployment and approvals that cannot be skipped.",
          "url": "https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-204D.pdf"
        },
        {
          "id": "5.2.1",
          "title": "Secure CD pipeline: GitOps case study",
          "summary": "Applies the deployment requirements to GitOps, where the repository is the source of truth for what runs, so repository access becomes deployment access.",
          "url": "https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-204D.pdf"
        },
        {
          "id": "5.3",
          "title": "Implementation strategy",
          "summary": "How to roll the controls out in stages. One item covers the clients that talk to CI/CD systems, such as developer machines and their tools, without detailed requirements.",
          "url": "https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-204D.pdf"
        }
      ]
    },
    {
      "id": "slsa",
      "name": "SLSA",
      "short": "SLSA",
      "url": "https://slsa.dev/",
      "status": "planned",
      "items": []
    },
    {
      "id": "scorecard",
      "name": "OpenSSF Scorecard",
      "short": "Scorecard",
      "url": "https://scorecard.dev/",
      "status": "planned",
      "items": []
    },
    {
      "id": "cis-github",
      "name": "CIS benchmark for GitHub",
      "short": "CIS",
      "status": "planned",
      "items": []
    },
    {
      "id": "nis2",
      "name": "NIS2 Directive",
      "short": "NIS2",
      "status": "planned",
      "items": []
    },
    {
      "id": "dora",
      "name": "DORA",
      "short": "DORA",
      "status": "planned",
      "items": []
    }
  ],
  "incidents": [
    {
      "id": "user-dependabot-impersonation",
      "title": "Dependabot impersonation",
      "scope": "user",
      "owasp": [
        1,
        6,
        10
      ],
      "nist": [
        "5.1.4"
      ],
      "owaspFit": "clean",
      "domains": [
        3,
        5
      ],
      "plane": "data",
      "firstSeen": "2023-07-01",
      "status": "contained",
      "review": true
    },
    {
      "id": "user-mercedes-benz-token-leak",
      "title": "Mercedes-Benz source code exposure",
      "scope": "user",
      "owasp": [
        6
      ],
      "nist": [
        "5.1.4"
      ],
      "owaspFit": "clean",
      "domains": [
        3
      ],
      "plane": "data",
      "firstSeen": "2024-01-01",
      "status": "fixed",
      "review": true
    },
    {
      "id": "user-oauth-consent-phishing",
      "title": "OAuth consent phishing at scale",
      "scope": "user",
      "owasp": [
        2,
        8
      ],
      "nist": [],
      "owaspFit": "clean",
      "domains": [
        2,
        3
      ],
      "plane": "control",
      "firstSeen": "2025-01-01",
      "status": "ongoing",
      "review": true
    },
    {
      "id": "user-circleci-session-theft",
      "title": "CircleCI session-cookie theft",
      "scope": "user",
      "owasp": [
        8,
        6,
        2
      ],
      "nist": [
        "5.3"
      ],
      "owaspFit": "partial",
      "domains": [
        3,
        9
      ],
      "plane": "both",
      "firstSeen": "2022-12-01",
      "lastSeen": "2023-01-01",
      "status": "contained",
      "review": true
    },
    {
      "id": "user-nx-console-github-breach",
      "title": "GitHub's internal repositories taken through a VS Code extension",
      "scope": "user",
      "owasp": [],
      "nist": [
        "5.3"
      ],
      "owaspFit": "none",
      "domains": [
        9
      ],
      "plane": "data",
      "firstSeen": "2026-05-18",
      "lastSeen": "2026-05-20",
      "status": "contained",
      "review": true,
      "scale": {
        "repos": 3800,
        "note": "About 3,800 GitHub-internal repositories",
        "asOf": "2026-05-26",
        "sourceUrl": "https://github.blog/security/investigating-unauthorized-access-to-githubs-internal-repositories/"
      }
    },
    {
      "id": "user-glassworm",
      "title": "GlassWorm: editor extensions that steal GitHub tokens and force-push",
      "scope": "user",
      "owasp": [
        1,
        6
      ],
      "nist": [
        "5.1.4",
        "5.3"
      ],
      "owaspFit": "partial",
      "domains": [
        3,
        5,
        9
      ],
      "plane": "data",
      "firstSeen": "2025-10-17",
      "lastSeen": "2026-03-13",
      "status": "ongoing",
      "review": true,
      "scale": {
        "repos": 151,
        "note": "At least 151 GitHub repositories found by code search in 3 to 9 March 2026; StepSecurity found hundreds more",
        "asOf": "2026-03-13",
        "sourceUrl": "https://www.aikido.dev/blog/glassworm-returns-unicode-attack-github-npm-vscode"
      }
    },
    {
      "id": "app-heroku-travisci-oauth-theft",
      "title": "Heroku / Travis CI OAuth token theft",
      "scope": "application",
      "owasp": [
        8,
        6
      ],
      "nist": [],
      "owaspFit": "clean",
      "domains": [
        3
      ],
      "plane": "both",
      "firstSeen": "2022-04-01",
      "status": "contained",
      "review": true
    },
    {
      "id": "app-tj-actions-changed-files",
      "title": "tj-actions/changed-files supply-chain compromise (CVE-2025-30066)",
      "scope": "application",
      "owasp": [
        3,
        6,
        9
      ],
      "nist": [
        "5.1.1",
        "5.1.3"
      ],
      "owaspFit": "clean",
      "domains": [
        6,
        8
      ],
      "plane": "data",
      "firstSeen": "2025-03-01",
      "status": "contained",
      "review": true
    },
    {
      "id": "app-artipacked",
      "title": "ArtiPACKED artifact token leakage",
      "scope": "application",
      "owasp": [
        6
      ],
      "nist": [
        "5.1.1"
      ],
      "owaspFit": "clean",
      "domains": [
        6
      ],
      "plane": "data",
      "firstSeen": "2024-08-01",
      "status": "ongoing",
      "review": true
    },
    {
      "id": "app-agentic-mcp-tokens",
      "title": "GitHub MCP / agentic token breadth",
      "scope": "application",
      "owasp": [
        2,
        5,
        8
      ],
      "nist": [
        "5.3"
      ],
      "owaspFit": "partial",
      "domains": [
        3,
        9
      ],
      "plane": "data",
      "firstSeen": "2025-05-01",
      "status": "ongoing",
      "review": true
    },
    {
      "id": "app-installation-token-abuse",
      "title": "GitHub App installation token abuse",
      "scope": "application",
      "owasp": [
        8,
        5
      ],
      "nist": [],
      "owaspFit": "clean",
      "domains": [
        3
      ],
      "plane": "data",
      "firstSeen": "2022-01-01",
      "status": "ongoing",
      "review": true
    },
    {
      "id": "org-pwn-requests",
      "title": "\"Pwn requests\": pull_request_target & workflow_run",
      "scope": "organization",
      "owasp": [
        4,
        5
      ],
      "nist": [
        "5.1.2"
      ],
      "owaspFit": "clean",
      "domains": [
        6
      ],
      "plane": "data",
      "firstSeen": "2021-04-01",
      "status": "ongoing",
      "review": true
    },
    {
      "id": "org-ultralytics",
      "title": "Ultralytics build cache poisoning",
      "scope": "organization",
      "owasp": [
        4,
        9,
        6
      ],
      "nist": [
        "5.1.1",
        "5.1.3"
      ],
      "owaspFit": "clean",
      "domains": [
        6,
        8
      ],
      "plane": "data",
      "firstSeen": "2024-12-01",
      "status": "contained",
      "review": true
    },
    {
      "id": "org-nx-s1ngularity",
      "title": "Nx \"s1ngularity\"",
      "scope": "organization",
      "owasp": [
        4,
        6,
        3,
        9
      ],
      "nist": [
        "5.1.2",
        "5.3"
      ],
      "owaspFit": "partial",
      "domains": [
        6,
        8,
        9
      ],
      "plane": "both",
      "firstSeen": "2025-08-01",
      "status": "contained",
      "review": true
    },
    {
      "id": "org-self-hosted-runner-attacks",
      "title": "Self-hosted runner takeovers (PyTorch and others)",
      "scope": "organization",
      "owasp": [
        7,
        4,
        5
      ],
      "nist": [
        "5.1.1"
      ],
      "owaspFit": "clean",
      "domains": [
        7,
        6
      ],
      "plane": "data",
      "firstSeen": "2023-01-01",
      "status": "ongoing",
      "review": true
    },
    {
      "id": "org-ghostaction",
      "title": "GhostAction",
      "scope": "organization",
      "owasp": [
        1,
        6,
        10
      ],
      "nist": [
        "5.1.2",
        "5.1.4"
      ],
      "owaspFit": "clean",
      "domains": [
        3,
        5,
        6
      ],
      "plane": "data",
      "firstSeen": "2025-09-01",
      "lastSeen": "2026-10-09",
      "status": "ongoing",
      "review": true,
      "scale": {
        "repos": 772,
        "accounts": 373,
        "note": "772 repositories of 373 users and organizations in September 2026, then more than 500 accounts committing it from 7 October",
        "asOf": "2026-10-09",
        "sourceUrl": "https://socket.dev/blog/ghostaction-cloud-credentials"
      }
    },
    {
      "id": "org-toptal",
      "title": "Toptal repo-visibility flip and wiper",
      "scope": "organization",
      "owasp": [
        2,
        9
      ],
      "nist": [],
      "owaspFit": "clean",
      "domains": [
        2,
        4,
        8
      ],
      "plane": "both",
      "firstSeen": "2025-07-01",
      "status": "contained",
      "review": true
    },
    {
      "id": "org-salesloft-drift",
      "title": "Salesloft Drift GitHub → AWS pivot",
      "scope": "organization",
      "owasp": [
        8,
        2,
        6
      ],
      "nist": [],
      "owaspFit": "clean",
      "domains": [
        2,
        3
      ],
      "plane": "both",
      "firstSeen": "2025-03-01",
      "lastSeen": "2025-06-01",
      "status": "contained",
      "review": true
    },
    {
      "id": "org-shai-hulud",
      "title": "Shai-Hulud self-propagating worm (1.0 & 2.0)",
      "scope": "organization",
      "owasp": [
        3,
        6,
        9
      ],
      "nist": [
        "5.1.3",
        "5.3"
      ],
      "owaspFit": "partial",
      "domains": [
        3,
        7,
        8,
        9
      ],
      "plane": "both",
      "firstSeen": "2025-09-01",
      "lastSeen": "2026-05-19",
      "status": "contained",
      "review": true,
      "scale": {
        "packages": 317,
        "versions": 630,
        "note": "May 2026 wave: more than 630 malicious versions across 317 npm packages in about 20 minutes",
        "asOf": "2026-05-19",
        "sourceUrl": "https://techcrunch.com/2026/05/19/hackers-have-compromised-dozens-of-popular-open-source-packages-in-an-ongoing-supply-chain-attack/"
      }
    },
    {
      "id": "org-hackerbot-claw",
      "title": "hackerbot-claw autonomous agent RCE",
      "scope": "organization",
      "owasp": [
        4,
        5,
        1
      ],
      "nist": [
        "5.1.2"
      ],
      "owaspFit": "clean",
      "domains": [
        6
      ],
      "plane": "data",
      "firstSeen": "2026-02-01",
      "status": "contained",
      "review": true
    },
    {
      "id": "org-teampcp",
      "title": "TeamPCP tag force-overwrite campaign",
      "scope": "organization",
      "owasp": [
        3,
        6,
        9
      ],
      "nist": [
        "5.1.1",
        "5.1.3"
      ],
      "owaspFit": "clean",
      "domains": [
        6,
        8
      ],
      "plane": "data",
      "firstSeen": "2026-03-01",
      "lastSeen": "2026-04-01",
      "status": "contained",
      "review": true
    },
    {
      "id": "org-cache-poisoning",
      "title": "Actions cache poisoning (Angular, TanStack)",
      "scope": "organization",
      "owasp": [
        4,
        9
      ],
      "nist": [
        "5.1.1"
      ],
      "owaspFit": "clean",
      "domains": [
        6,
        8
      ],
      "plane": "data",
      "firstSeen": "2026-05-11",
      "status": "ongoing",
      "review": true,
      "scale": {
        "packages": 42,
        "versions": 84,
        "note": "TanStack: 84 malicious versions across 42 packages",
        "asOf": "2026-05-11",
        "sourceUrl": "https://tanstack.com/blog/npm-supply-chain-compromise-postmortem"
      }
    },
    {
      "id": "org-prt-scan",
      "title": "prt-scan: automated pull_request_target attacks",
      "scope": "organization",
      "owasp": [
        4,
        5
      ],
      "nist": [
        "5.1.2"
      ],
      "owaspFit": "clean",
      "domains": [
        6
      ],
      "plane": "data",
      "firstSeen": "2026-03-11",
      "lastSeen": "2026-04-03",
      "status": "contained",
      "review": true,
      "scale": {
        "prs": 500,
        "accounts": 6,
        "note": "More than 500 malicious pull requests from six accounts",
        "asOf": "2026-04-04",
        "sourceUrl": "https://www.wiz.io/blog/six-accounts-one-actor-inside-the-prt-scan-supply-chain-campaign"
      }
    },
    {
      "id": "org-megalodon",
      "title": "Megalodon: mass backdooring of CI workflows",
      "scope": "organization",
      "owasp": [
        1,
        4,
        6,
        10
      ],
      "nist": [
        "5.1.2",
        "5.1.4"
      ],
      "owaspFit": "clean",
      "domains": [
        5,
        6
      ],
      "plane": "data",
      "firstSeen": "2026-05-18",
      "status": "contained",
      "wayInConfidence": "unconfirmed",
      "review": true,
      "scale": {
        "commits": 5718,
        "repos": 5561,
        "note": "5,718 commits to 5,561 repositories in about six hours",
        "asOf": "2026-05-21",
        "sourceUrl": "https://safedep.io/megalodon-mass-github-repo-backdooring-ci-workflows/"
      }
    },
    {
      "id": "org-chaindrop",
      "title": "ChainDrop: a hijacked maintainer account publishes through trusted publishing",
      "scope": "organization",
      "owasp": [
        1,
        2,
        9,
        3,
        6
      ],
      "nist": [
        "5.1.2",
        "5.1.3",
        "5.1.4"
      ],
      "owaspFit": "clean",
      "domains": [
        2,
        5,
        8,
        9
      ],
      "plane": "both",
      "firstSeen": "2026-08-04",
      "status": "contained",
      "wayInConfidence": "unconfirmed",
      "review": true,
      "scale": {
        "packages": 444,
        "versions": 2212,
        "note": "2,212 malicious versions of 444 npm packages in about four hours; other trackers count slightly more",
        "asOf": "2026-08-04",
        "sourceUrl": "https://www.stepsecurity.io/blog/chaindrop-npm-worm"
      }
    },
    {
      "id": "ent-cve-2024-4985",
      "title": "CVE-2024-4985: SAML auth bypass",
      "scope": "enterprise",
      "owasp": [
        7,
        2
      ],
      "nist": [],
      "owaspFit": "clean",
      "domains": [
        1,
        2
      ],
      "plane": "platform",
      "firstSeen": "2024-05-01",
      "status": "fixed",
      "review": true
    },
    {
      "id": "ent-cve-2025-11578",
      "title": "CVE-2025-11578: pre-receive hook symlink escape",
      "scope": "enterprise",
      "owasp": [
        7
      ],
      "nist": [],
      "owaspFit": "clean",
      "domains": [
        1
      ],
      "plane": "platform",
      "firstSeen": "2025-10-01",
      "status": "fixed",
      "review": true
    },
    {
      "id": "ent-cve-2025-3509",
      "title": "CVE-2025-3509: pre-receive hook RCE via port reuse",
      "scope": "enterprise",
      "owasp": [
        7
      ],
      "nist": [],
      "owaspFit": "clean",
      "domains": [
        1
      ],
      "plane": "platform",
      "firstSeen": "2025-04-01",
      "status": "fixed",
      "review": true
    },
    {
      "id": "ent-cve-2026-3854",
      "title": "CVE-2026-3854: push-option metadata RCE",
      "scope": "enterprise",
      "owasp": [
        7
      ],
      "nist": [],
      "owaspFit": "clean",
      "domains": [
        1
      ],
      "plane": "platform",
      "firstSeen": "2026-03-01",
      "status": "fixed",
      "review": true
    },
    {
      "id": "ent-cve-2024-1374",
      "title": "CVE-2024-1374: Management Console template injection",
      "scope": "enterprise",
      "owasp": [
        7
      ],
      "nist": [],
      "owaspFit": "clean",
      "domains": [
        1
      ],
      "plane": "platform",
      "firstSeen": "2024-02-01",
      "status": "fixed",
      "review": true
    },
    {
      "id": "ent-cve-2022-23732",
      "title": "CVE-2022-23732: Management Console path traversal / CSRF bypass",
      "scope": "enterprise",
      "owasp": [
        7
      ],
      "nist": [],
      "owaspFit": "clean",
      "domains": [
        1
      ],
      "plane": "platform",
      "firstSeen": "2022-01-01",
      "status": "fixed",
      "review": true
    }
  ],
  "trends": [
    {
      "id": "pr-automation",
      "title": "Pull request attacks are now automated",
      "summary": "Abusing pull_request_target and workflow_run has been a known bug class for years. In 2026 it turned into a scanning operation. hackerbot-claw in February and prt-scan in March and April searched public GitHub for vulnerable workflows and opened malicious pull requests in bulk, and their payloads adapted to common hardening such as label gating. The attacker needs no access to the target repository, only a fork and a workflow that trusts it.",
      "scenarioIds": [
        "org-pwn-requests",
        "org-hackerbot-claw",
        "org-prt-scan",
        "org-ultralytics"
      ],
      "owasp": [
        4,
        5
      ],
      "controlIds": [
        "cicd-audit-pull-request-target",
        "cicd-default-permissions-read",
        "cicd-fork-approval"
      ],
      "status": "established",
      "since": "2026-02-01"
    },
    {
      "id": "mutable-refs",
      "title": "Version tags are a delivery channel",
      "summary": "tj-actions in 2025, and TeamPCP's Trivy and KICS compromises in 2026, moved existing tags on widely used Actions to malicious commits. Every workflow that referenced the tag ran the payload on its next run, with nothing to review on the consumer's side. Pinning to a full commit SHA protects the consumer. Tag rulesets and immutable releases protect the maintainer.",
      "scenarioIds": [
        "app-tj-actions-changed-files",
        "org-teampcp"
      ],
      "owasp": [
        3,
        9
      ],
      "controlIds": [
        "cicd-pin-actions-sha",
        "repo-rulesets",
        "repo-immutable-releases",
        "cicd-verified-actions-only"
      ],
      "status": "established",
      "since": "2025-03-01"
    },
    {
      "id": "mass-commit",
      "title": "One stolen credential, thousands of repositories",
      "summary": "GhostAction and Megalodon pushed credential-stealing workflows straight into repositories, dressed up as CI maintenance and committed under bot-like names. They work wherever a token can push to the default branch with no review in between. Megalodon reached more than five thousand repositories in about six hours, and GhostAction came back in 2026 at a larger scale than its first run.",
      "scenarioIds": [
        "org-ghostaction",
        "org-megalodon",
        "user-dependabot-impersonation"
      ],
      "owasp": [
        1,
        6,
        10
      ],
      "controlIds": [
        "repo-branch-protection",
        "repo-codeowners",
        "repo-signed-commits",
        "auth-disable-classic-pats",
        "auth-pat-expiry-policy",
        "org-audit-log-siem"
      ],
      "status": "emerging",
      "since": "2025-09-01"
    },
    {
      "id": "worms",
      "title": "Package worms turn each victim into the next publisher",
      "summary": "Shai-Hulud, its May 2026 successor and ChainDrop in August 2026 steal npm and GitHub tokens from developer machines and CI runners, then publish infected versions of the victim's own packages. Each new victim becomes a publisher for the next round. Shai-Hulud 2.0 also registered infected machines as self-hosted runners to keep its access. Publishing only from a workflow with a short-lived credential takes away the tokens a worm finds on laptops. It is not enough on its own. ChainDrop started from the keyv maintainer's GitHub account, pushed to main and let the projects' own trusted publishing workflows ship the malware with valid provenance. The publish workflow also needs a protected branch, protected tags and a reviewer.",
      "scenarioIds": [
        "org-shai-hulud",
        "org-nx-s1ngularity",
        "org-chaindrop"
      ],
      "owasp": [
        3,
        6,
        9
      ],
      "controlIds": [
        "cicd-trusted-publishing",
        "repo-artifact-attestation",
        "cicd-oidc-federation",
        "cicd-rotation-runbook",
        "repo-dependabot",
        "auth-audit-stale-creds",
        "cicd-environment-reviewers",
        "repo-rulesets"
      ],
      "status": "established",
      "since": "2025-09-01"
    },
    {
      "id": "dev-endpoint",
      "title": "The developer's workstation is the way in",
      "summary": "A backdoored VS Code extension on one employee's machine led to the theft of about 3,800 of GitHub's own internal repositories, and GlassWorm's extensions took developers' GitHub tokens and used them to force-push malware into hundreds of repositories. Session-cookie theft and token-harvesting worms work the same way: whatever the developer's machine can reach, the attacker can reach. Short-lived tokens, an IP allow list and keeping sensitive work off the laptop limit what one compromised machine is worth.",
      "scenarioIds": [
        "user-nx-console-github-breach",
        "user-circleci-session-theft",
        "org-shai-hulud",
        "org-nx-s1ngularity",
        "user-glassworm"
      ],
      "owasp": [
        6,
        8
      ],
      "controlIds": [
        "org-ip-allowlist",
        "auth-pat-expiry-policy",
        "auth-mfa-org",
        "repo-prevent-branch-deletion"
      ],
      "status": "emerging",
      "since": "2026-05-01"
    },
    {
      "id": "agents",
      "title": "AI agents hold tokens and read untrusted text",
      "summary": "Coding agents and MCP servers act with a person's GitHub token while reading issues, pull requests and files that anyone can write. A prompt injection in one public issue becomes access to every repository the token reaches. Attackers use AI as well: hackerbot-claw and prt-scan automated discovery and payloads, and s1ngularity told victims' own AI command line tools to hunt for secrets on their machines.",
      "scenarioIds": [
        "app-agentic-mcp-tokens",
        "org-hackerbot-claw",
        "org-prt-scan",
        "org-nx-s1ngularity"
      ],
      "owasp": [
        2,
        5,
        8
      ],
      "controlIds": [
        "org-agent-mcp-controls",
        "org-review-installed-apps",
        "org-approval-for-new-apps",
        "auth-pat-expiry-policy"
      ],
      "status": "emerging",
      "since": "2025-05-01"
    },
    {
      "id": "ghes-patching",
      "title": "Self-hosted GHES is a patching race",
      "summary": "GitHub Enterprise Server has had a steady run of serious flaws, from a SAML signature bypass to several ways for an administrator to reach root on the appliance. Each one is fixed in a patch release, and an instance is exposed until it is upgraded. For GHES operators the control is the upgrade cadence, plus keeping the set of site and organization administrators small.",
      "scenarioIds": [
        "ent-cve-2024-4985",
        "ent-cve-2025-11578",
        "ent-cve-2025-3509",
        "ent-cve-2026-3854",
        "ent-cve-2024-1374",
        "ent-cve-2022-23732"
      ],
      "owasp": [
        7
      ],
      "controlIds": [
        "org-limit-owners"
      ],
      "status": "established",
      "since": "2022-01-01",
      "minor": true
    }
  ],
  "gaps": [
    {
      "id": "agents",
      "title": "AI agents and MCP servers",
      "summary": "The OWASP CI/CD list dates from 2022, before coding agents, and NIST SP 800-204D (February 2024) does not cover them either. Neither says anything about an agent that holds a token and reads text anyone can write.",
      "frameworks": [
        "owasp-cicd",
        "nist-800-204d"
      ],
      "scenarioIds": [
        "app-agentic-mcp-tokens",
        "org-nx-s1ngularity"
      ],
      "pointer": {
        "title": "OWASP Top 10 for Agentic Applications for 2026 (GenAI Security Project)",
        "url": "https://genai.owasp.org/resource/owasp-top-10-for-agentic-applications-for-2026/"
      }
    },
    {
      "id": "dev-endpoint",
      "title": "Developer machines and IDE extensions",
      "summary": "OWASP has no category for the developer's own machine. NIST names securing CI/CD clients as one step of its implementation strategy (section 5.3) but sets no requirements for it. Extensions, local tools and the tokens stored next to them fall between the two.",
      "frameworks": [
        "owasp-cicd",
        "nist-800-204d"
      ],
      "scenarioIds": [
        "user-nx-console-github-breach",
        "user-circleci-session-theft",
        "org-shai-hulud",
        "user-glassworm"
      ]
    },
    {
      "id": "worm-propagation",
      "title": "Worms that publish with stolen tokens",
      "summary": "NIST's supply chain model has propagation as a stage, and CICD-SEC-3 covers dependency chain abuse. Neither gives controls for breaking the loop of stolen token, malicious publish, next victim: no long-lived registry tokens, publishing only from a reviewed workflow, and a cooldown before new versions are installed. Trusted publishing helps, but a hijacked maintainer account can still trigger it, as ChainDrop did.",
      "frameworks": [
        "owasp-cicd",
        "nist-800-204d"
      ],
      "scenarioIds": [
        "org-shai-hulud",
        "org-nx-s1ngularity",
        "org-chaindrop"
      ]
    },
    {
      "id": "speed",
      "title": "Speed and scale",
      "summary": "The frameworks treat each misconfiguration on its own: does the control exist or not. Campaigns in 2026 scan all of public GitHub for one misconfiguration and exploit it within hours, so how fast a fix is rolled out across every repository matters as much as whether the control exists.",
      "frameworks": [
        "owasp-cicd",
        "nist-800-204d"
      ],
      "scenarioIds": [
        "org-megalodon",
        "org-prt-scan",
        "org-hackerbot-claw",
        "org-chaindrop"
      ]
    }
  ],
  "sources": [
    {
      "title": "OWASP Top 10 CI/CD Security Risks",
      "url": "https://owasp.org/www-project-top-10-ci-cd-security-risks/",
      "publisher": "OWASP",
      "group": "framework"
    },
    {
      "title": "NIST SP 800-204D: Strategies for the integration of software supply chain security in DevSecOps CI/CD pipelines",
      "url": "https://csrc.nist.gov/pubs/sp/800/204/d/final",
      "publisher": "NIST",
      "published": "2024-02-12",
      "group": "framework"
    },
    {
      "title": "SLSA",
      "url": "https://slsa.dev/",
      "publisher": "OpenSSF",
      "group": "framework",
      "note": "Not mapped yet."
    },
    {
      "title": "OpenSSF Scorecard",
      "url": "https://scorecard.dev/",
      "publisher": "OpenSSF",
      "group": "framework",
      "note": "Not mapped yet."
    },
    {
      "title": "CIS Software Supply Chain Security benchmark",
      "url": "https://www.cisecurity.org/benchmark/software-supply-chain-security",
      "publisher": "CIS",
      "group": "framework",
      "note": "Includes the CIS GitHub benchmark. Not mapped yet."
    },
    {
      "title": "OWASP Top 10 for Agentic Applications for 2026",
      "url": "https://genai.owasp.org/resource/owasp-top-10-for-agentic-applications-for-2026/",
      "publisher": "OWASP GenAI Security Project",
      "published": "2025-12-09",
      "group": "framework"
    },
    {
      "title": "Secure use reference for GitHub Actions",
      "url": "https://docs.github.com/en/actions/reference/security/secure-use",
      "publisher": "GitHub Docs",
      "group": "vendor-docs",
      "note": "Formerly the Actions security hardening guide."
    },
    {
      "title": "Keeping your GitHub Actions and workflows secure: preventing pwn requests",
      "url": "https://securitylab.github.com/resources/github-actions-preventing-pwn-requests/",
      "publisher": "GitHub Security Lab",
      "published": "2021-08-03",
      "group": "vendor-docs"
    },
    {
      "title": "Actions pull_request_target and environment branch protections changes",
      "url": "https://github.blog/changelog/2025-11-07-actions-pull_request_target-and-environment-branch-protections-changes/",
      "publisher": "GitHub Changelog",
      "published": "2025-11-07",
      "group": "vendor-docs"
    },
    {
      "title": "State of Secrets Sprawl 2026",
      "url": "https://www.gitguardian.com/state-of-secrets-sprawl-report-2026",
      "publisher": "GitGuardian",
      "published": "2026-03-17",
      "group": "annual-report"
    },
    {
      "title": "2026 State of the Software Supply Chain",
      "url": "https://www.sonatype.com/state-of-the-software-supply-chain/introduction",
      "publisher": "Sonatype",
      "published": "2026-01-28",
      "group": "annual-report"
    },
    {
      "title": "Software Supply Chain Security Report 2026",
      "url": "https://www.reversinglabs.com/sscs-report",
      "publisher": "ReversingLabs",
      "published": "2025-12-30",
      "group": "annual-report"
    },
    {
      "title": "ENISA Threat Landscape 2026",
      "url": "https://www.enisa.europa.eu/publications/enisa-threat-landscape-2026",
      "publisher": "ENISA",
      "published": "2026-09-22",
      "group": "annual-report"
    }
  ],
  "derived": {
    "flow": [
      {
        "source": "insider-write",
        "target": "platform",
        "plane": "platform",
        "unconfirmed": false,
        "scenarioIds": [
          "ent-cve-2026-3854"
        ]
      },
      {
        "source": "leaked-token",
        "target": "submit-code",
        "plane": "both",
        "unconfirmed": false,
        "scenarioIds": [
          "org-shai-hulud"
        ]
      },
      {
        "source": "leaked-token",
        "target": "submit-code",
        "plane": "data",
        "unconfirmed": false,
        "scenarioIds": [
          "user-dependabot-impersonation",
          "org-ghostaction"
        ]
      },
      {
        "source": "leaked-token",
        "target": "submit-code",
        "plane": "data",
        "unconfirmed": true,
        "scenarioIds": [
          "org-megalodon"
        ]
      },
      {
        "source": "leaked-token",
        "target": "release-tag",
        "plane": "data",
        "unconfirmed": false,
        "scenarioIds": [
          "app-tj-actions-changed-files",
          "org-teampcp"
        ]
      },
      {
        "source": "leaked-token",
        "target": "steal-secrets",
        "plane": "both",
        "unconfirmed": false,
        "scenarioIds": [
          "org-shai-hulud"
        ]
      },
      {
        "source": "leaked-token",
        "target": "steal-secrets",
        "plane": "data",
        "unconfirmed": false,
        "scenarioIds": [
          "user-dependabot-impersonation",
          "app-tj-actions-changed-files",
          "app-artipacked",
          "org-ghostaction"
        ]
      },
      {
        "source": "leaked-token",
        "target": "steal-secrets",
        "plane": "data",
        "unconfirmed": true,
        "scenarioIds": [
          "org-megalodon"
        ]
      },
      {
        "source": "leaked-token",
        "target": "poison-build",
        "plane": "both",
        "unconfirmed": false,
        "scenarioIds": [
          "org-shai-hulud"
        ]
      },
      {
        "source": "leaked-token",
        "target": "poison-build",
        "plane": "data",
        "unconfirmed": false,
        "scenarioIds": [
          "org-teampcp"
        ]
      },
      {
        "source": "leaked-token",
        "target": "poison-build",
        "plane": "data",
        "unconfirmed": true,
        "scenarioIds": [
          "org-megalodon"
        ]
      },
      {
        "source": "leaked-token",
        "target": "expose-code",
        "plane": "both",
        "unconfirmed": false,
        "scenarioIds": [
          "org-shai-hulud"
        ]
      },
      {
        "source": "leaked-token",
        "target": "expose-code",
        "plane": "data",
        "unconfirmed": false,
        "scenarioIds": [
          "user-mercedes-benz-token-leak"
        ]
      },
      {
        "source": "leaked-token",
        "target": "persist",
        "plane": "both",
        "unconfirmed": false,
        "scenarioIds": [
          "org-shai-hulud"
        ]
      },
      {
        "source": "leaked-token",
        "target": "persist",
        "plane": "data",
        "unconfirmed": true,
        "scenarioIds": [
          "org-megalodon"
        ]
      },
      {
        "source": "account-takeover",
        "target": "submit-code",
        "plane": "control",
        "unconfirmed": false,
        "scenarioIds": [
          "user-oauth-consent-phishing"
        ]
      },
      {
        "source": "account-takeover",
        "target": "submit-code",
        "plane": "both",
        "unconfirmed": false,
        "scenarioIds": [
          "org-salesloft-drift"
        ]
      },
      {
        "source": "account-takeover",
        "target": "submit-code",
        "plane": "both",
        "unconfirmed": true,
        "scenarioIds": [
          "org-chaindrop"
        ]
      },
      {
        "source": "account-takeover",
        "target": "delete-history",
        "plane": "both",
        "unconfirmed": true,
        "scenarioIds": [
          "org-chaindrop"
        ]
      },
      {
        "source": "account-takeover",
        "target": "release-tag",
        "plane": "both",
        "unconfirmed": true,
        "scenarioIds": [
          "org-chaindrop"
        ]
      },
      {
        "source": "account-takeover",
        "target": "steal-secrets",
        "plane": "both",
        "unconfirmed": false,
        "scenarioIds": [
          "user-circleci-session-theft",
          "org-salesloft-drift"
        ]
      },
      {
        "source": "account-takeover",
        "target": "steal-secrets",
        "plane": "both",
        "unconfirmed": true,
        "scenarioIds": [
          "org-chaindrop"
        ]
      },
      {
        "source": "account-takeover",
        "target": "poison-build",
        "plane": "both",
        "unconfirmed": false,
        "scenarioIds": [
          "org-toptal"
        ]
      },
      {
        "source": "account-takeover",
        "target": "poison-build",
        "plane": "both",
        "unconfirmed": true,
        "scenarioIds": [
          "org-chaindrop"
        ]
      },
      {
        "source": "account-takeover",
        "target": "expose-code",
        "plane": "control",
        "unconfirmed": false,
        "scenarioIds": [
          "user-oauth-consent-phishing"
        ]
      },
      {
        "source": "account-takeover",
        "target": "expose-code",
        "plane": "both",
        "unconfirmed": false,
        "scenarioIds": [
          "org-toptal",
          "org-salesloft-drift"
        ]
      },
      {
        "source": "account-takeover",
        "target": "persist",
        "plane": "control",
        "unconfirmed": false,
        "scenarioIds": [
          "user-oauth-consent-phishing"
        ]
      },
      {
        "source": "account-takeover",
        "target": "persist",
        "plane": "both",
        "unconfirmed": false,
        "scenarioIds": [
          "org-salesloft-drift"
        ]
      },
      {
        "source": "third-party-app",
        "target": "submit-code",
        "plane": "data",
        "unconfirmed": false,
        "scenarioIds": [
          "app-installation-token-abuse"
        ]
      },
      {
        "source": "third-party-app",
        "target": "expose-code",
        "plane": "both",
        "unconfirmed": false,
        "scenarioIds": [
          "app-heroku-travisci-oauth-theft"
        ]
      },
      {
        "source": "untrusted-input",
        "target": "submit-code",
        "plane": "data",
        "unconfirmed": false,
        "scenarioIds": [
          "org-hackerbot-claw"
        ]
      },
      {
        "source": "untrusted-input",
        "target": "delete-history",
        "plane": "both",
        "unconfirmed": false,
        "scenarioIds": [
          "org-nx-s1ngularity"
        ]
      },
      {
        "source": "untrusted-input",
        "target": "steal-secrets",
        "plane": "both",
        "unconfirmed": false,
        "scenarioIds": [
          "org-nx-s1ngularity"
        ]
      },
      {
        "source": "untrusted-input",
        "target": "steal-secrets",
        "plane": "data",
        "unconfirmed": false,
        "scenarioIds": [
          "org-pwn-requests",
          "org-ultralytics",
          "org-self-hosted-runner-attacks",
          "org-hackerbot-claw",
          "org-cache-poisoning",
          "org-prt-scan"
        ]
      },
      {
        "source": "untrusted-input",
        "target": "poison-build",
        "plane": "both",
        "unconfirmed": false,
        "scenarioIds": [
          "org-nx-s1ngularity"
        ]
      },
      {
        "source": "untrusted-input",
        "target": "poison-build",
        "plane": "data",
        "unconfirmed": false,
        "scenarioIds": [
          "org-ultralytics",
          "org-self-hosted-runner-attacks",
          "org-cache-poisoning"
        ]
      },
      {
        "source": "untrusted-input",
        "target": "expose-code",
        "plane": "both",
        "unconfirmed": false,
        "scenarioIds": [
          "org-nx-s1ngularity"
        ]
      },
      {
        "source": "upstream-dependency",
        "target": "submit-code",
        "plane": "both",
        "unconfirmed": false,
        "scenarioIds": [
          "org-shai-hulud"
        ]
      },
      {
        "source": "upstream-dependency",
        "target": "submit-code",
        "plane": "both",
        "unconfirmed": true,
        "scenarioIds": [
          "org-chaindrop"
        ]
      },
      {
        "source": "upstream-dependency",
        "target": "delete-history",
        "plane": "both",
        "unconfirmed": true,
        "scenarioIds": [
          "org-chaindrop"
        ]
      },
      {
        "source": "upstream-dependency",
        "target": "release-tag",
        "plane": "both",
        "unconfirmed": true,
        "scenarioIds": [
          "org-chaindrop"
        ]
      },
      {
        "source": "upstream-dependency",
        "target": "release-tag",
        "plane": "data",
        "unconfirmed": false,
        "scenarioIds": [
          "app-tj-actions-changed-files",
          "org-teampcp"
        ]
      },
      {
        "source": "upstream-dependency",
        "target": "steal-secrets",
        "plane": "both",
        "unconfirmed": false,
        "scenarioIds": [
          "org-shai-hulud"
        ]
      },
      {
        "source": "upstream-dependency",
        "target": "steal-secrets",
        "plane": "both",
        "unconfirmed": true,
        "scenarioIds": [
          "org-chaindrop"
        ]
      },
      {
        "source": "upstream-dependency",
        "target": "steal-secrets",
        "plane": "data",
        "unconfirmed": false,
        "scenarioIds": [
          "app-tj-actions-changed-files"
        ]
      },
      {
        "source": "upstream-dependency",
        "target": "poison-build",
        "plane": "both",
        "unconfirmed": false,
        "scenarioIds": [
          "org-shai-hulud"
        ]
      },
      {
        "source": "upstream-dependency",
        "target": "poison-build",
        "plane": "both",
        "unconfirmed": true,
        "scenarioIds": [
          "org-chaindrop"
        ]
      },
      {
        "source": "upstream-dependency",
        "target": "poison-build",
        "plane": "data",
        "unconfirmed": false,
        "scenarioIds": [
          "org-teampcp"
        ]
      },
      {
        "source": "upstream-dependency",
        "target": "expose-code",
        "plane": "both",
        "unconfirmed": false,
        "scenarioIds": [
          "org-shai-hulud"
        ]
      },
      {
        "source": "upstream-dependency",
        "target": "persist",
        "plane": "both",
        "unconfirmed": false,
        "scenarioIds": [
          "org-shai-hulud"
        ]
      },
      {
        "source": "dev-tooling",
        "target": "submit-code",
        "plane": "both",
        "unconfirmed": false,
        "scenarioIds": [
          "org-shai-hulud"
        ]
      },
      {
        "source": "dev-tooling",
        "target": "delete-history",
        "plane": "data",
        "unconfirmed": false,
        "scenarioIds": [
          "user-glassworm"
        ]
      },
      {
        "source": "dev-tooling",
        "target": "steal-secrets",
        "plane": "both",
        "unconfirmed": false,
        "scenarioIds": [
          "user-circleci-session-theft",
          "org-shai-hulud"
        ]
      },
      {
        "source": "dev-tooling",
        "target": "poison-build",
        "plane": "both",
        "unconfirmed": false,
        "scenarioIds": [
          "org-shai-hulud"
        ]
      },
      {
        "source": "dev-tooling",
        "target": "poison-build",
        "plane": "data",
        "unconfirmed": false,
        "scenarioIds": [
          "user-glassworm"
        ]
      },
      {
        "source": "dev-tooling",
        "target": "expose-code",
        "plane": "both",
        "unconfirmed": false,
        "scenarioIds": [
          "org-shai-hulud"
        ]
      },
      {
        "source": "dev-tooling",
        "target": "expose-code",
        "plane": "data",
        "unconfirmed": false,
        "scenarioIds": [
          "user-nx-console-github-breach"
        ]
      },
      {
        "source": "dev-tooling",
        "target": "persist",
        "plane": "both",
        "unconfirmed": false,
        "scenarioIds": [
          "org-shai-hulud"
        ]
      },
      {
        "source": "ai-agent",
        "target": "expose-code",
        "plane": "data",
        "unconfirmed": false,
        "scenarioIds": [
          "app-agentic-mcp-tokens"
        ]
      },
      {
        "source": "platform-vuln",
        "target": "platform",
        "plane": "platform",
        "unconfirmed": false,
        "scenarioIds": [
          "ent-cve-2024-4985",
          "ent-cve-2025-11578",
          "ent-cve-2025-3509",
          "ent-cve-2026-3854",
          "ent-cve-2024-1374",
          "ent-cve-2022-23732"
        ]
      }
    ],
    "owaspHeatmap": {
      "columns": [
        {
          "id": "2021",
          "label": "2021"
        },
        {
          "id": "2022",
          "label": "2022"
        },
        {
          "id": "2023",
          "label": "2023"
        },
        {
          "id": "2024",
          "label": "2024"
        },
        {
          "id": "2025",
          "label": "2025"
        },
        {
          "id": "2026",
          "label": "2026"
        },
        {
          "id": "window",
          "label": "Last 12 months"
        }
      ],
      "rows": [
        {
          "owasp": 1,
          "cells": [
            {
              "column": "2021",
              "scenarioIds": []
            },
            {
              "column": "2022",
              "scenarioIds": []
            },
            {
              "column": "2023",
              "scenarioIds": [
                "user-dependabot-impersonation"
              ]
            },
            {
              "column": "2024",
              "scenarioIds": []
            },
            {
              "column": "2025",
              "scenarioIds": [
                "user-glassworm",
                "org-ghostaction"
              ]
            },
            {
              "column": "2026",
              "scenarioIds": [
                "org-hackerbot-claw",
                "org-megalodon",
                "org-chaindrop"
              ]
            },
            {
              "column": "window",
              "scenarioIds": [
                "user-glassworm",
                "org-hackerbot-claw",
                "org-megalodon",
                "org-chaindrop"
              ]
            }
          ]
        },
        {
          "owasp": 2,
          "cells": [
            {
              "column": "2021",
              "scenarioIds": []
            },
            {
              "column": "2022",
              "scenarioIds": [
                "user-circleci-session-theft"
              ]
            },
            {
              "column": "2023",
              "scenarioIds": []
            },
            {
              "column": "2024",
              "scenarioIds": [
                "ent-cve-2024-4985"
              ]
            },
            {
              "column": "2025",
              "scenarioIds": [
                "user-oauth-consent-phishing",
                "app-agentic-mcp-tokens",
                "org-toptal",
                "org-salesloft-drift"
              ]
            },
            {
              "column": "2026",
              "scenarioIds": [
                "org-chaindrop"
              ]
            },
            {
              "column": "window",
              "scenarioIds": [
                "org-chaindrop"
              ]
            }
          ]
        },
        {
          "owasp": 3,
          "cells": [
            {
              "column": "2021",
              "scenarioIds": []
            },
            {
              "column": "2022",
              "scenarioIds": []
            },
            {
              "column": "2023",
              "scenarioIds": []
            },
            {
              "column": "2024",
              "scenarioIds": []
            },
            {
              "column": "2025",
              "scenarioIds": [
                "app-tj-actions-changed-files",
                "org-nx-s1ngularity",
                "org-shai-hulud"
              ]
            },
            {
              "column": "2026",
              "scenarioIds": [
                "org-teampcp",
                "org-chaindrop"
              ]
            },
            {
              "column": "window",
              "scenarioIds": [
                "org-teampcp",
                "org-chaindrop"
              ]
            }
          ]
        },
        {
          "owasp": 4,
          "cells": [
            {
              "column": "2021",
              "scenarioIds": [
                "org-pwn-requests"
              ]
            },
            {
              "column": "2022",
              "scenarioIds": []
            },
            {
              "column": "2023",
              "scenarioIds": [
                "org-self-hosted-runner-attacks"
              ]
            },
            {
              "column": "2024",
              "scenarioIds": [
                "org-ultralytics"
              ]
            },
            {
              "column": "2025",
              "scenarioIds": [
                "org-nx-s1ngularity"
              ]
            },
            {
              "column": "2026",
              "scenarioIds": [
                "org-hackerbot-claw",
                "org-cache-poisoning",
                "org-prt-scan",
                "org-megalodon"
              ]
            },
            {
              "column": "window",
              "scenarioIds": [
                "org-hackerbot-claw",
                "org-cache-poisoning",
                "org-prt-scan",
                "org-megalodon"
              ]
            }
          ]
        },
        {
          "owasp": 5,
          "cells": [
            {
              "column": "2021",
              "scenarioIds": [
                "org-pwn-requests"
              ]
            },
            {
              "column": "2022",
              "scenarioIds": [
                "app-installation-token-abuse"
              ]
            },
            {
              "column": "2023",
              "scenarioIds": [
                "org-self-hosted-runner-attacks"
              ]
            },
            {
              "column": "2024",
              "scenarioIds": []
            },
            {
              "column": "2025",
              "scenarioIds": [
                "app-agentic-mcp-tokens"
              ]
            },
            {
              "column": "2026",
              "scenarioIds": [
                "org-hackerbot-claw",
                "org-prt-scan"
              ]
            },
            {
              "column": "window",
              "scenarioIds": [
                "org-hackerbot-claw",
                "org-prt-scan"
              ]
            }
          ]
        },
        {
          "owasp": 6,
          "cells": [
            {
              "column": "2021",
              "scenarioIds": []
            },
            {
              "column": "2022",
              "scenarioIds": [
                "user-circleci-session-theft",
                "app-heroku-travisci-oauth-theft"
              ]
            },
            {
              "column": "2023",
              "scenarioIds": [
                "user-dependabot-impersonation"
              ]
            },
            {
              "column": "2024",
              "scenarioIds": [
                "user-mercedes-benz-token-leak",
                "app-artipacked",
                "org-ultralytics"
              ]
            },
            {
              "column": "2025",
              "scenarioIds": [
                "user-glassworm",
                "app-tj-actions-changed-files",
                "org-nx-s1ngularity",
                "org-ghostaction",
                "org-salesloft-drift",
                "org-shai-hulud"
              ]
            },
            {
              "column": "2026",
              "scenarioIds": [
                "org-teampcp",
                "org-megalodon",
                "org-chaindrop"
              ]
            },
            {
              "column": "window",
              "scenarioIds": [
                "user-glassworm",
                "org-teampcp",
                "org-megalodon",
                "org-chaindrop"
              ]
            }
          ]
        },
        {
          "owasp": 7,
          "cells": [
            {
              "column": "2021",
              "scenarioIds": []
            },
            {
              "column": "2022",
              "scenarioIds": [
                "ent-cve-2022-23732"
              ]
            },
            {
              "column": "2023",
              "scenarioIds": [
                "org-self-hosted-runner-attacks"
              ]
            },
            {
              "column": "2024",
              "scenarioIds": [
                "ent-cve-2024-4985",
                "ent-cve-2024-1374"
              ]
            },
            {
              "column": "2025",
              "scenarioIds": [
                "ent-cve-2025-11578",
                "ent-cve-2025-3509"
              ]
            },
            {
              "column": "2026",
              "scenarioIds": [
                "ent-cve-2026-3854"
              ]
            },
            {
              "column": "window",
              "scenarioIds": [
                "ent-cve-2026-3854"
              ]
            }
          ]
        },
        {
          "owasp": 8,
          "cells": [
            {
              "column": "2021",
              "scenarioIds": []
            },
            {
              "column": "2022",
              "scenarioIds": [
                "user-circleci-session-theft",
                "app-heroku-travisci-oauth-theft",
                "app-installation-token-abuse"
              ]
            },
            {
              "column": "2023",
              "scenarioIds": []
            },
            {
              "column": "2024",
              "scenarioIds": []
            },
            {
              "column": "2025",
              "scenarioIds": [
                "user-oauth-consent-phishing",
                "app-agentic-mcp-tokens",
                "org-salesloft-drift"
              ]
            },
            {
              "column": "2026",
              "scenarioIds": []
            },
            {
              "column": "window",
              "scenarioIds": []
            }
          ]
        },
        {
          "owasp": 9,
          "cells": [
            {
              "column": "2021",
              "scenarioIds": []
            },
            {
              "column": "2022",
              "scenarioIds": []
            },
            {
              "column": "2023",
              "scenarioIds": []
            },
            {
              "column": "2024",
              "scenarioIds": [
                "org-ultralytics"
              ]
            },
            {
              "column": "2025",
              "scenarioIds": [
                "app-tj-actions-changed-files",
                "org-nx-s1ngularity",
                "org-toptal",
                "org-shai-hulud"
              ]
            },
            {
              "column": "2026",
              "scenarioIds": [
                "org-teampcp",
                "org-cache-poisoning",
                "org-chaindrop"
              ]
            },
            {
              "column": "window",
              "scenarioIds": [
                "org-teampcp",
                "org-cache-poisoning",
                "org-chaindrop"
              ]
            }
          ]
        },
        {
          "owasp": 10,
          "cells": [
            {
              "column": "2021",
              "scenarioIds": []
            },
            {
              "column": "2022",
              "scenarioIds": []
            },
            {
              "column": "2023",
              "scenarioIds": [
                "user-dependabot-impersonation"
              ]
            },
            {
              "column": "2024",
              "scenarioIds": []
            },
            {
              "column": "2025",
              "scenarioIds": [
                "org-ghostaction"
              ]
            },
            {
              "column": "2026",
              "scenarioIds": [
                "org-megalodon"
              ]
            },
            {
              "column": "window",
              "scenarioIds": [
                "org-megalodon"
              ]
            }
          ]
        }
      ],
      "max": 6
    },
    "controlRanking": [
      {
        "id": "repo-artifact-attestation",
        "title": "Adopt artifact attestations for build provenance on published binaries/images",
        "techniqueIds": [
          "cache-poison",
          "malicious-release"
        ],
        "allScenarioIds": [
          "org-cache-poisoning",
          "org-chaindrop",
          "org-megalodon",
          "org-shai-hulud",
          "org-teampcp",
          "org-toptal",
          "org-ultralytics",
          "user-glassworm"
        ],
        "windowScenarioIds": [
          "org-cache-poisoning",
          "org-chaindrop",
          "org-megalodon",
          "org-teampcp",
          "user-glassworm"
        ]
      },
      {
        "id": "cicd-oidc-federation",
        "title": "Cloud credentials migrated from static keys to OIDC federation, scoped to repo + branch",
        "techniqueIds": [
          "inject-workflow",
          "malicious-release"
        ],
        "allScenarioIds": [
          "org-chaindrop",
          "org-ghostaction",
          "org-megalodon",
          "org-salesloft-drift",
          "org-shai-hulud",
          "org-teampcp",
          "org-toptal",
          "user-dependabot-impersonation",
          "user-glassworm"
        ],
        "windowScenarioIds": [
          "org-chaindrop",
          "org-megalodon",
          "org-teampcp",
          "user-glassworm"
        ]
      },
      {
        "id": "cicd-rotation-runbook",
        "title": "Write and rehearse a credential-rotation runbook before you need it",
        "techniqueIds": [
          "session-theft",
          "malicious-release"
        ],
        "allScenarioIds": [
          "org-chaindrop",
          "org-megalodon",
          "org-shai-hulud",
          "org-teampcp",
          "org-toptal",
          "user-circleci-session-theft",
          "user-glassworm"
        ],
        "windowScenarioIds": [
          "org-chaindrop",
          "org-megalodon",
          "org-teampcp",
          "user-glassworm"
        ]
      },
      {
        "id": "cicd-environment-reviewers",
        "title": "Put production secrets in environments with required reviewers",
        "techniqueIds": [
          "malicious-release"
        ],
        "allScenarioIds": [
          "org-chaindrop",
          "org-megalodon",
          "org-shai-hulud",
          "org-teampcp",
          "org-toptal",
          "user-glassworm"
        ],
        "windowScenarioIds": [
          "org-chaindrop",
          "org-megalodon",
          "org-teampcp",
          "user-glassworm"
        ]
      },
      {
        "id": "cicd-trusted-publishing",
        "title": "Publish packages with trusted publishing (OIDC) instead of long-lived registry tokens",
        "techniqueIds": [
          "malicious-release"
        ],
        "allScenarioIds": [
          "org-chaindrop",
          "org-megalodon",
          "org-shai-hulud",
          "org-teampcp",
          "org-toptal",
          "user-glassworm"
        ],
        "windowScenarioIds": [
          "org-chaindrop",
          "org-megalodon",
          "org-teampcp",
          "user-glassworm"
        ]
      },
      {
        "id": "repo-rulesets",
        "title": "Rulesets applied: push restriction, tag protection, sensitive file-path protection",
        "techniqueIds": [
          "no-review",
          "stale-approval",
          "last-push",
          "admin-bypass",
          "push-tag",
          "repoint-tags",
          "inject-workflow",
          "dispatch-publish"
        ],
        "allScenarioIds": [
          "app-installation-token-abuse",
          "app-tj-actions-changed-files",
          "org-chaindrop",
          "org-ghostaction",
          "org-megalodon",
          "org-nx-s1ngularity",
          "org-salesloft-drift",
          "org-shai-hulud",
          "org-teampcp",
          "user-dependabot-impersonation"
        ],
        "windowScenarioIds": [
          "org-chaindrop",
          "org-megalodon",
          "org-teampcp"
        ]
      },
      {
        "id": "cicd-default-permissions-read",
        "title": "Set the default GITHUB_TOKEN permission to read-only at the org level",
        "techniqueIds": [
          "robot-approval",
          "pwn-request",
          "runner-memory",
          "dispatch-publish"
        ],
        "allScenarioIds": [
          "app-artipacked",
          "app-tj-actions-changed-files",
          "org-cache-poisoning",
          "org-hackerbot-claw",
          "org-nx-s1ngularity",
          "org-prt-scan",
          "org-pwn-requests",
          "org-self-hosted-runner-attacks",
          "org-ultralytics"
        ],
        "windowScenarioIds": [
          "org-cache-poisoning",
          "org-hackerbot-claw",
          "org-prt-scan"
        ]
      },
      {
        "id": "repo-branch-protection",
        "title": "Branch protection on default/release branches: required reviews + required status checks",
        "techniqueIds": [
          "no-review",
          "sock-puppet",
          "robot-approval",
          "stale-approval",
          "last-push",
          "dispatch-publish",
          "dormant-workflow"
        ],
        "allScenarioIds": [
          "app-installation-token-abuse",
          "org-chaindrop",
          "org-ghostaction",
          "org-hackerbot-claw",
          "org-megalodon",
          "org-nx-s1ngularity",
          "org-shai-hulud",
          "user-dependabot-impersonation"
        ],
        "windowScenarioIds": [
          "org-chaindrop",
          "org-hackerbot-claw",
          "org-megalodon"
        ]
      },
      {
        "id": "cicd-audit-pull-request-target",
        "title": "Audit every use of pull_request_target and remove or restructure risky ones",
        "techniqueIds": [
          "pwn-request",
          "cache-poison"
        ],
        "allScenarioIds": [
          "org-cache-poisoning",
          "org-hackerbot-claw",
          "org-nx-s1ngularity",
          "org-prt-scan",
          "org-pwn-requests",
          "org-ultralytics"
        ],
        "windowScenarioIds": [
          "org-cache-poisoning",
          "org-hackerbot-claw",
          "org-prt-scan"
        ]
      },
      {
        "id": "org-audit-log-siem",
        "title": "Enable audit logging and export it to a SIEM for retention and detection",
        "techniqueIds": [
          "admin-bypass",
          "force-push",
          "delete-runs",
          "visibility-flip",
          "register-runner",
          "dormant-workflow"
        ],
        "allScenarioIds": [
          "org-chaindrop",
          "org-megalodon",
          "org-nx-s1ngularity",
          "org-shai-hulud",
          "org-toptal",
          "user-glassworm"
        ],
        "windowScenarioIds": [
          "org-chaindrop",
          "org-megalodon",
          "user-glassworm"
        ]
      }
    ]
  }
}
