{
  "updated": "2026-10-11",
  "description": "Every security outcome this site aims to cover, with its status, the guides, fix cards, labs and projects available for it, and what is still missing; planned outcomes and deliberate exclusions are listed with their reasons.",
  "statuses": {
    "covered": "Guides and practice cover the outcome; the gap names what would deepen it.",
    "partial": "Material exists, but named parts of the outcome are not covered yet.",
    "planned": "In scope, with no dedicated material yet.",
    "out-of-scope": "Deliberately not covered; the reason says why."
  },
  "baselines": [
    {
      "key": "asvs",
      "name": "OWASP ASVS",
      "version": "5.0.0",
      "source": "https://github.com/OWASP/ASVS/releases/tag/v5.0.0_release",
      "page": "/asvs/5.0/",
      "role": "Web application verification requirements."
    },
    {
      "key": "wstg",
      "name": "OWASP WSTG",
      "version": "4.2",
      "source": "https://wstg.owasp.org/v4.2/",
      "role": "Testing-method reference, separate from a requirement standard."
    },
    {
      "key": "masvs",
      "name": "OWASP MASVS",
      "version": "2.1.0",
      "source": "https://github.com/OWASP/masvs/releases/tag/v2.1.0",
      "page": "/masvs/2.1/",
      "role": "Mobile security requirements; the OWASP MASTG (v2.0.0) holds the tests."
    },
    {
      "key": "ssdf",
      "name": "NIST SSDF",
      "version": "1.1 (SP 800-218)",
      "source": "https://csrc.nist.gov/pubs/sp/800/218/final",
      "role": "Secure development practices. The version 1.2 draft is tracked on the standards page, not used as a baseline."
    },
    {
      "key": "owasp-top10",
      "name": "OWASP Top 10",
      "version": "2025",
      "source": "https://top10.owasp.org/2025/",
      "page": "/owasp-top-10/2025/",
      "role": "Web application risk categories."
    },
    {
      "key": "owasp-api",
      "name": "OWASP API Security Top 10",
      "version": "2023",
      "source": "https://owasp.org/API-Security/editions/2023/en/0x11-t10/",
      "page": "/owasp-api-top-10/2023/",
      "role": "API risk categories."
    },
    {
      "key": "owasp-llm",
      "name": "OWASP Top 10 for LLM Applications",
      "version": "2026",
      "source": "https://genai.owasp.org/resource/owasp-genai-llm-top-10-2026/",
      "page": "/owasp-llm-top-10/2026/",
      "role": "Risks of applications built on large language models."
    },
    {
      "key": "owasp-agentic",
      "name": "OWASP Top 10 for Agentic Applications",
      "version": "2026",
      "source": "https://genai.owasp.org/resource/owasp-top-10-for-agentic-applications-for-2026/",
      "page": "/owasp-agentic-top-10/2026/",
      "role": "Risks of AI agents that plan and act with tools."
    },
    {
      "key": "nist-ai-600-1",
      "name": "NIST AI 600-1",
      "version": "Generative AI Profile (July 2024)",
      "source": "https://www.nist.gov/publications/artificial-intelligence-risk-management-framework-generative-artificial-intelligence",
      "role": "Generative AI risks and actions, a profile of the NIST AI Risk Management Framework."
    },
    {
      "key": "nist-ai-100-2",
      "name": "NIST AI 100-2",
      "version": "E2025",
      "source": "https://csrc.nist.gov/pubs/ai/100/2/e2025/final",
      "role": "Taxonomy and terminology of adversarial machine learning attacks and mitigations."
    },
    {
      "key": "owasp-kubernetes",
      "name": "OWASP Kubernetes Top 10",
      "version": "2025",
      "source": "https://kubernetes-top10.owasp.org/",
      "page": "/owasp-kubernetes-top-10/2025/",
      "role": "Risks of running workloads on Kubernetes."
    },
    {
      "key": "owasp-cicd",
      "name": "OWASP Top 10 CI/CD Security Risks",
      "version": "v1.0 (2022)",
      "source": "https://owasp.org/www-project-top-10-ci-cd-security-risks/",
      "page": "/owasp-cicd-top-10/2022/",
      "role": "Risks of the systems that build and ship software."
    }
  ],
  "requirements": [
    {
      "id": "APP-01",
      "url": "https://softwaresecurity.com/coverage/#APP-01",
      "domain": "appsec",
      "title": "Query and interpreter boundaries",
      "desiredOutcome": "Untrusted values cannot become query, command, template or expression structure.",
      "status": "covered",
      "depth": "workshop",
      "historical": false,
      "remainingGap": "SQL injection has tested fixes in all ten fix-card stacks, OS command injection in six (Express, Flask, Spring Boot, ASP.NET Core, Next.js and Go), code injection in five (Express, Flask, Spring Boot's SpEL, ASP.NET Core and FastAPI), template injection in four (Express, Flask, Spring Boot and ASP.NET Core), XPath injection in three (Flask, Spring Boot and ASP.NET Core), and NoSQL and LDAP injection in two each (Express and Flask; Spring Boot and Flask). OS command and argument injection, and code, expression-language and template injection, each have a dedicated guide, and browser labs practise SQL injection, command injection and Jinja2 template injection. Not yet covered: command, code, template, XPath, NoSQL and LDAP injection cards for Rails and Laravel (Go has command injection only), and per-stack cards for expression languages other than SpEL.",
      "platforms": [
        "Node.js",
        "Python",
        "Java",
        "C#",
        "cross-platform parser design"
      ],
      "baselineKeys": [
        "asvs",
        "owasp-top10"
      ],
      "identifiers": [
        "CWE-89",
        "CWE-77",
        "CWE-78",
        "CWE-88",
        "CWE-94",
        "CWE-95",
        "CWE-90",
        "CWE-643",
        "CWE-917",
        "CWE-943",
        "CWE-1336"
      ],
      "keywords": [
        "SQL injection",
        "command injection",
        "SSTI",
        "template injection",
        "NoSQL injection",
        "LDAP injection",
        "XPath injection",
        "expression language injection",
        "SpEL",
        "OGNL",
        "eval",
        "argument injection",
        "server-side template injection",
        "eval injection",
        "BatBadBut",
        "Jinja2"
      ],
      "guides": [
        {
          "title": "Fix SQL injection in Python sqlite3",
          "url": "https://softwaresecurity.com/domains/appsec/secure-coding/sql-injection-python-sqlite3/"
        },
        {
          "title": "Keep untrusted values out of executable syntax",
          "url": "https://softwaresecurity.com/domains/appsec/secure-coding/injection-parser-boundaries/"
        },
        {
          "title": "Prevent NoSQL, LDAP, XPath and expression-language injection",
          "url": "https://softwaresecurity.com/domains/appsec/secure-coding/nosql-ldap-xpath-injection/"
        },
        {
          "title": "Run external programs without command or argument injection",
          "url": "https://softwaresecurity.com/domains/appsec/secure-coding/os-command-injection/"
        },
        {
          "title": "Keep untrusted input out of eval, expression languages and templates",
          "url": "https://softwaresecurity.com/domains/appsec/secure-coding/code-template-injection/"
        },
        {
          "title": "Case study: Log4Shell (CVE-2021-44228)",
          "url": "https://softwaresecurity.com/domains/appsec/vulnerability-response/case-study-log4shell/"
        },
        {
          "title": "Case study: MOVEit Transfer mass exploitation (CVE-2023-34362)",
          "url": "https://softwaresecurity.com/domains/appsec/vulnerability-response/case-study-moveit/"
        },
        {
          "title": "Case study: Spring4Shell (CVE-2022-22965)",
          "url": "https://softwaresecurity.com/domains/appsec/secure-coding/case-study-spring4shell/"
        }
      ],
      "fixCards": [
        {
          "title": "Code injection",
          "url": "https://softwaresecurity.com/fix/code-injection/"
        },
        {
          "title": "LDAP filter injection",
          "url": "https://softwaresecurity.com/fix/ldap-injection/"
        },
        {
          "title": "NoSQL operator injection",
          "url": "https://softwaresecurity.com/fix/nosql-injection/"
        },
        {
          "title": "OS command and argument injection",
          "url": "https://softwaresecurity.com/fix/command-injection/"
        },
        {
          "title": "Server-side template injection",
          "url": "https://softwaresecurity.com/fix/template-injection/"
        },
        {
          "title": "SQL injection",
          "url": "https://softwaresecurity.com/fix/sql-injection/"
        },
        {
          "title": "XPath injection",
          "url": "https://softwaresecurity.com/fix/xpath-injection/"
        }
      ],
      "fixStacks": [],
      "workshops": [
        {
          "title": "Actions injection lab: Flag GitHub Actions expression injection",
          "url": "https://softwaresecurity.com/labs/actions-injection/"
        },
        {
          "title": "SQL injection lab: Separate SQL structure from data with sqlite3",
          "url": "https://softwaresecurity.com/labs/sql-injection-sqlite/"
        },
        {
          "title": "OS command injection lab: Run git without a shell",
          "url": "https://softwaresecurity.com/labs/command-injection/"
        },
        {
          "title": "SSTI lab: Render a welcome banner without template injection",
          "url": "https://softwaresecurity.com/labs/template-injection-jinja/"
        },
        {
          "title": "XXE lab: Parse an uploaded invoice without resolving external entities",
          "url": "https://softwaresecurity.com/labs/xxe-lxml/"
        },
        {
          "title": "Pickle deserialization lab: Load a session token without pickle",
          "url": "https://softwaresecurity.com/labs/pickle-deserialization/"
        }
      ],
      "localProjects": [],
      "mappings": [
        {
          "id": "ASVS v5.0.0-1.2.4",
          "inventoryIds": [
            "APP-01"
          ],
          "source": "https://github.com/OWASP/ASVS/blob/v5.0.0_release/5.0/docs_en/OWASP_Application_Security_Verification_Standard_5.0.0_en.flat.json",
          "relationship": "Relevant to the database-query portion."
        }
      ]
    },
    {
      "id": "APP-02",
      "url": "https://softwaresecurity.com/coverage/#APP-02",
      "domain": "appsec",
      "title": "Output contexts and rich text",
      "desiredOutcome": "User content is rendered safely in each parser context: HTML, attributes, URLs, scripts and the DOM.",
      "status": "covered",
      "depth": "workshop",
      "historical": false,
      "remainingGap": "Server-side output encoding has tested fixes in nine stacks, every fix-card stack except FastAPI. Sanitizer and Trusted Types configurations are taught with examples, without a browser-run regression suite.",
      "platforms": [
        "Browser HTML and DOM",
        "server templates"
      ],
      "baselineKeys": [
        "asvs",
        "owasp-top10"
      ],
      "identifiers": [
        "CWE-79",
        "CWE-116"
      ],
      "keywords": [
        "XSS",
        "cross-site scripting",
        "DOM XSS",
        "sanitizer",
        "DOMPurify",
        "Trusted Types",
        "postMessage"
      ],
      "guides": [
        {
          "title": "Prevent XSS at the output boundary",
          "url": "https://softwaresecurity.com/domains/appsec/secure-coding/xss-output-encoding/"
        },
        {
          "title": "Render rich text without granting it application privileges",
          "url": "https://softwaresecurity.com/domains/appsec/browser-security/rich-text-dom-security/"
        },
        {
          "title": "Prevent DOM XSS, postMessage abuse and client-side injection",
          "url": "https://softwaresecurity.com/domains/appsec/browser-security/dom-xss-postmessage/"
        }
      ],
      "fixCards": [
        {
          "title": "Cross-site scripting (XSS)",
          "url": "https://softwaresecurity.com/fix/xss/"
        }
      ],
      "fixStacks": [],
      "workshops": [
        {
          "title": "XSS lab: Render a model’s answer as text instead of active markup",
          "url": "https://softwaresecurity.com/labs/output-rendering/"
        },
        {
          "title": "HTML sanitization lab: Configure a sanitizer for user comments",
          "url": "https://softwaresecurity.com/labs/html-sanitizer/"
        }
      ],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "APP-03",
      "url": "https://softwaresecurity.com/coverage/#APP-03",
      "domain": "appsec",
      "title": "Object, action and field permissions",
      "desiredOutcome": "Every sensitive read or write checks the current actor, tenant, action and object relationship.",
      "status": "covered",
      "depth": "project",
      "historical": false,
      "remainingGap": "Add revocation tests across distributed caches and examples for policy engines other than OPA.",
      "platforms": [
        "HTTP APIs",
        "Node.js and Express"
      ],
      "baselineKeys": [
        "asvs",
        "wstg",
        "owasp-top10",
        "owasp-api"
      ],
      "identifiers": [
        "CWE-639",
        "CWE-862",
        "CWE-863",
        "CWE-915",
        "CWE-284",
        "CWE-285"
      ],
      "keywords": [
        "IDOR",
        "BOLA",
        "BFLA",
        "BOPLA",
        "broken access control",
        "mass assignment",
        "RBAC",
        "ABAC",
        "ReBAC"
      ],
      "guides": [
        {
          "title": "Enforce authorization for every object action",
          "url": "https://softwaresecurity.com/domains/appsec/authorization/object-level-authorization/"
        },
        {
          "title": "Authorize functions and fields as well as objects",
          "url": "https://softwaresecurity.com/domains/appsec/authorization/function-property-authorization/"
        },
        {
          "title": "Authorization models: RBAC, ABAC, ReBAC and policy as code you can test",
          "url": "https://softwaresecurity.com/domains/identity-crypto/identity/authorization-models/"
        },
        {
          "title": "Case study: First American's EaglePro document exposure (2019)",
          "url": "https://softwaresecurity.com/domains/appsec/authorization/case-study-first-american/"
        },
        {
          "title": "Review tenant boundaries before implementation",
          "url": "https://softwaresecurity.com/domains/appsec/threat-modeling/multitenant-design-review/"
        },
        {
          "title": "Review a code change through its trust boundaries",
          "url": "https://softwaresecurity.com/domains/appsec/code-review/security-code-review/"
        }
      ],
      "fixCards": [
        {
          "title": "Missing object-level authorization (IDOR and BOLA)",
          "url": "https://softwaresecurity.com/fix/missing-authorization/"
        },
        {
          "title": "Mass assignment (over-posting)",
          "url": "https://softwaresecurity.com/fix/mass-assignment/"
        }
      ],
      "fixStacks": [],
      "workshops": [
        {
          "title": "RAG access control lab: Stop a retriever from returning another tenant’s documents",
          "url": "https://softwaresecurity.com/labs/rag-isolation/"
        },
        {
          "title": "Excessive agency lab: Bind an agent’s action to the approved arguments",
          "url": "https://softwaresecurity.com/labs/agent-tool-gateway/"
        },
        {
          "title": "IDOR lab: Repair an invoice authorization bug",
          "url": "https://softwaresecurity.com/labs/authorization/"
        },
        {
          "title": "Mass assignment lab: Update only the fields users may edit",
          "url": "https://softwaresecurity.com/labs/mass-assignment/"
        },
        {
          "title": "IAM trust policy lab: Evaluate a role trust policy against the confused deputy",
          "url": "https://softwaresecurity.com/labs/iam-trust-policy/"
        }
      ],
      "localProjects": [
        {
          "title": "Secure a real HTTP API",
          "url": "https://softwaresecurity.com/downloads/projects/express-api-519f6cf7960d8d96.zip",
          "limits": "Localhost tests with synthetic identities and in-memory records; includes actual JOSE verification."
        }
      ],
      "mappings": [
        {
          "id": "ASVS v5.0.0-8.2.2",
          "inventoryIds": [
            "APP-03"
          ],
          "source": "https://github.com/OWASP/ASVS/blob/v5.0.0_release/5.0/docs_en/OWASP_Application_Security_Verification_Standard_5.0.0_en.flat.json",
          "relationship": "Relevant to per-object data access."
        },
        {
          "id": "ASVS v5.0.0-8.4.1",
          "inventoryIds": [
            "APP-03"
          ],
          "source": "https://github.com/OWASP/ASVS/blob/v5.0.0_release/5.0/docs_en/OWASP_Application_Security_Verification_Standard_5.0.0_en.flat.json",
          "relationship": "Relevant to cross-tenant isolation."
        },
        {
          "id": "WSTG v4.2 WSTG-ATHZ-04",
          "inventoryIds": [
            "APP-03"
          ],
          "source": "https://wstg.owasp.org/v4.2/4-Web_Application_Security_Testing/05-Authorization_Testing/04-Testing_for_Insecure_Direct_Object_References/",
          "relationship": "Supports a method for changing object references across authorized test accounts."
        }
      ]
    },
    {
      "id": "APP-04",
      "url": "https://softwaresecurity.com/coverage/#APP-04",
      "domain": "appsec",
      "title": "Browser request and response policy",
      "desiredOutcome": "Browser session authority cannot be exercised from an unauthorized origin, and responses carry the policies the page needs.",
      "status": "covered",
      "depth": "workshop",
      "historical": false,
      "remainingGap": "Clickjacking now has tested fix cards (Express and Next.js) that set CSP frame-ancestors and X-Frame-Options. Add browser-engine tests that check SameSite, CORS preflight and CSP enforcement in current Chrome, Firefox and Safari.",
      "platforms": [
        "Cookie-authenticated browsers"
      ],
      "baselineKeys": [
        "asvs",
        "wstg",
        "owasp-top10"
      ],
      "identifiers": [
        "CWE-352",
        "CWE-942",
        "CWE-346",
        "CWE-1021",
        "CWE-1275",
        "CWE-1385"
      ],
      "keywords": [
        "CSRF",
        "CORS",
        "CSP",
        "Content Security Policy",
        "SameSite",
        "clickjacking",
        "HSTS",
        "security headers"
      ],
      "guides": [
        {
          "title": "Protect cookie-authenticated actions against CSRF",
          "url": "https://softwaresecurity.com/domains/appsec/browser-security/csrf-origin-defense/"
        },
        {
          "title": "Configure CORS and CSP around the browser capabilities you need",
          "url": "https://softwaresecurity.com/domains/appsec/browser-security/cors-csp-browser-boundaries/"
        },
        {
          "title": "Configure HTTP security headers from a tested baseline",
          "url": "https://softwaresecurity.com/domains/appsec/browser-security/security-headers/"
        }
      ],
      "fixCards": [
        {
          "title": "Cross-site request forgery (CSRF)",
          "url": "https://softwaresecurity.com/fix/csrf/"
        },
        {
          "title": "CORS misconfiguration on credentialed APIs",
          "url": "https://softwaresecurity.com/fix/cors-misconfiguration/"
        },
        {
          "title": "Clickjacking",
          "url": "https://softwaresecurity.com/fix/clickjacking/"
        }
      ],
      "fixStacks": [],
      "workshops": [
        {
          "title": "CSRF lab: Protect an account change from a forged request",
          "url": "https://softwaresecurity.com/labs/csrf/"
        },
        {
          "title": "CORS policy lab: Grant CORS to the right origins only",
          "url": "https://softwaresecurity.com/labs/cors-policy/"
        },
        {
          "title": "CSP builder lab: Build a strict Content-Security-Policy",
          "url": "https://softwaresecurity.com/labs/csp-policy/"
        }
      ],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "APP-05",
      "url": "https://softwaresecurity.com/coverage/#APP-05",
      "domain": "appsec",
      "title": "Upload and archive lifecycle",
      "desiredOutcome": "Untrusted files stay private, bounded and inside an authorized storage location.",
      "status": "covered",
      "depth": "project",
      "historical": false,
      "remainingGap": "Add malware-scanner outage and image-decoder isolation cases; filesystem race tests remain environment-specific.",
      "platforms": [
        "File services",
        "archive extraction"
      ],
      "baselineKeys": [
        "asvs",
        "owasp-top10"
      ],
      "identifiers": [
        "CWE-434",
        "CWE-22",
        "CWE-23",
        "CWE-59",
        "CWE-73",
        "CWE-646"
      ],
      "keywords": [
        "file upload",
        "path traversal",
        "Zip Slip",
        "archive extraction",
        "symlink"
      ],
      "guides": [
        {
          "title": "Design a safer file-upload pipeline",
          "url": "https://softwaresecurity.com/domains/appsec/secure-features/secure-file-uploads/"
        },
        {
          "title": "Extract archives without escaping the destination",
          "url": "https://softwaresecurity.com/domains/appsec/secure-features/archive-path-safety/"
        }
      ],
      "fixCards": [
        {
          "title": "Path traversal",
          "url": "https://softwaresecurity.com/fix/path-traversal/"
        },
        {
          "title": "Unrestricted file upload",
          "url": "https://softwaresecurity.com/fix/file-upload/"
        }
      ],
      "fixStacks": [],
      "workshops": [
        {
          "title": "Path traversal lab: Keep archive entries inside their extraction directory",
          "url": "https://softwaresecurity.com/labs/archive-paths/"
        },
        {
          "title": "Path traversal lab: Serve an uploaded file without path traversal",
          "url": "https://softwaresecurity.com/labs/path-traversal-python/"
        },
        {
          "title": "File upload lab: Accept avatars without publishing pages",
          "url": "https://softwaresecurity.com/labs/file-upload/"
        }
      ],
      "localProjects": [
        {
          "title": "Keep extracted files inside their boundary",
          "url": "https://softwaresecurity.com/downloads/projects/archive-extraction-e31e8b17b78e9134.zip",
          "limits": "Temporary directories, generated ZIPs and an independent containment guard keep deliberately broken policy code inside the exercise."
        }
      ],
      "mappings": []
    },
    {
      "id": "APP-06",
      "url": "https://softwaresecurity.com/coverage/#APP-06",
      "domain": "appsec",
      "title": "Outbound requests and redirects",
      "desiredOutcome": "Server-side fetches reach only intended destinations, and redirects send users only where the application allows.",
      "status": "covered",
      "depth": "workshop",
      "historical": false,
      "remainingGap": "Add DNS-rebinding and redirect-chain tests against a controlled resolver and egress proxy.",
      "platforms": [
        "HTTP clients",
        "DNS",
        "network egress"
      ],
      "baselineKeys": [
        "asvs",
        "owasp-top10"
      ],
      "identifiers": [
        "CWE-918",
        "CWE-601"
      ],
      "keywords": [
        "SSRF",
        "server-side request forgery",
        "open redirect",
        "egress",
        "cloud metadata",
        "IMDS"
      ],
      "guides": [
        {
          "title": "Constrain server-side fetches to their intended destinations",
          "url": "https://softwaresecurity.com/domains/appsec/secure-features/ssrf-egress-boundaries/"
        },
        {
          "title": "Redirect users only to destinations you control",
          "url": "https://softwaresecurity.com/domains/appsec/secure-features/open-redirect/"
        }
      ],
      "fixCards": [
        {
          "title": "Open redirect",
          "url": "https://softwaresecurity.com/fix/open-redirect/"
        },
        {
          "title": "Server-side request forgery (SSRF)",
          "url": "https://softwaresecurity.com/fix/ssrf/"
        }
      ],
      "fixStacks": [],
      "workshops": [
        {
          "title": "SSRF lab: Guard an outbound fetch against SSRF",
          "url": "https://softwaresecurity.com/labs/ssrf-url-policy/"
        },
        {
          "title": "SSRF validation lab: Validate a fetch URL with ipaddress",
          "url": "https://softwaresecurity.com/labs/ssrf-validation-python/"
        },
        {
          "title": "Open redirect lab: Return users to this site only",
          "url": "https://softwaresecurity.com/labs/safe-redirect/"
        },
        {
          "title": "OAuth redirect and PKCE lab: Match redirect URIs and verify PKCE",
          "url": "https://softwaresecurity.com/labs/oauth-redirect-pkce/"
        }
      ],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "APP-07",
      "url": "https://softwaresecurity.com/coverage/#APP-07",
      "domain": "appsec",
      "title": "Business logic and concurrent effects",
      "desiredOutcome": "Retries, concurrent requests and unusual sequences preserve balances, stock, workflow order and one logical effect.",
      "status": "covered",
      "depth": "project",
      "historical": false,
      "remainingGap": "Add durable outbox recovery for external payments; the SQLite project does not establish every database's locking behavior.",
      "platforms": [
        "Python and SQLite",
        "signed HTTP callbacks"
      ],
      "baselineKeys": [
        "asvs",
        "wstg"
      ],
      "identifiers": [
        "CWE-362",
        "CWE-367",
        "CWE-837",
        "CWE-841",
        "CWE-799"
      ],
      "keywords": [
        "race condition",
        "business logic",
        "idempotency",
        "TOCTOU",
        "price tampering",
        "workflow bypass",
        "webhook"
      ],
      "guides": [
        {
          "title": "Preserve business invariants under concurrent requests",
          "url": "https://softwaresecurity.com/domains/appsec/business-logic/transaction-races/"
        },
        {
          "title": "Prevent business-logic flaws with server-side invariants",
          "url": "https://softwaresecurity.com/domains/appsec/business-logic/business-logic-flaws/"
        },
        {
          "title": "Verify webhook deliveries before acting",
          "url": "https://softwaresecurity.com/domains/appsec/secure-features/verify-webhook-deliveries/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [
        {
          "title": "Race condition lab: Repair a balance check that races",
          "url": "https://softwaresecurity.com/labs/checkout-race/"
        },
        {
          "title": "Webhook signature and replay lab: Repair a webhook handler that pays twice",
          "url": "https://softwaresecurity.com/labs/webhooks/"
        },
        {
          "title": "Business logic lab: Price an order without trusting the client",
          "url": "https://softwaresecurity.com/labs/coupon-limits/"
        }
      ],
      "localProjects": [
        {
          "title": "Make a checkout transaction atomic",
          "url": "https://softwaresecurity.com/downloads/projects/checkout-sqlite-0f06facdf0c0bb1b.zip",
          "limits": "Uses isolated temporary databases and real concurrent connections; test the locking semantics of your production database separately."
        }
      ],
      "mappings": []
    },
    {
      "id": "APP-08",
      "url": "https://softwaresecurity.com/coverage/#APP-08",
      "domain": "appsec",
      "title": "Threat modeling and design review",
      "desiredOutcome": "Designs are reviewed against named threats before implementation, and each finding becomes a requirement or a test.",
      "status": "covered",
      "depth": "scenario",
      "historical": false,
      "remainingGap": "Add worked models for more architectures, such as event-driven systems and mobile back ends.",
      "platforms": [
        "Application design"
      ],
      "baselineKeys": [
        "asvs",
        "ssdf"
      ],
      "identifiers": [],
      "keywords": [
        "threat model",
        "threat modeling",
        "STRIDE",
        "PASTA",
        "LINDDUN",
        "attack tree",
        "data flow diagram",
        "design review"
      ],
      "guides": [
        {
          "title": "Choose a threat modeling method and turn its findings into tests",
          "url": "https://softwaresecurity.com/domains/appsec/threat-modeling/threat-modeling-methods/"
        },
        {
          "title": "Review tenant boundaries before implementation",
          "url": "https://softwaresecurity.com/domains/appsec/threat-modeling/multitenant-design-review/"
        },
        {
          "title": "Threat pattern library for threat modeling",
          "url": "https://softwaresecurity.com/domains/appsec/threat-modeling/threat-pattern-library/"
        },
        {
          "title": "Worked threat model: a mobile banking app",
          "url": "https://softwaresecurity.com/domains/appsec/threat-modeling/mobile-banking-threat-model/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "APP-09",
      "url": "https://softwaresecurity.com/coverage/#APP-09",
      "domain": "appsec",
      "title": "Failure behavior and diagnostic exposure",
      "desiredOutcome": "Unexpected failures keep security decisions intact and reveal no sensitive internals.",
      "status": "covered",
      "depth": "scenario",
      "historical": false,
      "remainingGap": "Add dependency-outage, partial-write and timing regression projects. Production debug and error-detail settings have a guide and a deployment probe, but no per-stack fix cards.",
      "platforms": [
        "Request handlers and workers"
      ],
      "baselineKeys": [
        "asvs",
        "owasp-top10"
      ],
      "identifiers": [
        "CWE-209",
        "CWE-636",
        "CWE-460"
      ],
      "keywords": [
        "error handling",
        "stack trace",
        "fail open",
        "information disclosure",
        "exceptional conditions",
        "security misconfiguration",
        "debug mode",
        "directory listing",
        "source maps",
        "Spring Boot Actuator",
        "exposed .git"
      ],
      "guides": [
        {
          "title": "Handle failures without leaking internals or weakening controls",
          "url": "https://softwaresecurity.com/domains/appsec/secure-coding/secure-error-handling/"
        },
        {
          "title": "Ship without debug modes, verbose errors or exposed files",
          "url": "https://softwaresecurity.com/domains/appsec/secure-coding/information-disclosure-misconfiguration/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "APP-10",
      "url": "https://softwaresecurity.com/coverage/#APP-10",
      "domain": "appsec",
      "title": "Security testing and review in the pipeline",
      "desiredOutcome": "Findings come with a cause, a reproduction, a fix and a regression test, and the pipeline runs the checks that block a release.",
      "status": "covered",
      "depth": "scenario",
      "historical": false,
      "remainingGap": "Add a downloadable reference pipeline that runs real scanners end to end, and continuous fuzzing with OSS-Fuzz or ClusterFuzzLite.",
      "platforms": [
        "Source review",
        "dynamic testing",
        "CI pipelines"
      ],
      "baselineKeys": [
        "asvs",
        "wstg",
        "ssdf"
      ],
      "identifiers": [],
      "keywords": [
        "DevSecOps",
        "SAST",
        "DAST",
        "IAST",
        "SCA",
        "code review",
        "fuzzing",
        "CI pipeline",
        "security gates"
      ],
      "guides": [
        {
          "title": "Review a code change through its trust boundaries",
          "url": "https://softwaresecurity.com/domains/appsec/code-review/security-code-review/"
        },
        {
          "title": "Combine static and dynamic tests around a verified finding",
          "url": "https://softwaresecurity.com/domains/appsec/testing/sast-dast-workflow/"
        },
        {
          "title": "Place each security control in the pipeline and decide what it blocks",
          "url": "https://softwaresecurity.com/domains/appsec/testing/devsecops-pipeline/"
        },
        {
          "title": "Fuzz a parser and turn crashes into lasting regressions",
          "url": "https://softwaresecurity.com/domains/appsec/testing/parser-fuzzing/"
        },
        {
          "title": "Choose and evaluate application security testing tools",
          "url": "https://softwaresecurity.com/domains/appsec/testing/appsec-tool-categories-and-evaluation/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": [
        {
          "id": "SSDF 1.1 PW.8.2",
          "inventoryIds": [
            "APP-10",
            "GOV-02"
          ],
          "source": "https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-218.pdf",
          "relationship": "Relevant to scoped testing and retained outcomes."
        }
      ]
    },
    {
      "id": "APP-11",
      "url": "https://softwaresecurity.com/coverage/#APP-11",
      "domain": "appsec",
      "title": "Framework controls and stack-specific fixes",
      "desiredOutcome": "Middleware, object mapping and response handling keep the framework's protections, and each fix is shown in the team's own stack.",
      "status": "covered",
      "depth": "fix",
      "historical": false,
      "remainingGap": "Fix cards give tested code for ten stacks: Express, Flask, Spring Boot and ASP.NET Core for 21 to 24 of the 24 weaknesses, Go's net/http for 12, FastAPI, Next.js and Laravel for nine each, and Django and Rails for eight; each stack has a page with its supported versions and production defaults. The newer stacks still lack cards for some weaknesses, such as command injection, deserialization and template injection in Rails and Laravel, and Go web frameworks such as Gin and Echo, Symfony and NestJS have no cards of their own.",
      "platforms": [
        "Express",
        "Flask",
        "Spring Boot",
        "ASP.NET Core",
        "Next.js",
        "FastAPI",
        "Django",
        "Go net/http",
        "Rails",
        "Laravel"
      ],
      "baselineKeys": [
        "asvs"
      ],
      "identifiers": [],
      "keywords": [
        "Django",
        "Rails",
        "Laravel",
        "Go",
        "Next.js",
        "Spring Security",
        "ASP.NET Core",
        "Express",
        "Flask",
        "framework",
        "net/http",
        "Ruby",
        "PHP",
        "Spring4Shell",
        "data binding"
      ],
      "guides": [
        {
          "title": "Preserve framework security controls across the request lifecycle",
          "url": "https://softwaresecurity.com/domains/appsec/secure-coding/framework-security-patterns/"
        },
        {
          "title": "Case study: Spring4Shell (CVE-2022-22965)",
          "url": "https://softwaresecurity.com/domains/appsec/secure-coding/case-study-spring4shell/"
        },
        {
          "title": "Ship without debug modes, verbose errors or exposed files",
          "url": "https://softwaresecurity.com/domains/appsec/secure-coding/information-disclosure-misconfiguration/"
        }
      ],
      "fixCards": [],
      "fixStacks": [
        {
          "title": "Node.js and Express",
          "url": "https://softwaresecurity.com/fix/stack/node-express/"
        },
        {
          "title": "Python and Flask",
          "url": "https://softwaresecurity.com/fix/stack/python-flask/"
        },
        {
          "title": "Java and Spring Boot",
          "url": "https://softwaresecurity.com/fix/stack/java-spring/"
        },
        {
          "title": "C# and ASP.NET Core",
          "url": "https://softwaresecurity.com/fix/stack/csharp-aspnetcore/"
        },
        {
          "title": "TypeScript and Next.js",
          "url": "https://softwaresecurity.com/fix/stack/typescript-nextjs/"
        },
        {
          "title": "Python and FastAPI",
          "url": "https://softwaresecurity.com/fix/stack/python-fastapi/"
        },
        {
          "title": "Python and Django",
          "url": "https://softwaresecurity.com/fix/stack/python-django/"
        },
        {
          "title": "Go and net/http",
          "url": "https://softwaresecurity.com/fix/stack/go-nethttp/"
        },
        {
          "title": "Ruby on Rails",
          "url": "https://softwaresecurity.com/fix/stack/ruby-rails/"
        },
        {
          "title": "PHP and Laravel",
          "url": "https://softwaresecurity.com/fix/stack/php-laravel/"
        }
      ],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "APP-12",
      "url": "https://softwaresecurity.com/coverage/#APP-12",
      "domain": "appsec",
      "title": "Mobile platform boundaries",
      "desiredOutcome": "Storage, deep links, platform permissions and server calls keep their intended authority on Android and iOS.",
      "status": "covered",
      "depth": "project",
      "historical": false,
      "remainingGap": "The iOS project runs XCTest in the Simulator and the Android project runs Robolectric and Android Lint in a container, mapped to MASTG 2.0 tests. Add device and emulator runs for what those can't show: Data Protection classes, App Links and universal-link verification against live association files, runtime permission denial, and App Attest or Play Integrity checked on a server. Every MASVS 2.1 control has a page mapping it to the guides and MASTG tests here; enforced app updates (MASVS-CODE-2), dependency scanning in mobile build systems (MASVS-CODE-3) and implementing the resilience controls (MASVS-RESILIENCE-3 and -4) have no guide yet.",
      "platforms": [
        "Android",
        "iOS"
      ],
      "baselineKeys": [
        "masvs"
      ],
      "identifiers": [],
      "keywords": [
        "Android",
        "iOS",
        "mobile",
        "MASVS",
        "MASTG",
        "Kotlin",
        "Swift",
        "deep links",
        "Keychain",
        "Keystore",
        "XCTest",
        "Robolectric",
        "App Transport Security",
        "network security config",
        "MASVS 2.1"
      ],
      "guides": [
        {
          "title": "Harden an Android app's storage, network and entry points",
          "url": "https://softwaresecurity.com/domains/appsec/platform-security/android-secure-coding/"
        },
        {
          "title": "Harden an iOS app's storage, network and entry points",
          "url": "https://softwaresecurity.com/domains/appsec/platform-security/ios-secure-coding/"
        },
        {
          "title": "Review mobile storage, links and platform permissions",
          "url": "https://softwaresecurity.com/domains/appsec/platform-security/android-ios-security/"
        },
        {
          "title": "Review trust boundaries in mobile and native clients",
          "url": "https://softwaresecurity.com/domains/appsec/platform-security/mobile-native-trust-boundaries/"
        },
        {
          "title": "Worked threat model: a mobile banking app",
          "url": "https://softwaresecurity.com/domains/appsec/threat-modeling/mobile-banking-threat-model/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [
        {
          "title": "Keep an iOS app's storage, links and web bridge in bounds",
          "url": "https://softwaresecurity.com/downloads/projects/ios-platform-boundaries-5d4c4cd9417f9c64.zip",
          "limits": "Real Keychain, ATS and WebKit behavior in the Simulator. Data Protection and universal-link association need a device or a signed build. Verified with Xcode 27.0 on iOS 27.0 and 26.5."
        },
        {
          "title": "Repair an Android app's links, components, network policy and storage",
          "url": "https://softwaresecurity.com/downloads/projects/android-platform-boundaries-52934d7ed9eeeff3.zip",
          "limits": "JVM tests on Robolectric's Android 16 framework plus Lint, not an emulator: the Keystore and network configuration are checked as key specification and compiled resource."
        }
      ],
      "mappings": []
    },
    {
      "id": "APP-13",
      "url": "https://softwaresecurity.com/coverage/#APP-13",
      "domain": "appsec",
      "title": "Desktop and device privilege separation",
      "desiredOutcome": "Client content cannot misuse desktop bridges or untrusted update paths.",
      "status": "covered",
      "depth": "project",
      "historical": false,
      "remainingGap": "Extend the Electron project to the packaged app (fuses, ASAR integrity, code signing) and its auto-updater, and add a project that runs the A/B recovery tests against a real bootloader such as MCUboot or U-Boot in an emulator.",
      "platforms": [
        "Desktop IPC",
        "embedded devices"
      ],
      "baselineKeys": [
        "ssdf"
      ],
      "identifiers": [],
      "keywords": [
        "Electron",
        "IPC",
        "desktop",
        "firmware",
        "OTA update",
        "secure boot"
      ],
      "guides": [
        {
          "title": "Constrain desktop IPC and privileged helpers",
          "url": "https://softwaresecurity.com/domains/appsec/platform-security/electron-native-security/"
        },
        {
          "title": "Design firmware updates that can recover safely",
          "url": "https://softwaresecurity.com/domains/appsec/platform-security/embedded-update-security/"
        },
        {
          "title": "Case study: CrowdStrike Channel File 291 (July 2024)",
          "url": "https://softwaresecurity.com/domains/appsec/platform-security/case-study-crowdstrike-channel-file-291/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [
        {
          "title": "Stop untrusted pages from using an Electron bridge",
          "url": "https://softwaresecurity.com/downloads/projects/electron-ipc-bridge-af9ef6ea324e1aa6.zip",
          "limits": "24 policy and preload tests run in plain Node.js; 9 exploit tests drive the real app in Electron 44.7.0 with Playwright. The starter failed 8 of those 9 and the reference passed all 9, on macOS and in the Linux dev container under Xvfb. A development build: fuses, code signing and packaging are not covered."
        },
        {
          "title": "Recover from failed firmware updates with A/B slots",
          "url": "https://softwaresecurity.com/downloads/projects/firmware-ab-recovery-68b16aa41556a541.zip",
          "limits": "Real Ed25519 signatures and SHA-256 digests over simulated flash with injected power loss and a simulated protected counter. It models the decisions a bootloader and update client make; page sizes, erase behavior and the counter hardware must be tested on the device itself."
        }
      ],
      "mappings": []
    },
    {
      "id": "APP-14",
      "url": "https://softwaresecurity.com/coverage/#APP-14",
      "domain": "appsec",
      "title": "Disclosure, bug bounty and penetration testing",
      "desiredOutcome": "Reported defects have a safe intake, an accountable response and a verified fix, and external testing is scoped and retested.",
      "status": "covered",
      "depth": "scenario",
      "historical": false,
      "remainingGap": "Add complete mock disclosure packets and a CSAF advisory example.",
      "platforms": [
        "Product security response"
      ],
      "baselineKeys": [
        "ssdf"
      ],
      "identifiers": [],
      "keywords": [
        "VDP",
        "vulnerability disclosure",
        "bug bounty",
        "penetration test",
        "pentest",
        "security.txt",
        "PSIRT",
        "safe harbor",
        "CVE"
      ],
      "guides": [
        {
          "title": "Run coordinated vulnerability disclosure from report to advisory",
          "url": "https://softwaresecurity.com/domains/appsec/vulnerability-response/coordinated-disclosure/"
        },
        {
          "title": "Start with a VDP, then add bug bounties and penetration tests",
          "url": "https://softwaresecurity.com/domains/appsec/vulnerability-response/vdp-bug-bounty-pentest/"
        },
        {
          "title": "Respond to an exploited or malicious dependency",
          "url": "https://softwaresecurity.com/domains/appsec/vulnerability-response/dependency-vulnerability-response/"
        },
        {
          "title": "Publish security advisories with CSAF, VEX, CVE records and OSV",
          "url": "https://softwaresecurity.com/domains/appsec/vulnerability-response/security-advisories-csaf-vex/"
        },
        {
          "title": "UK Software Security Code of Practice: the 14 principles as engineering practice",
          "url": "https://softwaresecurity.com/frameworks/uk-software-security-code-of-practice/"
        },
        {
          "title": "Case study: First American's EaglePro document exposure (2019)",
          "url": "https://softwaresecurity.com/domains/appsec/authorization/case-study-first-american/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "APP-15",
      "url": "https://softwaresecurity.com/coverage/#APP-15",
      "domain": "appsec",
      "title": "HTTP framing agreement",
      "desiredOutcome": "Every HTTP hop agrees on request boundaries before forwarding.",
      "status": "covered",
      "depth": "project",
      "historical": false,
      "remainingGap": "Test the exact production proxy and origin versions and protocol translation; a small project does not cover every HTTP stack.",
      "platforms": [
        "HTTP proxies and origin servers"
      ],
      "baselineKeys": [
        "wstg"
      ],
      "identifiers": [
        "CWE-444"
      ],
      "keywords": [
        "request smuggling",
        "HTTP desync",
        "Content-Length",
        "Transfer-Encoding"
      ],
      "guides": [
        {
          "title": "Keep HTTP request boundaries consistent across intermediaries",
          "url": "https://softwaresecurity.com/domains/runtime/edge-defense/http-request-desynchronization/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [
        {
          "title": "Repair a real proxy and shared cache",
          "url": "https://softwaresecurity.com/downloads/projects/proxy-cache-boundaries-66af6733aa29700d.zip",
          "limits": "Actual HTTP/1.1 loopback traffic and a narrow cache contract; it is not a full HTTP cache or a test of your production intermediary chain."
        }
      ],
      "mappings": []
    },
    {
      "id": "APP-16",
      "url": "https://softwaresecurity.com/coverage/#APP-16",
      "domain": "appsec",
      "title": "Cache identity and audience",
      "desiredOutcome": "Responses are cached only under a key and policy that keep their authorized audience.",
      "status": "covered",
      "depth": "project",
      "historical": false,
      "remainingGap": "Add intermediary-specific cache normalization, Vary and invalidation tests.",
      "platforms": [
        "Reverse proxies",
        "CDNs",
        "application caches"
      ],
      "baselineKeys": [
        "wstg"
      ],
      "identifiers": [
        "CWE-524"
      ],
      "keywords": [
        "cache poisoning",
        "web cache deception",
        "Cache-Control",
        "Vary",
        "CDN"
      ],
      "guides": [
        {
          "title": "Prevent shared-cache poisoning and private-response deception",
          "url": "https://softwaresecurity.com/domains/runtime/edge-defense/cache-poisoning-deception/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [
        {
          "title": "Repair a real proxy and shared cache",
          "url": "https://softwaresecurity.com/downloads/projects/proxy-cache-boundaries-66af6733aa29700d.zip",
          "limits": "Actual HTTP/1.1 loopback traffic and a narrow cache contract; it is not a full HTTP cache or a test of your production intermediary chain."
        }
      ],
      "mappings": []
    },
    {
      "id": "APP-17",
      "url": "https://softwaresecurity.com/coverage/#APP-17",
      "domain": "appsec",
      "title": "Bounded parsing and deserialization",
      "desiredOutcome": "Serialized input cannot select executable types, unsafe constructors or unbounded object graphs.",
      "status": "covered",
      "depth": "project",
      "historical": false,
      "remainingGap": "Deserialization fix cards cover Node.js, Python, Java and C#, and XXE fix cards cover Python, Java and C#. Library-specific gadget-chain analysis and Go, Ruby and PHP serializers are not covered.",
      "platforms": [
        "Java",
        ".NET",
        "Python",
        "Node.js"
      ],
      "baselineKeys": [
        "asvs",
        "owasp-top10"
      ],
      "identifiers": [
        "CWE-502",
        "CWE-611",
        "CWE-776",
        "CWE-409"
      ],
      "keywords": [
        "deserialization",
        "XXE",
        "XML external entity",
        "billion laughs",
        "pickle",
        "YAML",
        "Jackson"
      ],
      "guides": [
        {
          "title": "Parse bounded JSON and XML into an explicit application schema",
          "url": "https://softwaresecurity.com/domains/appsec/input-handling/bounded-json-xml-parsing/"
        },
        {
          "title": "Keep untrusted values out of executable syntax",
          "url": "https://softwaresecurity.com/domains/appsec/secure-coding/injection-parser-boundaries/"
        },
        {
          "title": "Convert untrusted office documents and PDFs in an isolated parser",
          "url": "https://softwaresecurity.com/domains/appsec/secure-features/untrusted-document-conversion/"
        }
      ],
      "fixCards": [
        {
          "title": "XML external entity (XXE) processing",
          "url": "https://softwaresecurity.com/fix/xxe/"
        },
        {
          "title": "Insecure deserialization",
          "url": "https://softwaresecurity.com/fix/deserialization/"
        }
      ],
      "fixStacks": [],
      "workshops": [
        {
          "title": "SQL injection lab: Separate SQL structure from data with sqlite3",
          "url": "https://softwaresecurity.com/labs/sql-injection-sqlite/"
        },
        {
          "title": "OS command injection lab: Run git without a shell",
          "url": "https://softwaresecurity.com/labs/command-injection/"
        },
        {
          "title": "SSTI lab: Render a welcome banner without template injection",
          "url": "https://softwaresecurity.com/labs/template-injection-jinja/"
        },
        {
          "title": "XXE lab: Parse an uploaded invoice without resolving external entities",
          "url": "https://softwaresecurity.com/labs/xxe-lxml/"
        },
        {
          "title": "Pickle deserialization lab: Load a session token without pickle",
          "url": "https://softwaresecurity.com/labs/pickle-deserialization/"
        }
      ],
      "localProjects": [
        {
          "title": "Parse bounded JSON and XML invoices safely",
          "url": "https://softwaresecurity.com/downloads/projects/bounded-data-parsing-aa166a936b50b8b5.zip",
          "limits": "Actual bounded JSON and Expat parsing; no arbitrary object deserialization, external entities, network requests or invoice authorization. Narrow invoice vocabulary, not a general XML schema engine."
        }
      ],
      "mappings": []
    },
    {
      "id": "APP-18",
      "url": "https://softwaresecurity.com/coverage/#APP-18",
      "domain": "appsec",
      "title": "Prototype pollution",
      "desiredOutcome": "Untrusted object keys cannot change inherited behavior or privileged configuration.",
      "status": "covered",
      "depth": "project",
      "historical": false,
      "remainingGap": "Extend the object-processing project to the exact framework, merge library and configuration sinks used in production.",
      "platforms": [
        "JavaScript object processing"
      ],
      "baselineKeys": [
        "asvs"
      ],
      "identifiers": [
        "CWE-1321"
      ],
      "keywords": [
        "prototype pollution",
        "__proto__",
        "JavaScript merge"
      ],
      "guides": [
        {
          "title": "Keep untrusted object keys out of prototype and authority paths",
          "url": "https://softwaresecurity.com/domains/appsec/secure-coding/prototype-pollution-boundaries/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [
        {
          "title": "Stop prototype pollution at merge and authorization boundaries",
          "url": "https://softwaresecurity.com/downloads/projects/prototype-pollution-2ef4d5a55b001cfe.zip",
          "limits": "Real JavaScript behavior in a local isolated test process; JSON inputs and synthetic session state. No service or third-party library vulnerability is targeted."
        }
      ],
      "mappings": []
    },
    {
      "id": "APP-19",
      "url": "https://softwaresecurity.com/coverage/#APP-19",
      "domain": "appsec",
      "title": "Native memory and integer safety",
      "desiredOutcome": "Bounds, lengths and lifetimes cannot produce out-of-bounds access, stale pointers or integer overflow.",
      "status": "covered",
      "depth": "project",
      "historical": false,
      "remainingGap": "Extend the C parser project to sustained fuzzing campaigns and real FFI contracts; Go and Swift unsafe code have no material.",
      "platforms": [
        "C and C++",
        "Rust",
        "native extensions"
      ],
      "baselineKeys": [
        "asvs"
      ],
      "identifiers": [
        "CWE-787",
        "CWE-125",
        "CWE-416",
        "CWE-120",
        "CWE-121",
        "CWE-122",
        "CWE-476",
        "CWE-190"
      ],
      "keywords": [
        "buffer overflow",
        "use after free",
        "memory safety",
        "C++",
        "Rust unsafe",
        "FFI",
        "sanitizers",
        "integer overflow",
        "Citrix Bleed",
        "CrowdStrike"
      ],
      "guides": [
        {
          "title": "Find, fix and contain memory-safety bugs in C and C++",
          "url": "https://softwaresecurity.com/domains/appsec/platform-security/memory-safety-c-cpp/"
        },
        {
          "title": "Audit unsafe Rust, FFI boundaries and crate dependencies",
          "url": "https://softwaresecurity.com/domains/appsec/platform-security/rust-unsafe-ffi/"
        },
        {
          "title": "Fuzz a parser and turn crashes into lasting regressions",
          "url": "https://softwaresecurity.com/domains/appsec/testing/parser-fuzzing/"
        },
        {
          "title": "Case study: Citrix Bleed (CVE-2023-4966)",
          "url": "https://softwaresecurity.com/domains/appsec/vulnerability-response/case-study-citrix-bleed/"
        },
        {
          "title": "Case study: CrowdStrike Channel File 291 (July 2024)",
          "url": "https://softwaresecurity.com/domains/appsec/platform-security/case-study-crowdstrike-channel-file-291/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [
        {
          "title": "Buffer over-read lab: Stop a heartbeat over-read",
          "url": "https://softwaresecurity.com/labs/heartbeat-bounds/"
        }
      ],
      "localProjects": [
        {
          "title": "Repair a native parser using sanitizer evidence",
          "url": "https://softwaresecurity.com/downloads/projects/native-memory-safety-c6897059c95e033a.zip",
          "limits": "Actual Clang address/undefined-behavior instrumentation on generated local files; 4 KiB harness input cap. Requires a compiler and sanitizer runtime."
        }
      ],
      "mappings": []
    },
    {
      "id": "APP-20",
      "url": "https://softwaresecurity.com/coverage/#APP-20",
      "domain": "appsec",
      "title": "Spreadsheet and document exports",
      "desiredOutcome": "CSV, spreadsheet and document processors treat untrusted cells and content as data.",
      "status": "covered",
      "depth": "project",
      "historical": false,
      "remainingGap": "CSV and XLSX exports have a guide with code, and converting untrusted office documents and PDFs has a guide and a project whose live tests run LibreOffice and Ghostscript in a locked-down container (zip bomb, XXE, no network, deadline). CSV formula injection has tested fix cards in six stacks (Express, Flask, Spring Boot, ASP.NET Core, Django and Rails). Not yet covered: a tested pixel re-rendering pipeline (Dangerzone's design is described, not built), and a tested Kubernetes Job or gVisor variant of the sandbox.",
      "platforms": [
        "CSV and spreadsheets",
        "document conversion"
      ],
      "baselineKeys": [
        "asvs"
      ],
      "identifiers": [
        "CWE-1236"
      ],
      "keywords": [
        "CSV injection",
        "formula injection",
        "spreadsheet",
        "document conversion",
        "PDF",
        "LibreOffice",
        "Ghostscript",
        "zip bomb",
        "XXE",
        "Dangerzone"
      ],
      "guides": [
        {
          "title": "Prevent CRLF header injection, log forging and CSV formula injection",
          "url": "https://softwaresecurity.com/domains/appsec/secure-coding/crlf-header-log-injection/"
        },
        {
          "title": "Convert untrusted office documents and PDFs in an isolated parser",
          "url": "https://softwaresecurity.com/domains/appsec/secure-features/untrusted-document-conversion/"
        }
      ],
      "fixCards": [
        {
          "title": "CSV formula injection",
          "url": "https://softwaresecurity.com/fix/csv-formula-injection/"
        }
      ],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [
        {
          "title": "Convert untrusted documents in a locked-down container",
          "url": "https://softwaresecurity.com/downloads/projects/document-conversion-sandbox-62d2ff3fa1f9ec09.zip",
          "limits": "The offline tests use a stand-in for the docker CLI. The 8 live tests ran against LibreOffice 25.2.3 and Ghostscript 10.05.1 in Docker 29.4.3: zip bomb, XXE, network and timeout cases. It is not content disarm and reconstruction, and output checks do not inspect PDF content."
        }
      ],
      "mappings": []
    },
    {
      "id": "APP-21",
      "url": "https://softwaresecurity.com/coverage/#APP-21",
      "domain": "appsec",
      "title": "Input validation and regular expressions",
      "desiredOutcome": "Input is validated against an explicit schema, and no pattern can be driven into catastrophic backtracking.",
      "status": "covered",
      "depth": "fix",
      "historical": false,
      "remainingGap": "The fix cards cover regular-expression denial of service; schema validation and Unicode normalization are taught in the guide without per-stack cards.",
      "platforms": [
        "JavaScript",
        "Python",
        "C#",
        "Java"
      ],
      "baselineKeys": [
        "asvs"
      ],
      "identifiers": [
        "CWE-1333",
        "CWE-20",
        "CWE-1284",
        "CWE-1287",
        "CWE-235"
      ],
      "keywords": [
        "ReDoS",
        "regular expression",
        "input validation",
        "schema validation",
        "Unicode normalization",
        "parameter pollution"
      ],
      "guides": [
        {
          "title": "Validate input safely and prevent regex denial of service",
          "url": "https://softwaresecurity.com/domains/appsec/input-handling/redos-input-validation/"
        },
        {
          "title": "Parse bounded JSON and XML into an explicit application schema",
          "url": "https://softwaresecurity.com/domains/appsec/input-handling/bounded-json-xml-parsing/"
        },
        {
          "title": "Consume third-party APIs safely (OWASP API10:2023)",
          "url": "https://softwaresecurity.com/domains/appsec/secure-features/third-party-api-consumption/"
        }
      ],
      "fixCards": [
        {
          "title": "Regular-expression denial of service (ReDoS)",
          "url": "https://softwaresecurity.com/fix/regex-dos/"
        }
      ],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "APP-22",
      "url": "https://softwaresecurity.com/coverage/#APP-22",
      "domain": "appsec",
      "title": "Header and log injection",
      "desiredOutcome": "Untrusted values cannot add HTTP headers, split responses or forge log records.",
      "status": "covered",
      "depth": "fix",
      "historical": false,
      "remainingGap": "The guide has code for nginx, Node.js and Python, and fix cards give tested fixes for Express, Flask and Spring Boot. ASP.NET Core and the newer stacks have no CRLF fix card, and there is no browser lab.",
      "platforms": [
        "HTTP servers",
        "application logs"
      ],
      "baselineKeys": [
        "asvs"
      ],
      "identifiers": [
        "CWE-93",
        "CWE-113",
        "CWE-117"
      ],
      "keywords": [
        "CRLF injection",
        "header injection",
        "response splitting",
        "log injection",
        "log forging"
      ],
      "guides": [
        {
          "title": "Prevent CRLF header injection, log forging and CSV formula injection",
          "url": "https://softwaresecurity.com/domains/appsec/secure-coding/crlf-header-log-injection/"
        }
      ],
      "fixCards": [
        {
          "title": "CRLF injection in logs and response headers",
          "url": "https://softwaresecurity.com/fix/crlf-log-injection/"
        }
      ],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "AI-08",
      "url": "https://softwaresecurity.com/coverage/#AI-08",
      "domain": "appsec",
      "title": "Smart-contract state invariants",
      "desiredOutcome": "Adversarial calls and callbacks preserve explicitly stated economic and state invariants.",
      "status": "covered",
      "depth": "scenario",
      "historical": false,
      "remainingGap": "Add a local-chain project with compiler-pinned invariant tests and separate economic assumptions.",
      "platforms": [
        "Smart contracts"
      ],
      "baselineKeys": [],
      "identifiers": [],
      "keywords": [
        "smart contract",
        "Solidity",
        "reentrancy",
        "invariant testing"
      ],
      "guides": [
        {
          "title": "Test smart contracts through state invariants",
          "url": "https://softwaresecurity.com/domains/appsec/smart-contracts/security-invariants/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "SUP-01",
      "url": "https://softwaresecurity.com/coverage/#SUP-01",
      "domain": "supply-chain",
      "title": "Release inventory completeness",
      "desiredOutcome": "The inventory describes the packaged artifact, including bundled and generated components.",
      "status": "covered",
      "depth": "project",
      "historical": false,
      "remainingGap": "Add more real ecosystems and container-layer inventory comparison; no file-only checker proves completeness.",
      "platforms": [
        "SPDX and CycloneDX",
        "packaged artifacts"
      ],
      "baselineKeys": [
        "ssdf"
      ],
      "identifiers": [],
      "keywords": [
        "SBOM",
        "CycloneDX",
        "SPDX",
        "purl",
        "inventory"
      ],
      "guides": [
        {
          "title": "Generate an SBOM for the software you actually release",
          "url": "https://softwaresecurity.com/domains/supply-chain/sbom/generate-release-inventory/"
        },
        {
          "title": "Choose SBOM formats and identify components accurately",
          "url": "https://softwaresecurity.com/domains/supply-chain/sbom/formats-and-identifiers/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [
        {
          "title": "SBOM completeness lab: Find the dependencies missing from a release SBOM",
          "url": "https://softwaresecurity.com/labs/sbom-inventory/"
        }
      ],
      "localProjects": [
        {
          "title": "Build and verify a signed software release",
          "url": "https://softwaresecurity.com/downloads/projects/release-verification-bd914fcbede61c32.zip",
          "limits": "Actual Ed25519 signatures over the DSSE pre-authentication encoding, checked against the DSSE test vector, and executable output; there is no certificate or transparency log, the local producer and consumer are not isolated, and this does not establish a SLSA level."
        }
      ],
      "mappings": []
    },
    {
      "id": "SUP-02",
      "url": "https://softwaresecurity.com/coverage/#SUP-02",
      "domain": "supply-chain",
      "title": "Inventory changes and advisory applicability",
      "desiredOutcome": "Dependency changes and vulnerability decisions bind to the exact release and configuration.",
      "status": "covered",
      "depth": "project",
      "historical": false,
      "remainingGap": "Add reproducible producer and consumer VEX exchanges across independently generated SBOMs.",
      "platforms": [
        "Release inventories",
        "VEX"
      ],
      "baselineKeys": [
        "ssdf"
      ],
      "identifiers": [],
      "keywords": [
        "VEX",
        "OpenVEX",
        "CSAF",
        "SBOM diff",
        "reachability"
      ],
      "guides": [
        {
          "title": "Review SBOM changes between releases",
          "url": "https://softwaresecurity.com/domains/supply-chain/sbom/release-diff-and-distribution/"
        },
        {
          "title": "Triage new dependency vulnerability findings",
          "url": "https://softwaresecurity.com/domains/supply-chain/dependencies/evidence-based-triage/"
        },
        {
          "title": "Use VEX without losing vulnerability evidence",
          "url": "https://softwaresecurity.com/domains/supply-chain/vex/producer-and-consumer-decisions/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [
        {
          "title": "SBOM completeness lab: Find the dependencies missing from a release SBOM",
          "url": "https://softwaresecurity.com/labs/sbom-inventory/"
        }
      ],
      "localProjects": [
        {
          "title": "Build and verify a signed software release",
          "url": "https://softwaresecurity.com/downloads/projects/release-verification-bd914fcbede61c32.zip",
          "limits": "Actual Ed25519 signatures over the DSSE pre-authentication encoding, checked against the DSSE test vector, and executable output; there is no certificate or transparency log, the local producer and consumer are not isolated, and this does not establish a SLSA level."
        }
      ],
      "mappings": []
    },
    {
      "id": "SUP-03",
      "url": "https://softwaresecurity.com/coverage/#SUP-03",
      "domain": "supply-chain",
      "title": "CI/CD trust boundaries and platform hardening",
      "desiredOutcome": "Untrusted change content cannot acquire release credentials or poison trusted outputs.",
      "status": "covered",
      "depth": "project",
      "historical": false,
      "remainingGap": "GitHub Actions has a hardening guide, a lab and a project, and the security pipeline project also runs on GitLab CI. Jenkins has no hardening guide yet. Against the OWASP Top 10 CI/CD Security Risks, identity inventories across CI/CD systems (CICD-SEC-2), self-managed CI servers and artifact repositories (CICD-SEC-7), reviews of connected third-party apps (CICD-SEC-8) and central pipeline audit logging (CICD-SEC-10) have no guide yet.",
      "platforms": [
        "CI workflows and runners"
      ],
      "baselineKeys": [
        "ssdf",
        "owasp-cicd"
      ],
      "identifiers": [],
      "keywords": [
        "GitHub Actions",
        "pull_request_target",
        "CI/CD",
        "runner",
        "GITHUB_TOKEN",
        "GitLab CI",
        "Jenkins",
        "OWASP CI/CD Top 10",
        "CICD-SEC"
      ],
      "guides": [
        {
          "title": "Protect the path from pull request to release",
          "url": "https://softwaresecurity.com/domains/supply-chain/ci-cd/build-integrity/"
        },
        {
          "title": "Keep untrusted CI work outside the release boundary",
          "url": "https://softwaresecurity.com/domains/supply-chain/ci-cd/untrusted-workflow-boundaries/"
        },
        {
          "title": "Harden GitHub Actions against workflow and supply-chain attacks",
          "url": "https://softwaresecurity.com/domains/supply-chain/ci-cd/github-actions-hardening/"
        },
        {
          "title": "Case study: the Codecov Bash Uploader compromise (2021)",
          "url": "https://softwaresecurity.com/domains/supply-chain/ci-cd/case-study-codecov/"
        },
        {
          "title": "Workload identity federation: short-lived, scoped identities for services and CI",
          "url": "https://softwaresecurity.com/domains/identity-crypto/identity/workload-identity-models/"
        },
        {
          "title": "Place each security control in the pipeline and decide what it blocks",
          "url": "https://softwaresecurity.com/domains/appsec/testing/devsecops-pipeline/"
        },
        {
          "title": "Case study: the tj-actions/changed-files compromise (CVE-2025-30066)",
          "url": "https://softwaresecurity.com/domains/supply-chain/ci-cd/case-study-tj-actions/"
        },
        {
          "title": "Case study: the Nx s1ngularity compromise and its AI-assisted payload (2025)",
          "url": "https://softwaresecurity.com/domains/ai-emerging/agent-security/case-study-nx-s1ngularity/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [
        {
          "title": "Actions injection lab: Flag GitHub Actions expression injection",
          "url": "https://softwaresecurity.com/labs/actions-injection/"
        }
      ],
      "localProjects": [
        {
          "title": "Build and verify a signed software release",
          "url": "https://softwaresecurity.com/downloads/projects/release-verification-bd914fcbede61c32.zip",
          "limits": "Actual Ed25519 signatures over the DSSE pre-authentication encoding, checked against the DSSE test vector, and executable output; there is no certificate or transparency log, the local producer and consumer are not isolated, and this does not establish a SLSA level."
        },
        {
          "title": "Repair a security pipeline for GitHub Actions and GitLab CI",
          "url": "https://softwaresecurity.com/downloads/projects/security-pipeline-365c6d54e88d6c1c.zip",
          "limits": "Static checks of the YAML text; the pipelines are not run. Each scan command was run locally with the pinned images, and the reference workflow passed actionlint 1.7.12 and zizmor 1.30.1."
        }
      ],
      "mappings": []
    },
    {
      "id": "SUP-04",
      "url": "https://softwaresecurity.com/coverage/#SUP-04",
      "domain": "supply-chain",
      "title": "Artifact identity and provenance",
      "desiredOutcome": "Consumers verify bytes, signer policy and build claims for the same intended artifact.",
      "status": "covered",
      "depth": "project",
      "historical": false,
      "remainingGap": "Add transparency-log and keyless identity verification exercises beyond local signing policies.",
      "platforms": [
        "Artifact signing and provenance"
      ],
      "baselineKeys": [
        "ssdf",
        "owasp-cicd"
      ],
      "identifiers": [],
      "keywords": [
        "SLSA",
        "provenance",
        "Sigstore",
        "cosign",
        "in-toto",
        "attestation",
        "signing"
      ],
      "guides": [
        {
          "title": "Verify artifact signatures against an explicit trust policy",
          "url": "https://softwaresecurity.com/domains/supply-chain/provenance/artifact-signature-policy/"
        },
        {
          "title": "Read SLSA provenance and verify the claim you need",
          "url": "https://softwaresecurity.com/domains/supply-chain/provenance/read-and-verify-slsa/"
        },
        {
          "title": "Harden container images from Dockerfile to admission",
          "url": "https://softwaresecurity.com/domains/runtime/containers/container-image-hardening/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [
        {
          "title": "Signed artifact provenance lab: Reject a release from the wrong producer",
          "url": "https://softwaresecurity.com/labs/artifact-policy/"
        }
      ],
      "localProjects": [
        {
          "title": "Build and verify a signed software release",
          "url": "https://softwaresecurity.com/downloads/projects/release-verification-bd914fcbede61c32.zip",
          "limits": "Actual Ed25519 signatures over the DSSE pre-authentication encoding, checked against the DSSE test vector, and executable output; there is no certificate or transparency log, the local producer and consumer are not isolated, and this does not establish a SLSA level."
        }
      ],
      "mappings": []
    },
    {
      "id": "SUP-05",
      "url": "https://softwaresecurity.com/coverage/#SUP-05",
      "domain": "supply-chain",
      "title": "Deterministic and isolated builds",
      "desiredOutcome": "Unexpected output differences are explained against recorded source, inputs and environment.",
      "status": "covered",
      "depth": "project",
      "historical": false,
      "remainingGap": "A full hermetic build environment and an independent rebuild service are not supplied.",
      "platforms": [
        "Build systems"
      ],
      "baselineKeys": [
        "ssdf"
      ],
      "identifiers": [],
      "keywords": [
        "reproducible builds",
        "hermetic build",
        "SOURCE_DATE_EPOCH",
        "diffoscope"
      ],
      "guides": [
        {
          "title": "Investigate build differences and improve reproducibility",
          "url": "https://softwaresecurity.com/domains/supply-chain/builds/reproducibility-and-hermeticity/"
        },
        {
          "title": "Case study: the SolarWinds Orion build compromise (SUNBURST)",
          "url": "https://softwaresecurity.com/domains/supply-chain/builds/case-study-solarwinds/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [
        {
          "title": "Build and verify a signed software release",
          "url": "https://softwaresecurity.com/downloads/projects/release-verification-bd914fcbede61c32.zip",
          "limits": "Actual Ed25519 signatures over the DSSE pre-authentication encoding, checked against the DSSE test vector, and executable output; there is no certificate or transparency log, the local producer and consumer are not isolated, and this does not establish a SLSA level."
        }
      ],
      "mappings": []
    },
    {
      "id": "SUP-06",
      "url": "https://softwaresecurity.com/coverage/#SUP-06",
      "domain": "supply-chain",
      "title": "Dependency intake, confusion and malicious packages",
      "desiredOutcome": "Package choice, source mapping, installation and incident containment rest on evidence about real authority and use.",
      "status": "covered",
      "depth": "workshop",
      "historical": false,
      "remainingGap": "Add a sandbox for install hooks and a complete dependency replacement case.",
      "platforms": [
        "Package managers and build agents"
      ],
      "baselineKeys": [
        "ssdf",
        "owasp-top10"
      ],
      "identifiers": [
        "CWE-427",
        "CWE-1104",
        "CWE-1395",
        "CWE-506"
      ],
      "keywords": [
        "dependency confusion",
        "typosquatting",
        "slopsquatting",
        "malicious package",
        "OpenSSF Scorecard",
        "lockfile"
      ],
      "guides": [
        {
          "title": "Review dependency health without treating a score as a guarantee",
          "url": "https://softwaresecurity.com/domains/supply-chain/dependencies/project-health-and-intake/"
        },
        {
          "title": "Stop dependency confusion and typosquatting at install time",
          "url": "https://softwaresecurity.com/domains/supply-chain/dependencies/dependency-confusion/"
        },
        {
          "title": "Investigate a suspected malicious package safely",
          "url": "https://softwaresecurity.com/domains/supply-chain/dependencies/package-attack-response/"
        },
        {
          "title": "Triage new dependency vulnerability findings",
          "url": "https://softwaresecurity.com/domains/supply-chain/dependencies/evidence-based-triage/"
        },
        {
          "title": "Case study: the Shai-Hulud npm worm (2025-2026)",
          "url": "https://softwaresecurity.com/domains/supply-chain/dependencies/case-study-shai-hulud/"
        },
        {
          "title": "Case study: the tj-actions/changed-files compromise (CVE-2025-30066)",
          "url": "https://softwaresecurity.com/domains/supply-chain/ci-cd/case-study-tj-actions/"
        },
        {
          "title": "Case study: the xz Utils backdoor (CVE-2024-3094)",
          "url": "https://softwaresecurity.com/domains/supply-chain/dependencies/case-study-xz-utils/"
        },
        {
          "title": "Case study: the SolarWinds Orion build compromise (SUNBURST)",
          "url": "https://softwaresecurity.com/domains/supply-chain/builds/case-study-solarwinds/"
        },
        {
          "title": "Case study: the 3CX DesktopApp supply-chain attack (CVE-2023-29059)",
          "url": "https://softwaresecurity.com/domains/supply-chain/builds/case-study-3cx/"
        },
        {
          "title": "Case study: event-stream and ua-parser-js, two npm package takeovers",
          "url": "https://softwaresecurity.com/domains/supply-chain/dependencies/case-study-event-stream/"
        },
        {
          "title": "Secure the developer workstation: extensions, package managers, secrets and AI agents",
          "url": "https://softwaresecurity.com/domains/supply-chain/ci-cd/developer-workstation-security/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [
        {
          "title": "SBOM completeness lab: Find the dependencies missing from a release SBOM",
          "url": "https://softwaresecurity.com/labs/sbom-inventory/"
        }
      ],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "SUP-07",
      "url": "https://softwaresecurity.com/coverage/#SUP-07",
      "domain": "supply-chain",
      "title": "Publication and update trust",
      "desiredOutcome": "Only approved source and identity can publish artifacts that clients accept as updates.",
      "status": "covered",
      "depth": "project",
      "historical": false,
      "remainingGap": "The staged rollout guide covers rollout rings, automatic halts, content validation and rollback with runnable checks; production-registry and client rollback exercises with disposable infrastructure are still missing.",
      "platforms": [
        "Package registries",
        "client updates"
      ],
      "baselineKeys": [
        "ssdf"
      ],
      "identifiers": [],
      "keywords": [
        "trusted publishing",
        "TUF",
        "npm provenance",
        "PyPI",
        "update channel",
        "staged rollout",
        "canary",
        "rollback",
        "content updates"
      ],
      "guides": [
        {
          "title": "Protect package publication and the update channel",
          "url": "https://softwaresecurity.com/domains/supply-chain/releases/trusted-publishing-and-updates/"
        },
        {
          "title": "Case study: the 3CX DesktopApp supply-chain attack (CVE-2023-29059)",
          "url": "https://softwaresecurity.com/domains/supply-chain/builds/case-study-3cx/"
        },
        {
          "title": "Case study: the polyfill.io CDN takeover (2024)",
          "url": "https://softwaresecurity.com/domains/supply-chain/dependencies/case-study-polyfill-io/"
        },
        {
          "title": "Staged rollout and rollback for security-critical updates",
          "url": "https://softwaresecurity.com/domains/supply-chain/releases/staged-rollout-rollback/"
        },
        {
          "title": "Case study: CrowdStrike Channel File 291 (July 2024)",
          "url": "https://softwaresecurity.com/domains/appsec/platform-security/case-study-crowdstrike-channel-file-291/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [
        {
          "title": "Build and verify a signed software release",
          "url": "https://softwaresecurity.com/downloads/projects/release-verification-bd914fcbede61c32.zip",
          "limits": "Actual Ed25519 signatures over the DSSE pre-authentication encoding, checked against the DSSE test vector, and executable output; there is no certificate or transparency log, the local producer and consumer are not isolated, and this does not establish a SLSA level."
        }
      ],
      "mappings": []
    },
    {
      "id": "SUP-08",
      "url": "https://softwaresecurity.com/coverage/#SUP-08",
      "domain": "supply-chain",
      "title": "Supply-chain incident case studies",
      "desiredOutcome": "Teams can trace a real supply-chain compromise from entry point to the controls that would have stopped it.",
      "status": "covered",
      "depth": "scenario",
      "historical": false,
      "remainingGap": "Each case study is current to its own date; later findings about these incidents are not tracked automatically.",
      "platforms": [
        "Open-source ecosystems",
        "CI/CD"
      ],
      "baselineKeys": [
        "ssdf"
      ],
      "identifiers": [],
      "keywords": [
        "xz",
        "tj-actions",
        "Shai-Hulud",
        "Log4Shell",
        "supply chain attack",
        "case study"
      ],
      "guides": [
        {
          "title": "Case study: the xz Utils backdoor (CVE-2024-3094)",
          "url": "https://softwaresecurity.com/domains/supply-chain/dependencies/case-study-xz-utils/"
        },
        {
          "title": "Case study: the tj-actions/changed-files compromise (CVE-2025-30066)",
          "url": "https://softwaresecurity.com/domains/supply-chain/ci-cd/case-study-tj-actions/"
        },
        {
          "title": "Case study: the Shai-Hulud npm worm (2025-2026)",
          "url": "https://softwaresecurity.com/domains/supply-chain/dependencies/case-study-shai-hulud/"
        },
        {
          "title": "Case study: Log4Shell (CVE-2021-44228)",
          "url": "https://softwaresecurity.com/domains/appsec/vulnerability-response/case-study-log4shell/"
        },
        {
          "title": "Case study: the CircleCI security incident (January 2023)",
          "url": "https://softwaresecurity.com/domains/runtime/cloud-posture/case-study-circleci-2023/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "SUP-09",
      "url": "https://softwaresecurity.com/coverage/#SUP-09",
      "domain": "supply-chain",
      "title": "Source-control hardening and the SLSA Source Track",
      "desiredOutcome": "Branch protection, required review and source provenance stop unreviewed changes reaching a release.",
      "status": "covered",
      "depth": "scenario",
      "historical": false,
      "remainingGap": "Rulesets, CODEOWNERS review, signed commits and push protection have commands and a verification check for GitHub and GitLab, mapped to the SLSA Source track. Generating and verifying source provenance attestations is not exercised yet.",
      "platforms": [
        "Git hosting"
      ],
      "baselineKeys": [
        "ssdf"
      ],
      "identifiers": [],
      "keywords": [
        "branch protection",
        "rulesets",
        "signed commits",
        "SLSA source track",
        "source provenance"
      ],
      "external": {
        "title": "SLSA 1.2: Source track requirements",
        "url": "https://slsa.dev/spec/v1.2/source-requirements"
      },
      "guides": [
        {
          "title": "Protect the source repository: rulesets, reviews and signed commits",
          "url": "https://softwaresecurity.com/domains/supply-chain/ci-cd/source-repository-protection/"
        },
        {
          "title": "Meet the OpenSSF OSPS Baseline as a maintainer: the levels, every Level 1 control on GitHub, and the evidence",
          "url": "https://softwaresecurity.com/domains/supply-chain/ci-cd/osps-baseline-for-maintainers/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "SUP-10",
      "url": "https://softwaresecurity.com/coverage/#SUP-10",
      "domain": "supply-chain",
      "title": "Open-source baselines for producers and consumers",
      "desiredOutcome": "Maintainers and consumers apply a published baseline (OpenSSF OSPS Baseline, S2C2F) and keep evidence of it.",
      "status": "covered",
      "depth": "scenario",
      "historical": false,
      "remainingGap": "OSPS Baseline v2026.08.28 has a maintainer walkthrough: its families and levels, every Level 1 requirement on GitHub with evidence, the key Level 2 and 3 controls, a tested evidence script and a validated Security Insights file. S2C2F has a consumer walkthrough: its 8 practices, 25 requirements and 4 levels, a tested level calculator and a staged plan. GitLab equivalents for the Baseline controls and a hands-on lab are not covered.",
      "platforms": [
        "Open-source projects"
      ],
      "baselineKeys": [
        "ssdf"
      ],
      "identifiers": [],
      "keywords": [
        "OSPS Baseline",
        "OpenSSF Baseline",
        "S2C2F",
        "secure supply chain consumption framework",
        "Security Insights",
        "OSPS Baseline level 1"
      ],
      "external": {
        "title": "OpenSSF Open Source Project Security Baseline",
        "url": "https://baseline.openssf.org/"
      },
      "guides": [
        {
          "title": "Meet the OpenSSF OSPS Baseline as a maintainer: the levels, every Level 1 control on GitHub, and the evidence",
          "url": "https://softwaresecurity.com/domains/supply-chain/ci-cd/osps-baseline-for-maintainers/"
        },
        {
          "title": "Adopt the OpenSSF S2C2F as a consumer: the eight practices, the four maturity levels and a staged plan with evidence",
          "url": "https://softwaresecurity.com/domains/supply-chain/dependencies/s2c2f-adoption/"
        },
        {
          "title": "Protect the source repository: rulesets, reviews and signed commits",
          "url": "https://softwaresecurity.com/domains/supply-chain/ci-cd/source-repository-protection/"
        },
        {
          "title": "Review dependency health without treating a score as a guarantee",
          "url": "https://softwaresecurity.com/domains/supply-chain/dependencies/project-health-and-intake/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "SUP-11",
      "url": "https://softwaresecurity.com/coverage/#SUP-11",
      "domain": "supply-chain",
      "title": "License compliance",
      "desiredOutcome": "Each release meets the license obligations of what it ships, with notices and SBOM license data to prove it.",
      "status": "covered",
      "depth": "scenario",
      "historical": false,
      "remainingGap": "SPDX license expressions, a policy by distribution model, SBOM-based checks in pull requests and release notices are covered. Legal interpretation of individual licenses is out of scope (see OUT-01).",
      "platforms": [
        "Releases",
        "SBOMs"
      ],
      "baselineKeys": [
        "ssdf"
      ],
      "identifiers": [],
      "keywords": [
        "license compliance",
        "open source license",
        "SPDX license",
        "GPL",
        "notices",
        "OpenChain"
      ],
      "external": {
        "title": "SPDX License List",
        "url": "https://spdx.org/licenses/"
      },
      "guides": [
        {
          "title": "Open source license compliance: SPDX expressions, obligations and SBOM checks",
          "url": "https://softwaresecurity.com/domains/supply-chain/dependencies/open-source-license-compliance/"
        },
        {
          "title": "Review dependency health without treating a score as a guarantee",
          "url": "https://softwaresecurity.com/domains/supply-chain/dependencies/project-health-and-intake/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "RUN-01",
      "url": "https://softwaresecurity.com/coverage/#RUN-01",
      "domain": "runtime",
      "title": "Effective cloud trust and permissions",
      "desiredOutcome": "Workload identities can assume only intended roles and reach only required resources.",
      "status": "covered",
      "depth": "workshop",
      "historical": false,
      "remainingGap": "A browser lab now models role trust-policy evaluation against the confused deputy (sts:ExternalId, aws:SourceArn and aws:SourceAccount). The remaining gap is disposable cloud-account labs that evaluate identity, resource and organization policies together.",
      "platforms": [
        "Cloud IAM",
        "service-to-service identity"
      ],
      "baselineKeys": [
        "ssdf"
      ],
      "identifiers": [],
      "keywords": [
        "cloud IAM",
        "role trust",
        "least privilege",
        "AssumeRole",
        "service account",
        "CircleCI",
        "SAS token"
      ],
      "guides": [
        {
          "title": "Review cloud permissions and role trust together",
          "url": "https://softwaresecurity.com/domains/runtime/cloud-posture/cloud-iam-trust/"
        },
        {
          "title": "Authenticate workloads and authorize their service actions",
          "url": "https://softwaresecurity.com/domains/runtime/service-security/workload-mtls-serverless/"
        },
        {
          "title": "Case study: the CircleCI security incident (January 2023)",
          "url": "https://softwaresecurity.com/domains/runtime/cloud-posture/case-study-circleci-2023/"
        },
        {
          "title": "Case study: Microsoft AI researchers' over-permissive SAS token (2023)",
          "url": "https://softwaresecurity.com/domains/runtime/cloud-posture/case-study-microsoft-sas-token/"
        },
        {
          "title": "Review infrastructure changes as access changes",
          "url": "https://softwaresecurity.com/domains/runtime/cloud-posture/iac-security/"
        },
        {
          "title": "Contain a leaked secret, then investigate and clean up",
          "url": "https://softwaresecurity.com/domains/identity-crypto/secrets/leaked-secret-response/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [
        {
          "title": "IAM trust policy lab: Evaluate a role trust policy against the confused deputy",
          "url": "https://softwaresecurity.com/labs/iam-trust-policy/"
        }
      ],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "RUN-02",
      "url": "https://softwaresecurity.com/coverage/#RUN-02",
      "domain": "runtime",
      "title": "Workload privilege enforcement",
      "desiredOutcome": "The deployed workload cannot request or inherit unnecessary host or kernel authority.",
      "status": "covered",
      "depth": "project",
      "historical": false,
      "remainingGap": "Cluster admission outcomes must be checked on the installed version; the browser lab checks policy logic only.",
      "platforms": [
        "Kubernetes",
        "containers"
      ],
      "baselineKeys": [
        "ssdf",
        "owasp-kubernetes"
      ],
      "identifiers": [],
      "keywords": [
        "Kubernetes",
        "Pod Security Standards",
        "securityContext",
        "RBAC",
        "privileged container",
        "OWASP Kubernetes Top 10"
      ],
      "guides": [
        {
          "title": "Run Kubernetes workloads with only the privileges they need",
          "url": "https://softwaresecurity.com/domains/runtime/containers/kubernetes-workload-security/"
        },
        {
          "title": "Prove network and admission policies enforce the intended boundary",
          "url": "https://softwaresecurity.com/domains/runtime/containers/container-network-admission/"
        },
        {
          "title": "Harden managed Kubernetes on EKS, AKS and GKE",
          "url": "https://softwaresecurity.com/domains/runtime/containers/managed-kubernetes-hardening/"
        },
        {
          "title": "Case study: ingress-nginx CVE-2025-1974 and the exposed admission webhook (2025)",
          "url": "https://softwaresecurity.com/domains/runtime/containers/case-study-ingress-nginx/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [
        {
          "title": "Privileged container lab: Reject a privileged workload before deployment",
          "url": "https://softwaresecurity.com/labs/kubernetes-policy/"
        },
        {
          "title": "NetworkPolicy lab: Lock down a shop namespace",
          "url": "https://softwaresecurity.com/labs/network-policy/"
        }
      ],
      "localProjects": [
        {
          "title": "Verify Kubernetes admission and network boundaries",
          "url": "https://softwaresecurity.com/downloads/projects/kubernetes-enforcement-6d129f5f9f250337.zip",
          "limits": "The offline manifest checks run in the site test suite. The live kind and Calico path, with pinned setup, probes and cleanup, has been run end to end; it is a single-node teaching fixture, not a production baseline."
        }
      ],
      "mappings": []
    },
    {
      "id": "RUN-03",
      "url": "https://softwaresecurity.com/coverage/#RUN-03",
      "domain": "runtime",
      "title": "Network and admission enforcement",
      "desiredOutcome": "Allowed flows succeed and prohibited flows fail on the real cluster and policy stack.",
      "status": "covered",
      "depth": "project",
      "historical": false,
      "remainingGap": "CNI-specific probes, exception paths and upgrade regressions remain environment-dependent.",
      "platforms": [
        "Kubernetes admission",
        "NetworkPolicy"
      ],
      "baselineKeys": [
        "ssdf",
        "owasp-kubernetes"
      ],
      "identifiers": [],
      "keywords": [
        "NetworkPolicy",
        "admission control",
        "ValidatingAdmissionPolicy",
        "Kyverno",
        "default deny",
        "OWASP Kubernetes Top 10",
        "ingress-nginx",
        "admission webhook"
      ],
      "guides": [
        {
          "title": "Prove network and admission policies enforce the intended boundary",
          "url": "https://softwaresecurity.com/domains/runtime/containers/container-network-admission/"
        },
        {
          "title": "Case study: ingress-nginx CVE-2025-1974 and the exposed admission webhook (2025)",
          "url": "https://softwaresecurity.com/domains/runtime/containers/case-study-ingress-nginx/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [
        {
          "title": "Privileged container lab: Reject a privileged workload before deployment",
          "url": "https://softwaresecurity.com/labs/kubernetes-policy/"
        },
        {
          "title": "NetworkPolicy lab: Lock down a shop namespace",
          "url": "https://softwaresecurity.com/labs/network-policy/"
        }
      ],
      "localProjects": [
        {
          "title": "Verify Kubernetes admission and network boundaries",
          "url": "https://softwaresecurity.com/downloads/projects/kubernetes-enforcement-6d129f5f9f250337.zip",
          "limits": "The offline manifest checks run in the site test suite. The live kind and Calico path, with pinned setup, probes and cleanup, has been run end to end; it is a single-node teaching fixture, not a production baseline."
        }
      ],
      "mappings": []
    },
    {
      "id": "RUN-04",
      "url": "https://softwaresecurity.com/coverage/#RUN-04",
      "domain": "runtime",
      "title": "Infrastructure intent and observed state",
      "desiredOutcome": "Security-relevant deployment drift is detected, owned and resolved against desired policy.",
      "status": "covered",
      "depth": "scenario",
      "historical": false,
      "remainingGap": "Add Terraform plan and state integration with cloud observation on disposable resources. Dangling DNS detection is shown with an offline-tested scanner and validated Terraform, not against live zones.",
      "platforms": [
        "Infrastructure as code",
        "DNS"
      ],
      "baselineKeys": [
        "ssdf"
      ],
      "identifiers": [],
      "keywords": [
        "infrastructure as code",
        "Terraform",
        "OPA",
        "policy as code",
        "drift",
        "subdomain takeover",
        "dangling DNS",
        "DNS lifecycle"
      ],
      "guides": [
        {
          "title": "Review infrastructure changes as access changes",
          "url": "https://softwaresecurity.com/domains/runtime/cloud-posture/iac-security/"
        },
        {
          "title": "Test infrastructure policy and detect security-relevant drift",
          "url": "https://softwaresecurity.com/domains/runtime/cloud-posture/iac-policy-drift/"
        },
        {
          "title": "Prevent subdomain takeover from dangling DNS records",
          "url": "https://softwaresecurity.com/domains/runtime/cloud-posture/subdomain-takeover/"
        },
        {
          "title": "Authorization models: RBAC, ABAC, ReBAC and policy as code you can test",
          "url": "https://softwaresecurity.com/domains/identity-crypto/identity/authorization-models/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "RUN-05",
      "url": "https://softwaresecurity.com/coverage/#RUN-05",
      "domain": "runtime",
      "title": "API exposure and protocol authorization",
      "desiredOutcome": "Every exposed operation is inventoried, authenticated and authorized whatever the listener or protocol.",
      "status": "covered",
      "depth": "project",
      "historical": false,
      "remainingGap": "Add real GraphQL, WebSocket and gRPC servers with operation-level controls and cancellation tests. WebRTC media-server robustness (ASVS V17.2) is described but not load- or fuzz-tested here.",
      "platforms": [
        "HTTP, GraphQL, WebSocket and gRPC",
        "WebRTC signaling, TURN and media servers"
      ],
      "baselineKeys": [
        "asvs",
        "wstg",
        "owasp-api"
      ],
      "identifiers": [],
      "keywords": [
        "API inventory",
        "API gateway",
        "GraphQL",
        "WebSocket",
        "gRPC",
        "shadow API",
        "WebRTC",
        "TURN",
        "signaling",
        "coturn"
      ],
      "guides": [
        {
          "title": "Maintain an API inventory and prevent gateway bypass",
          "url": "https://softwaresecurity.com/domains/runtime/api-security/api-gateway-inventory/"
        },
        {
          "title": "Apply security limits to GraphQL, WebSocket and gRPC operations",
          "url": "https://softwaresecurity.com/domains/runtime/api-security/protocol-api-security/"
        },
        {
          "title": "Secure WebRTC signaling, TURN relays and media servers",
          "url": "https://softwaresecurity.com/domains/appsec/secure-features/webrtc-security/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [
        {
          "title": "Repair a real proxy and shared cache",
          "url": "https://softwaresecurity.com/downloads/projects/proxy-cache-boundaries-66af6733aa29700d.zip",
          "limits": "Actual HTTP/1.1 loopback traffic and a narrow cache contract; it is not a full HTTP cache or a test of your production intermediary chain."
        }
      ],
      "mappings": []
    },
    {
      "id": "RUN-06",
      "url": "https://softwaresecurity.com/coverage/#RUN-06",
      "domain": "runtime",
      "title": "Bounded work and recovery",
      "desiredOutcome": "Cost, concurrency, time and durable retries stay within explicit budgets.",
      "status": "covered",
      "depth": "project",
      "historical": false,
      "remainingGap": "Unbounded resource consumption now has tested fix cards (Express and ASP.NET Core) with body-size, work and rate limits. Add queue and outbox recovery and distributed rate limiting across several processes.",
      "platforms": [
        "APIs",
        "background jobs"
      ],
      "baselineKeys": [
        "asvs",
        "owasp-api"
      ],
      "identifiers": [
        "CWE-770",
        "CWE-400"
      ],
      "keywords": [
        "rate limiting",
        "resource limits",
        "denial of service",
        "HTTP 429",
        "queues",
        "retries",
        "backpressure"
      ],
      "guides": [
        {
          "title": "Bound API work, not just request counts",
          "url": "https://softwaresecurity.com/domains/runtime/api-security/resource-consumption-limits/"
        },
        {
          "title": "Bound background jobs and make retries safe",
          "url": "https://softwaresecurity.com/domains/runtime/availability/bounded-background-work/"
        },
        {
          "title": "Apply security limits to GraphQL, WebSocket and gRPC operations",
          "url": "https://softwaresecurity.com/domains/runtime/api-security/protocol-api-security/"
        },
        {
          "title": "Keep HTTP services up under application-layer DDoS",
          "url": "https://softwaresecurity.com/domains/runtime/availability/l7-ddos-resilience/"
        }
      ],
      "fixCards": [
        {
          "title": "Unbounded resource consumption",
          "url": "https://softwaresecurity.com/fix/resource-limits/"
        }
      ],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [
        {
          "title": "Make a checkout transaction atomic",
          "url": "https://softwaresecurity.com/downloads/projects/checkout-sqlite-0f06facdf0c0bb1b.zip",
          "limits": "Uses isolated temporary databases and real concurrent connections; test the locking semantics of your production database separately."
        },
        {
          "title": "Enforce retrieval and tool boundaries across crashes",
          "url": "https://softwaresecurity.com/downloads/projects/agent-tool-boundaries-26b9a352bb160338.zip",
          "limits": "Real SQLite transactions and independent durable provider receipts; deterministic ranker and trusted test identities. No model, MCP implementation or external effects."
        }
      ],
      "mappings": []
    },
    {
      "id": "RUN-07",
      "url": "https://softwaresecurity.com/coverage/#RUN-07",
      "domain": "runtime",
      "title": "Investigable security events",
      "desiredOutcome": "Identity, decision and effect evidence can be correlated without disclosing unnecessary secrets.",
      "status": "covered",
      "depth": "scenario",
      "historical": false,
      "remainingGap": "Add an application-to-log-store detection and containment exercise that includes delivery failures.",
      "platforms": [
        "Application and runtime telemetry"
      ],
      "baselineKeys": [
        "asvs",
        "ssdf",
        "owasp-top10"
      ],
      "identifiers": [
        "CWE-778",
        "CWE-532"
      ],
      "keywords": [
        "security logging",
        "audit log",
        "detection engineering",
        "Sigma",
        "OCSF",
        "incident response"
      ],
      "guides": [
        {
          "title": "Create security logs someone can investigate",
          "url": "https://softwaresecurity.com/domains/runtime/detection/security-event-logging/"
        },
        {
          "title": "Turn runtime events into a tested investigation and containment path",
          "url": "https://softwaresecurity.com/domains/runtime/detection/runtime-detection-response/"
        },
        {
          "title": "Case study: Storm-0558 and the forged Microsoft tokens (2023)",
          "url": "https://softwaresecurity.com/domains/identity-crypto/authentication/case-study-storm-0558/"
        },
        {
          "title": "Detect container and host threats at runtime with eBPF sensors and cloud services",
          "url": "https://softwaresecurity.com/domains/runtime/detection/runtime-threat-detection/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "RUN-08",
      "url": "https://softwaresecurity.com/coverage/#RUN-08",
      "domain": "runtime",
      "title": "Edge controls and origin correctness",
      "desiredOutcome": "Edge rules reduce abuse without replacing origin authorization or blocking legitimate use.",
      "status": "covered",
      "depth": "project",
      "historical": false,
      "remainingGap": "Add provider-specific WAF rule tuning and false-positive measurements on representative traffic.",
      "platforms": [
        "WAF",
        "bot controls",
        "origin services"
      ],
      "baselineKeys": [
        "wstg"
      ],
      "identifiers": [],
      "keywords": [
        "WAF",
        "OWASP CRS",
        "ModSecurity",
        "bot defense",
        "edge"
      ],
      "guides": [
        {
          "title": "Operate edge rules without hiding application defects",
          "url": "https://softwaresecurity.com/domains/runtime/edge-defense/edge-waf-bot-defense/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [
        {
          "title": "Repair a real proxy and shared cache",
          "url": "https://softwaresecurity.com/downloads/projects/proxy-cache-boundaries-66af6733aa29700d.zip",
          "limits": "Actual HTTP/1.1 loopback traffic and a narrow cache contract; it is not a full HTTP cache or a test of your production intermediary chain."
        }
      ],
      "mappings": []
    },
    {
      "id": "RUN-09",
      "url": "https://softwaresecurity.com/coverage/#RUN-09",
      "domain": "runtime",
      "title": "Cloud provider baselines",
      "desiredOutcome": "Each cloud account starts from a hardened baseline for identity, logging, metadata access and storage on AWS, Azure and Google Cloud.",
      "status": "covered",
      "depth": "scenario",
      "historical": false,
      "remainingGap": "Add provider detection services and CIS Benchmark checks for each provider.",
      "platforms": [
        "AWS",
        "Azure",
        "Google Cloud"
      ],
      "baselineKeys": [
        "ssdf"
      ],
      "identifiers": [],
      "keywords": [
        "AWS",
        "Azure",
        "Google Cloud",
        "GCP",
        "IMDSv2",
        "cloud baseline",
        "landing zone"
      ],
      "guides": [
        {
          "title": "Apply a security baseline across AWS, Azure and Google Cloud",
          "url": "https://softwaresecurity.com/domains/runtime/cloud-posture/cloud-provider-baselines/"
        },
        {
          "title": "Prevent subdomain takeover from dangling DNS records",
          "url": "https://softwaresecurity.com/domains/runtime/cloud-posture/subdomain-takeover/"
        },
        {
          "title": "Case study: Microsoft AI researchers' over-permissive SAS token (2023)",
          "url": "https://softwaresecurity.com/domains/runtime/cloud-posture/case-study-microsoft-sas-token/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "RUN-10",
      "url": "https://softwaresecurity.com/coverage/#RUN-10",
      "domain": "runtime",
      "title": "Container image security",
      "desiredOutcome": "Images are minimal, scanned, signed and rebuilt on a schedule, and the cluster admits only verified images.",
      "status": "covered",
      "depth": "scenario",
      "historical": false,
      "remainingGap": "Add base-image update automation and rebuild cadence examples.",
      "platforms": [
        "Containers",
        "Kubernetes admission"
      ],
      "baselineKeys": [
        "ssdf"
      ],
      "identifiers": [],
      "keywords": [
        "container image",
        "Dockerfile",
        "distroless",
        "image scanning",
        "Trivy",
        "Grype",
        "image signing"
      ],
      "guides": [
        {
          "title": "Harden container images from Dockerfile to admission",
          "url": "https://softwaresecurity.com/domains/runtime/containers/container-image-hardening/"
        },
        {
          "title": "Harden the images you ship against CIS, STIG and SCAP benchmarks",
          "url": "https://softwaresecurity.com/domains/runtime/containers/image-hardening-benchmarks/"
        },
        {
          "title": "Sandbox model-generated code and computer-use agents",
          "url": "https://softwaresecurity.com/domains/ai-emerging/agent-security/agent-code-sandboxing/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "RUN-11",
      "url": "https://softwaresecurity.com/coverage/#RUN-11",
      "domain": "runtime",
      "title": "Security tool categories",
      "desiredOutcome": "Teams know what each tool category checks (CSPM, CNAPP, CIEM, ASPM, IAST, RASP) and how to evaluate one without vendor claims.",
      "status": "covered",
      "depth": "scenario",
      "historical": false,
      "remainingGap": "Application testing categories (SAST, DAST, IAST, SCA, secrets, IaC, container and API scanning, ASPM) and cloud categories (CSPM, CWPP, CIEM, DSPM, CNAPP) each have an explainer and an evaluation protocol on a seeded target. RASP is only mentioned, in the edge and PCI DSS guides, without an evaluation.",
      "platforms": [
        "Tool evaluation"
      ],
      "baselineKeys": [
        "ssdf"
      ],
      "identifiers": [],
      "keywords": [
        "CSPM",
        "CNAPP",
        "CIEM",
        "CWPP",
        "ASPM",
        "IAST",
        "RASP",
        "tool selection"
      ],
      "guides": [
        {
          "title": "Choose and evaluate application security testing tools",
          "url": "https://softwaresecurity.com/domains/appsec/testing/appsec-tool-categories-and-evaluation/"
        },
        {
          "title": "Choose cloud security posture tools and apply zero trust",
          "url": "https://softwaresecurity.com/domains/runtime/cloud-posture/cloud-security-posture/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "RUN-12",
      "url": "https://softwaresecurity.com/coverage/#RUN-12",
      "domain": "runtime",
      "title": "Hardening benchmarks",
      "desiredOutcome": "The images and nodes the team builds and runs (container base images, golden VM images, Kubernetes node images and the container runtime), and the clusters and managed services they use, are configured against a published benchmark, with deviations recorded, approved and expiring.",
      "status": "covered",
      "depth": "project",
      "historical": false,
      "remainingGap": "Container images are scanned with OpenSCAP and the SCAP Security Guide in a tested project with a deviation register enforced in CI; managed Kubernetes is checked with kube-bench and the cloud baselines name the CIS Foundations Benchmarks. Golden VM images and running nodes are covered in prose with the tools to use, not in a tested exercise; the worked example uses a CIS profile, not a DISA STIG, and Windows images are not covered. Of the OWASP Kubernetes Top 10 2025 risks, K06 Overly Exposed Kubernetes Components is covered only for the managed API endpoint: exposed kubelets and etcd, and control planes you run yourself, have no guide.",
      "platforms": [
        "Container images",
        "VM and node images",
        "Kubernetes",
        "cloud services"
      ],
      "baselineKeys": [
        "ssdf",
        "owasp-kubernetes"
      ],
      "identifiers": [],
      "keywords": [
        "CIS Benchmark",
        "CIS benchmarks",
        "hardening baseline",
        "STIG",
        "OpenSCAP",
        "SCAP Security Guide",
        "deviation register",
        "golden image",
        "OWASP Kubernetes Top 10"
      ],
      "external": {
        "title": "CIS Benchmarks",
        "url": "https://www.cisecurity.org/cis-benchmarks"
      },
      "guides": [
        {
          "title": "Harden managed Kubernetes on EKS, AKS and GKE",
          "url": "https://softwaresecurity.com/domains/runtime/containers/managed-kubernetes-hardening/"
        },
        {
          "title": "Apply a security baseline across AWS, Azure and Google Cloud",
          "url": "https://softwaresecurity.com/domains/runtime/cloud-posture/cloud-provider-baselines/"
        },
        {
          "title": "Harden the images you ship against CIS, STIG and SCAP benchmarks",
          "url": "https://softwaresecurity.com/domains/runtime/containers/image-hardening-benchmarks/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [
        {
          "title": "Gate an image build on a CIS scan and a deviation register",
          "url": "https://softwaresecurity.com/downloads/projects/image-benchmark-gate-b76ad8a05569f566.zip",
          "limits": "The fixture is the TestResult of a real scan with OpenSCAP 1.4.4 and SSG 0.1.82, whose Ubuntu profile follows CIS v1.0.0. An image on disk cannot show running services, kernel settings or mounts; scan hosts and nodes as well."
        }
      ],
      "mappings": []
    },
    {
      "id": "ID-01",
      "url": "https://softwaresecurity.com/coverage/#ID-01",
      "domain": "identity-crypto",
      "title": "Authentication, passwords and session state",
      "desiredOutcome": "Login, password storage, renewal, logout and revocation keep a coherent authenticated session.",
      "status": "covered",
      "depth": "project",
      "historical": false,
      "remainingGap": "Missing authentication for a critical function (CWE-306) now has tested fix cards (Express, Next.js, Spring Boot and ASP.NET Core). Add session-store failover and sign-out-everywhere integration tests across stacks.",
      "platforms": [
        "Sessions",
        "password verifiers"
      ],
      "baselineKeys": [
        "asvs",
        "wstg",
        "owasp-top10"
      ],
      "identifiers": [
        "CWE-384",
        "CWE-613",
        "CWE-614",
        "CWE-1004",
        "CWE-916",
        "CWE-759",
        "CWE-521",
        "CWE-257"
      ],
      "keywords": [
        "session",
        "cookies",
        "password hashing",
        "Argon2id",
        "bcrypt",
        "session fixation",
        "logout",
        "missing authentication"
      ],
      "guides": [
        {
          "title": "Session management: cookies, timeouts, rotation and revocation",
          "url": "https://softwaresecurity.com/domains/identity-crypto/authentication/session-lifecycle/"
        },
        {
          "title": "Password storage: hashing parameters and rehash on login",
          "url": "https://softwaresecurity.com/domains/identity-crypto/authentication/password-storage/"
        },
        {
          "title": "Case study: Citrix Bleed (CVE-2023-4966)",
          "url": "https://softwaresecurity.com/domains/appsec/vulnerability-response/case-study-citrix-bleed/"
        },
        {
          "title": "SCIM deprovisioning: make account disablement remove every usable authority",
          "url": "https://softwaresecurity.com/domains/identity-crypto/authentication/scim-provisioning-deprovisioning/"
        }
      ],
      "fixCards": [
        {
          "title": "Weak password hashing",
          "url": "https://softwaresecurity.com/fix/password-hashing/"
        },
        {
          "title": "Session fixation and session cookies",
          "url": "https://softwaresecurity.com/fix/session-cookies/"
        }
      ],
      "fixStacks": [],
      "workshops": [
        {
          "title": "Password hashing lab: Verify and upgrade an Argon2 password hash on login",
          "url": "https://softwaresecurity.com/labs/password-hashing-argon2/"
        }
      ],
      "localProjects": [
        {
          "title": "Secure a real HTTP API",
          "url": "https://softwaresecurity.com/downloads/projects/express-api-519f6cf7960d8d96.zip",
          "limits": "Localhost tests with synthetic identities and in-memory records; includes actual JOSE verification."
        },
        {
          "title": "Verify tokens through rotation and revocation",
          "url": "https://softwaresecurity.com/downloads/projects/token-lifecycle-2351d64b881f0c32.zip",
          "limits": "Real JOSE signatures and HTTP key discovery; synthetic in-memory sessions and deterministic clock. No identity-provider login or distributed revocation service."
        },
        {
          "title": "Prove deprovisioning reaches sessions and queued work",
          "url": "https://softwaresecurity.com/downloads/projects/identity-lifecycle-510849ac517b9ec2.zip",
          "limits": "Actual local transactions and authorization state. Normalized provisioning events, opaque credentials and local job effects; not a SCIM HTTP/PATCH server or external revocation service."
        }
      ],
      "mappings": []
    },
    {
      "id": "ID-02",
      "url": "https://softwaresecurity.com/coverage/#ID-02",
      "domain": "identity-crypto",
      "title": "Federated login and token lifecycle",
      "desiredOutcome": "Callback binding, exact token validation and key rollover keep issuer and audience trust.",
      "status": "covered",
      "depth": "project",
      "historical": false,
      "remainingGap": "Add configurations for several real identity providers and a refresh-token compromise exercise.",
      "platforms": [
        "OAuth, OIDC and JWT"
      ],
      "baselineKeys": [
        "asvs",
        "owasp-top10"
      ],
      "identifiers": [
        "CWE-347",
        "CWE-287"
      ],
      "keywords": [
        "OAuth",
        "OpenID Connect",
        "OIDC",
        "PKCE",
        "JWT",
        "JWKS",
        "refresh token",
        "DPoP",
        "Storm-0558"
      ],
      "guides": [
        {
          "title": "OAuth 2.0 and OpenID Connect login: authorization code with PKCE",
          "url": "https://softwaresecurity.com/domains/identity-crypto/authentication/oauth-oidc-login/"
        },
        {
          "title": "Defend OAuth and OIDC against redirect and token attacks",
          "url": "https://softwaresecurity.com/domains/identity-crypto/authentication/oauth-oidc-attacks/"
        },
        {
          "title": "JWT validation: algorithms, keys, claims and key rollover",
          "url": "https://softwaresecurity.com/domains/identity-crypto/authentication/jwt-validation-rollover/"
        },
        {
          "title": "Defend JWTs against forgery, confusion and replay",
          "url": "https://softwaresecurity.com/domains/identity-crypto/authentication/jwt-attacks/"
        },
        {
          "title": "Case study: Storm-0558 and the forged Microsoft tokens (2023)",
          "url": "https://softwaresecurity.com/domains/identity-crypto/authentication/case-study-storm-0558/"
        },
        {
          "title": "SAML single sign-on: verify signed assertions without losing the identity boundary",
          "url": "https://softwaresecurity.com/domains/identity-crypto/authentication/saml-verification-boundaries/"
        }
      ],
      "fixCards": [
        {
          "title": "JWT validation in APIs (bearer tokens)",
          "url": "https://softwaresecurity.com/fix/jwt-validation/"
        }
      ],
      "fixStacks": [],
      "workshops": [
        {
          "title": "JWT validation lab: Validate the purpose and audience of a token",
          "url": "https://softwaresecurity.com/labs/token-validation/"
        },
        {
          "title": "JWT verification lab: Verify a JWT before trusting it",
          "url": "https://softwaresecurity.com/labs/jwt-verification/"
        },
        {
          "title": "OAuth redirect and PKCE lab: Match redirect URIs and verify PKCE",
          "url": "https://softwaresecurity.com/labs/oauth-redirect-pkce/"
        }
      ],
      "localProjects": [
        {
          "title": "Verify tokens through rotation and revocation",
          "url": "https://softwaresecurity.com/downloads/projects/token-lifecycle-2351d64b881f0c32.zip",
          "limits": "Real JOSE signatures and HTTP key discovery; synthetic in-memory sessions and deterministic clock. No identity-provider login or distributed revocation service."
        }
      ],
      "mappings": []
    },
    {
      "id": "ID-03",
      "url": "https://softwaresecurity.com/coverage/#ID-03",
      "domain": "identity-crypto",
      "title": "Enterprise SSO assertion validation",
      "desiredOutcome": "Assertions are accepted only for the intended issuer, recipient, request and replay state.",
      "status": "covered",
      "depth": "project",
      "historical": false,
      "remainingGap": "Provider-specific XML signature libraries and metadata rollover still need integration testing.",
      "platforms": [
        "SAML enterprise SSO"
      ],
      "baselineKeys": [
        "asvs"
      ],
      "identifiers": [],
      "keywords": [
        "SAML",
        "single sign-on",
        "XML signature wrapping",
        "assertion"
      ],
      "guides": [
        {
          "title": "SAML single sign-on: verify signed assertions without losing the identity boundary",
          "url": "https://softwaresecurity.com/domains/identity-crypto/authentication/saml-verification-boundaries/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [
        {
          "title": "Prove deprovisioning reaches sessions and queued work",
          "url": "https://softwaresecurity.com/downloads/projects/identity-lifecycle-510849ac517b9ec2.zip",
          "limits": "Actual local transactions and authorization state. Normalized provisioning events, opaque credentials and local job effects; not a SCIM HTTP/PATCH server or external revocation service."
        }
      ],
      "mappings": []
    },
    {
      "id": "ID-04",
      "url": "https://softwaresecurity.com/coverage/#ID-04",
      "domain": "identity-crypto",
      "title": "Provisioning and deprovisioning",
      "desiredOutcome": "Identity changes promptly remove effective access across sessions, groups and queued work.",
      "status": "covered",
      "depth": "project",
      "historical": false,
      "remainingGap": "Add a complete SCIM connector with retry and reconciliation, and provider contract tests.",
      "platforms": [
        "SCIM",
        "directory lifecycle"
      ],
      "baselineKeys": [
        "asvs"
      ],
      "identifiers": [],
      "keywords": [
        "SCIM",
        "deprovisioning",
        "joiner mover leaver",
        "CAEP",
        "Shared Signals"
      ],
      "guides": [
        {
          "title": "SCIM deprovisioning: make account disablement remove every usable authority",
          "url": "https://softwaresecurity.com/domains/identity-crypto/authentication/scim-provisioning-deprovisioning/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [
        {
          "title": "Prove deprovisioning reaches sessions and queued work",
          "url": "https://softwaresecurity.com/downloads/projects/identity-lifecycle-510849ac517b9ec2.zip",
          "limits": "Actual local transactions and authorization state. Normalized provisioning events, opaque credentials and local job effects; not a SCIM HTTP/PATCH server or external revocation service."
        }
      ],
      "mappings": []
    },
    {
      "id": "ID-05",
      "url": "https://softwaresecurity.com/coverage/#ID-05",
      "domain": "identity-crypto",
      "title": "MFA, passkeys and account recovery",
      "desiredOutcome": "Second factors, passkey enrollment and replacement, and account recovery cannot bypass the intended identity proof.",
      "status": "covered",
      "depth": "workshop",
      "historical": false,
      "remainingGap": "Add real WebAuthn browser and authenticator tests, and recovery support-tool controls.",
      "platforms": [
        "Passkeys",
        "MFA",
        "account recovery"
      ],
      "baselineKeys": [
        "asvs",
        "wstg",
        "owasp-top10"
      ],
      "identifiers": [
        "CWE-308",
        "CWE-640"
      ],
      "keywords": [
        "MFA",
        "2FA",
        "TOTP",
        "passkeys",
        "WebAuthn",
        "FIDO2",
        "SMS codes",
        "push fatigue",
        "account recovery",
        "password reset"
      ],
      "guides": [
        {
          "title": "Stop account takeover with the right MFA and login defenses",
          "url": "https://softwaresecurity.com/domains/identity-crypto/authentication/mfa-account-takeover/"
        },
        {
          "title": "Passkeys and MFA: WebAuthn enrollment, sign-in and replacement",
          "url": "https://softwaresecurity.com/domains/identity-crypto/authentication/passkeys-mfa-lifecycle/"
        },
        {
          "title": "Account recovery: password resets, help-desk resets and account linking",
          "url": "https://softwaresecurity.com/domains/identity-crypto/authentication/account-recovery-linking/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [
        {
          "title": "Password reset token lab: Make a recovery credential single-use",
          "url": "https://softwaresecurity.com/labs/recovery/"
        }
      ],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "ID-12",
      "url": "https://softwaresecurity.com/coverage/#ID-12",
      "domain": "identity-crypto",
      "title": "Account takeover and credential attacks",
      "desiredOutcome": "Credential stuffing, enumeration and brute force are detected and slowed without locking out legitimate users.",
      "status": "covered",
      "depth": "scenario",
      "historical": false,
      "remainingGap": "Add measured rate-limit and bot-detection tuning on representative login traffic.",
      "platforms": [
        "Login endpoints",
        "edge controls"
      ],
      "baselineKeys": [
        "asvs",
        "owasp-top10"
      ],
      "identifiers": [
        "CWE-307",
        "CWE-204"
      ],
      "keywords": [
        "credential stuffing",
        "account takeover",
        "brute force",
        "user enumeration",
        "breached passwords"
      ],
      "guides": [
        {
          "title": "Stop account takeover with the right MFA and login defenses",
          "url": "https://softwaresecurity.com/domains/identity-crypto/authentication/mfa-account-takeover/"
        },
        {
          "title": "Operate edge rules without hiding application defects",
          "url": "https://softwaresecurity.com/domains/runtime/edge-defense/edge-waf-bot-defense/"
        },
        {
          "title": "Case study: event-stream and ua-parser-js, two npm package takeovers",
          "url": "https://softwaresecurity.com/domains/supply-chain/dependencies/case-study-event-stream/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "ID-06",
      "url": "https://softwaresecurity.com/coverage/#ID-06",
      "domain": "identity-crypto",
      "title": "Secrets and workload identity lifecycle",
      "desiredOutcome": "Credential issuance, use, rotation, leak detection and revocation keep least privilege and allow recovery.",
      "status": "covered",
      "depth": "workshop",
      "historical": false,
      "remainingGap": "Add vault and KMS integration with expiry, outage and revocation tests.",
      "platforms": [
        "Application secrets",
        "workload identities"
      ],
      "baselineKeys": [
        "asvs",
        "ssdf"
      ],
      "identifiers": [
        "CWE-798",
        "CWE-260",
        "CWE-522",
        "CWE-312"
      ],
      "keywords": [
        "secrets management",
        "leaked secret",
        "secret scanning",
        "push protection",
        "credential rotation",
        "workload identity",
        "OIDC federation"
      ],
      "guides": [
        {
          "title": "Secrets management: storage, rotation and leaked-secret response",
          "url": "https://softwaresecurity.com/domains/identity-crypto/secrets/secrets-lifecycle/"
        },
        {
          "title": "Contain a leaked secret, then investigate and clean up",
          "url": "https://softwaresecurity.com/domains/identity-crypto/secrets/leaked-secret-response/"
        },
        {
          "title": "Workload identity federation: short-lived, scoped identities for services and CI",
          "url": "https://softwaresecurity.com/domains/identity-crypto/identity/workload-identity-models/"
        },
        {
          "title": "Secrets at runtime: Vault, Kubernetes Secrets, CSI driver, External Secrets and SOPS",
          "url": "https://softwaresecurity.com/domains/identity-crypto/secrets/secrets-in-kubernetes-and-runtime/"
        },
        {
          "title": "Case study: Microsoft AI researchers' over-permissive SAS token (2023)",
          "url": "https://softwaresecurity.com/domains/runtime/cloud-posture/case-study-microsoft-sas-token/"
        },
        {
          "title": "Case study: the CircleCI security incident (January 2023)",
          "url": "https://softwaresecurity.com/domains/runtime/cloud-posture/case-study-circleci-2023/"
        },
        {
          "title": "Apply a security baseline across AWS, Azure and Google Cloud",
          "url": "https://softwaresecurity.com/domains/runtime/cloud-posture/cloud-provider-baselines/"
        },
        {
          "title": "Case study: the LastPass breach (2022)",
          "url": "https://softwaresecurity.com/domains/identity-crypto/secrets/case-study-lastpass-2022/"
        },
        {
          "title": "Case study: the Okta support-system breach and session tokens in HAR files (2023)",
          "url": "https://softwaresecurity.com/domains/identity-crypto/authentication/case-study-okta-har-2023/"
        }
      ],
      "fixCards": [
        {
          "title": "Hard-coded secrets",
          "url": "https://softwaresecurity.com/fix/hardcoded-secrets/"
        }
      ],
      "fixStacks": [],
      "workshops": [
        {
          "title": "Insecure randomness lab: Generate unguessable API keys",
          "url": "https://softwaresecurity.com/labs/insecure-randomness/"
        }
      ],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "ID-07",
      "url": "https://softwaresecurity.com/coverage/#ID-07",
      "domain": "identity-crypto",
      "title": "Authenticated encryption and algorithm choice",
      "desiredOutcome": "Encryption binds each record to its context with unique nonces, and every algorithm and parameter is chosen for its job.",
      "status": "covered",
      "depth": "project",
      "historical": false,
      "remainingGap": "Add durable distributed nonce and key allocation and recovery from storage corruption.",
      "platforms": [
        "Web Crypto AES-GCM",
        "encrypted records"
      ],
      "baselineKeys": [
        "asvs",
        "owasp-top10"
      ],
      "identifiers": [
        "CWE-327",
        "CWE-326",
        "CWE-328",
        "CWE-330",
        "CWE-338",
        "CWE-323",
        "CWE-1240"
      ],
      "keywords": [
        "AES-GCM",
        "AEAD",
        "nonce",
        "cryptography",
        "random numbers",
        "key derivation",
        "algorithm choice"
      ],
      "guides": [
        {
          "title": "AEAD records: AES-GCM nonces, associated data and key limits",
          "url": "https://softwaresecurity.com/domains/identity-crypto/encryption/authenticated-record-design/"
        },
        {
          "title": "Choose cryptographic algorithms and parameters by job",
          "url": "https://softwaresecurity.com/domains/identity-crypto/encryption/crypto-quick-reference/"
        },
        {
          "title": "Post-quantum migration: cryptographic inventory, hybrid TLS and deadlines",
          "url": "https://softwaresecurity.com/domains/identity-crypto/key-management-pki/crypto-inventory-pqc/"
        }
      ],
      "fixCards": [
        {
          "title": "Insecure randomness for security tokens",
          "url": "https://softwaresecurity.com/fix/insecure-randomness/"
        }
      ],
      "fixStacks": [],
      "workshops": [
        {
          "title": "AES-GCM nonce reuse lab: Fix a nonce allocator that breaks after restart",
          "url": "https://softwaresecurity.com/labs/nonces/"
        },
        {
          "title": "Insecure randomness lab: Generate unguessable API keys",
          "url": "https://softwaresecurity.com/labs/insecure-randomness/"
        }
      ],
      "localProjects": [
        {
          "title": "Bind ciphertext to the correct record",
          "url": "https://softwaresecurity.com/downloads/projects/encrypted-records-0959d731656638c9.zip",
          "limits": "Real encryption with temporary keys; this exercise does not implement a production key-management service."
        }
      ],
      "mappings": []
    },
    {
      "id": "ID-08",
      "url": "https://softwaresecurity.com/coverage/#ID-08",
      "domain": "identity-crypto",
      "title": "Key rotation, TLS and post-quantum migration",
      "desiredOutcome": "Keys and certificates can be rotated, restored and retired, TLS is configured from a tested baseline, and the cryptographic inventory supports migration.",
      "status": "covered",
      "depth": "project",
      "historical": false,
      "remainingGap": "Add KMS and PKI renewal and restore exercises, and protocol-specific post-quantum migration tests.",
      "platforms": [
        "KMS",
        "TLS and PKI",
        "crypto inventory"
      ],
      "baselineKeys": [
        "asvs"
      ],
      "identifiers": [
        "CWE-295",
        "CWE-297",
        "CWE-319"
      ],
      "keywords": [
        "TLS",
        "HSTS",
        "certificates",
        "PKI",
        "key rotation",
        "KMS",
        "post-quantum",
        "ML-KEM",
        "crypto agility"
      ],
      "guides": [
        {
          "title": "Envelope encryption and key rotation: data keys, KMS keys and backups",
          "url": "https://softwaresecurity.com/domains/identity-crypto/key-management-pki/envelope-encryption-rotation/"
        },
        {
          "title": "Operate TLS and certificates: configuration, renewal and verification",
          "url": "https://softwaresecurity.com/domains/identity-crypto/key-management-pki/tls-pki-operations/"
        },
        {
          "title": "Post-quantum migration: cryptographic inventory, hybrid TLS and deadlines",
          "url": "https://softwaresecurity.com/domains/identity-crypto/key-management-pki/crypto-inventory-pqc/"
        },
        {
          "title": "Case study: certificate expiry outages at Ericsson (2018) and Microsoft Teams (2020), and Equifax's blind spot",
          "url": "https://softwaresecurity.com/domains/identity-crypto/key-management-pki/case-study-certificate-expiry/"
        },
        {
          "title": "Case study: Storm-0558 and the forged Microsoft tokens (2023)",
          "url": "https://softwaresecurity.com/domains/identity-crypto/authentication/case-study-storm-0558/"
        },
        {
          "title": "Choose cryptographic algorithms and parameters by job",
          "url": "https://softwaresecurity.com/domains/identity-crypto/encryption/crypto-quick-reference/"
        }
      ],
      "fixCards": [
        {
          "title": "Improper TLS certificate validation",
          "url": "https://softwaresecurity.com/fix/tls-certificate-validation/"
        }
      ],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [
        {
          "title": "Bind ciphertext to the correct record",
          "url": "https://softwaresecurity.com/downloads/projects/encrypted-records-0959d731656638c9.zip",
          "limits": "Real encryption with temporary keys; this exercise does not implement a production key-management service."
        }
      ],
      "mappings": []
    },
    {
      "id": "ID-09",
      "url": "https://softwaresecurity.com/coverage/#ID-09",
      "domain": "identity-crypto",
      "title": "Cryptographic failure mechanisms",
      "desiredOutcome": "Engineers can tell deterministic leakage, oracles, weak keys, collisions and downgrade conditions apart.",
      "status": "covered",
      "depth": "scenario",
      "historical": true,
      "remainingGap": "These references explain why constructions failed; current choices are in the cryptography quick reference.",
      "platforms": [
        "Historical constructions"
      ],
      "baselineKeys": [
        "asvs"
      ],
      "identifiers": [],
      "keywords": [
        "ECB",
        "padding oracle",
        "hash collision",
        "RC4",
        "Sweet32",
        "weak RSA"
      ],
      "guides": [
        {
          "title": "ECB mode: why it leaks patterns and what to use instead",
          "url": "https://softwaresecurity.com/domains/identity-crypto/encryption/ecb-mode-leakage/"
        },
        {
          "title": "Padding oracle attacks",
          "url": "https://softwaresecurity.com/domains/identity-crypto/encryption/padding-oracle-attacks/"
        },
        {
          "title": "Hash collisions and digital signatures: MD5, SHA-1 and what to use",
          "url": "https://softwaresecurity.com/domains/identity-crypto/key-management-pki/hash-collisions-and-signatures/"
        },
        {
          "title": "Weak RSA key generation: shared primes, ROCA and safe keys",
          "url": "https://softwaresecurity.com/domains/identity-crypto/key-management-pki/weak-rsa-key-generation/"
        },
        {
          "title": "RC4 keystream bias",
          "url": "https://softwaresecurity.com/domains/identity-crypto/encryption/rc4-keystream-bias/"
        },
        {
          "title": "64-bit block ciphers and the Sweet32 mechanism",
          "url": "https://softwaresecurity.com/domains/identity-crypto/encryption/64-bit-block-ciphers-sweet32/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "ID-10",
      "url": "https://softwaresecurity.com/coverage/#ID-10",
      "domain": "identity-crypto",
      "title": "Historical incident lessons",
      "desiredOutcome": "Incident prerequisites are connected to present inventory and retirement decisions.",
      "status": "covered",
      "depth": "scenario",
      "historical": true,
      "remainingGap": "Add migration case studies that show discovery, replacement and verified removal in a modern system.",
      "platforms": [
        "Legacy protocol and key incidents"
      ],
      "baselineKeys": [
        "asvs"
      ],
      "identifiers": [],
      "keywords": [
        "WEP",
        "Flame",
        "POODLE",
        "Lucky Thirteen",
        "FREAK",
        "Logjam",
        "DROWN",
        "ROCA"
      ],
      "guides": [
        {
          "title": "WEP: RC4 key reuse and weak IVs",
          "url": "https://softwaresecurity.com/domains/identity-crypto/encryption/wep-rc4-key-reuse/"
        },
        {
          "title": "Flame: MD5 certificate forgery",
          "url": "https://softwaresecurity.com/domains/identity-crypto/key-management-pki/flame-md5-certificate-forgery/"
        },
        {
          "title": "Lucky Thirteen and POODLE: two different oracles",
          "url": "https://softwaresecurity.com/domains/identity-crypto/encryption/lucky13-poodle/"
        },
        {
          "title": "FREAK and Logjam: export-grade key exchange",
          "url": "https://softwaresecurity.com/domains/identity-crypto/key-management-pki/freak-logjam-export-grade-keys/"
        },
        {
          "title": "DROWN: one RSA key across incompatible protocols",
          "url": "https://softwaresecurity.com/domains/identity-crypto/encryption/drown/"
        },
        {
          "title": "Sweet32: the cost of a small block size",
          "url": "https://softwaresecurity.com/domains/identity-crypto/encryption/sweet32/"
        },
        {
          "title": "ROCA: structured RSA key generation",
          "url": "https://softwaresecurity.com/domains/identity-crypto/key-management-pki/roca-infineon-weak-keys/"
        },
        {
          "title": "Case study: the LastPass breach (2022)",
          "url": "https://softwaresecurity.com/domains/identity-crypto/secrets/case-study-lastpass-2022/"
        },
        {
          "title": "Case study: the Okta support-system breach and session tokens in HAR files (2023)",
          "url": "https://softwaresecurity.com/domains/identity-crypto/authentication/case-study-okta-har-2023/"
        },
        {
          "title": "Case study: certificate expiry outages at Ericsson (2018) and Microsoft Teams (2020), and Equifax's blind spot",
          "url": "https://softwaresecurity.com/domains/identity-crypto/key-management-pki/case-study-certificate-expiry/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "ID-11",
      "url": "https://softwaresecurity.com/coverage/#ID-11",
      "domain": "identity-crypto",
      "title": "Data minimization and privacy transformations",
      "desiredOutcome": "Collection, linkage, retention and deletion decisions keep documented purposes and boundaries.",
      "status": "covered",
      "depth": "scenario",
      "historical": false,
      "remainingGap": "Add a deletion and backup lifecycle project and measured re-identification examples.",
      "platforms": [
        "Application data lifecycle"
      ],
      "baselineKeys": [
        "asvs",
        "masvs"
      ],
      "identifiers": [
        "CWE-359"
      ],
      "keywords": [
        "data minimization",
        "retention",
        "deletion",
        "tokenization",
        "pseudonymization",
        "differential privacy",
        "crypto-shredding"
      ],
      "guides": [
        {
          "title": "Data minimization and retention: collect less and prove that deletion works",
          "url": "https://softwaresecurity.com/domains/identity-crypto/privacy/data-minimization-retention/"
        },
        {
          "title": "Tokenization, pseudonymization and privacy transformations: choose deliberately",
          "url": "https://softwaresecurity.com/domains/identity-crypto/privacy/tokenization-privacy-engineering/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "GOV-01",
      "url": "https://softwaresecurity.com/coverage/#GOV-01",
      "domain": "governance",
      "title": "Accountable product security practice",
      "desiredOutcome": "Owners and risk-based practices produce repeatable engineering decisions across the lifecycle.",
      "status": "covered",
      "depth": "scenario",
      "historical": false,
      "remainingGap": "The operating plan and assurance packet need organization-specific ownership and observed adoption.",
      "platforms": [
        "Product development lifecycle"
      ],
      "baselineKeys": [
        "ssdf"
      ],
      "identifiers": [],
      "keywords": [
        "AppSec program",
        "secure SDLC",
        "SSDF",
        "security program",
        "ownership"
      ],
      "guides": [
        {
          "title": "Start a minimal AppSec program with owners, triggers and metrics",
          "url": "https://softwaresecurity.com/frameworks/appsec-program/"
        },
        {
          "title": "Run an AppSec program: owners, finding states, deadlines and champions",
          "url": "https://softwaresecurity.com/frameworks/program-operations/"
        },
        {
          "title": "Apply NIST SSDF (SP 800-218) to one product: practices, evidence and attestation in 2026",
          "url": "https://softwaresecurity.com/frameworks/ssdf-product-lifecycle/"
        },
        {
          "title": "Review a code change through its trust boundaries",
          "url": "https://softwaresecurity.com/domains/appsec/code-review/security-code-review/"
        },
        {
          "title": "Meet the OpenSSF OSPS Baseline as a maintainer: the levels, every Level 1 control on GitHub, and the evidence",
          "url": "https://softwaresecurity.com/domains/supply-chain/ci-cd/osps-baseline-for-maintainers/"
        },
        {
          "title": "Map PCI DSS Requirement 6 to engineering practice and evidence",
          "url": "https://softwaresecurity.com/frameworks/pci-dss-requirement-6/"
        },
        {
          "title": "Run a security champions program with protected time and outcome metrics",
          "url": "https://softwaresecurity.com/frameworks/security-champions-program/"
        },
        {
          "title": "Staged rollout and rollback for security-critical updates",
          "url": "https://softwaresecurity.com/domains/supply-chain/releases/staged-rollout-rollback/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "GOV-02",
      "url": "https://softwaresecurity.com/coverage/#GOV-02",
      "domain": "governance",
      "title": "Requirement-bound verification",
      "desiredOutcome": "A claim joins a scoped requirement, its implementation, a repeatable test and evidence from the exact candidate.",
      "status": "covered",
      "depth": "project",
      "historical": false,
      "remainingGap": "Coverage is selective; full ASVS level assessments and cross-framework equivalence are not asserted.",
      "platforms": [
        "Application assurance"
      ],
      "baselineKeys": [
        "asvs",
        "wstg",
        "ssdf"
      ],
      "identifiers": [],
      "keywords": [
        "ASVS",
        "verification",
        "evidence",
        "control mapping",
        "OLIR"
      ],
      "guides": [
        {
          "title": "ASVS 5.0 verification records: requirement, test and evidence another engineer can repeat",
          "url": "https://softwaresecurity.com/frameworks/asvs-verification-evidence/"
        },
        {
          "title": "Control mapping between frameworks: state the relationship without overstating equivalence",
          "url": "https://softwaresecurity.com/frameworks/control-mapping-and-evidence/"
        },
        {
          "title": "Compliance evidence reuse: one evidence set for SSDF, PCI DSS, ISO 27001, SOC 2 and the CRA",
          "url": "https://softwaresecurity.com/frameworks/compliance-evidence-reuse/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [
        {
          "title": "Release evidence lab: Keep stale test evidence out of a release decision",
          "url": "https://softwaresecurity.com/labs/release-evidence/"
        }
      ],
      "localProjects": [
        {
          "title": "Build and verify a signed software release",
          "url": "https://softwaresecurity.com/downloads/projects/release-verification-bd914fcbede61c32.zip",
          "limits": "Actual Ed25519 signatures over the DSSE pre-authentication encoding, checked against the DSSE test vector, and executable output; there is no certificate or transparency log, the local producer and consumer are not isolated, and this does not establish a SLSA level."
        }
      ],
      "mappings": [
        {
          "id": "SSDF 1.1 PO.4.1",
          "inventoryIds": [
            "GOV-02"
          ],
          "source": "https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-218.pdf",
          "relationship": "Relevant to defining security check criteria."
        },
        {
          "id": "SSDF 1.1 PW.8.2",
          "inventoryIds": [
            "APP-10",
            "GOV-02"
          ],
          "source": "https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-218.pdf",
          "relationship": "Relevant to scoped testing and retained outcomes."
        }
      ]
    },
    {
      "id": "GOV-03",
      "url": "https://softwaresecurity.com/coverage/#GOV-03",
      "domain": "governance",
      "title": "Maturity models and framework selection",
      "desiredOutcome": "Teams choose the framework that answers their question and assess evidence with stated confidence.",
      "status": "covered",
      "depth": "scenario",
      "historical": false,
      "remainingGap": "BSIMM, SAMM and SSDF have a comparison guide with a worked crosswalk, and SAMM an assessment guide; Microsoft SDL has no explainer or comparison yet.",
      "platforms": [
        "Security program assessment"
      ],
      "baselineKeys": [
        "ssdf"
      ],
      "identifiers": [],
      "keywords": [
        "SAMM",
        "BSIMM",
        "maturity model",
        "Microsoft SDL",
        "framework selection"
      ],
      "guides": [
        {
          "title": "Run an OWASP SAMM assessment with evidence and a practical roadmap",
          "url": "https://softwaresecurity.com/frameworks/samm-assessment/"
        },
        {
          "title": "ISO 27001, SOC 2, NIST CSF or FedRAMP: choose the framework by the question it answers",
          "url": "https://softwaresecurity.com/frameworks/choosing-assurance-frameworks/"
        },
        {
          "title": "SOC 2 for engineering teams: CC6, CC7 and CC8 controls and the evidence auditors test",
          "url": "https://softwaresecurity.com/frameworks/soc2-for-engineering-teams/"
        },
        {
          "title": "ISO 27001 secure development: Annex A 8.25 to 8.33 as engineering practice and evidence",
          "url": "https://softwaresecurity.com/frameworks/iso-27001-secure-development/"
        },
        {
          "title": "NIST CSF 2.0 for product teams: the outcomes you own and the evidence for them",
          "url": "https://softwaresecurity.com/frameworks/nist-csf-2-for-product-teams/"
        },
        {
          "title": "BSIMM vs SAMM vs SSDF: what each is for and which to use",
          "url": "https://softwaresecurity.com/frameworks/bsimm-samm-ssdf/"
        },
        {
          "title": "Set remediation SLAs and measure AppSec outcomes",
          "url": "https://softwaresecurity.com/frameworks/appsec-metrics-and-slas/"
        },
        {
          "title": "Run a security champions program with protected time and outcome metrics",
          "url": "https://softwaresecurity.com/frameworks/security-champions-program/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "GOV-04",
      "url": "https://softwaresecurity.com/coverage/#GOV-04",
      "domain": "governance",
      "title": "Exceptions, metrics and remediation SLAs",
      "desiredOutcome": "Unmet controls keep risk ownership and expiry, and the program measures outcomes rather than activity.",
      "status": "covered",
      "depth": "workshop",
      "historical": false,
      "remainingGap": "Templates need real acceptance authority, dates, compensating-control tests and reporting data.",
      "platforms": [
        "Release decisions",
        "risk registers"
      ],
      "baselineKeys": [
        "ssdf"
      ],
      "identifiers": [],
      "keywords": [
        "risk exception",
        "risk acceptance",
        "metrics",
        "KPI",
        "remediation SLA",
        "MTTR",
        "First American"
      ],
      "guides": [
        {
          "title": "Approve, expire and measure security exceptions without hiding risk",
          "url": "https://softwaresecurity.com/frameworks/risk-exceptions-and-metrics/"
        },
        {
          "title": "Set remediation SLAs and measure AppSec outcomes",
          "url": "https://softwaresecurity.com/frameworks/appsec-metrics-and-slas/"
        },
        {
          "title": "Case study: First American's EaglePro document exposure (2019)",
          "url": "https://softwaresecurity.com/domains/appsec/authorization/case-study-first-american/"
        },
        {
          "title": "Prioritize vulnerabilities by exploitation, exposure and impact",
          "url": "https://softwaresecurity.com/frameworks/vulnerability-prioritization/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [
        {
          "title": "Release evidence lab: Keep stale test evidence out of a release decision",
          "url": "https://softwaresecurity.com/labs/release-evidence/"
        }
      ],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "GOV-05",
      "url": "https://softwaresecurity.com/coverage/#GOV-05",
      "domain": "governance",
      "title": "Supplier assurance",
      "desiredOutcome": "Supplier evidence applies to the actual product, artifact, use and contractual boundary.",
      "status": "covered",
      "depth": "project",
      "historical": false,
      "remainingGap": "Add supplier evidence challenge-and-response cases and contract-specific follow-up examples.",
      "platforms": [
        "Procurement",
        "third-party software"
      ],
      "baselineKeys": [
        "ssdf"
      ],
      "identifiers": [],
      "keywords": [
        "supplier risk",
        "vendor assessment",
        "procurement",
        "SOC 2 report",
        "third party"
      ],
      "guides": [
        {
          "title": "Supplier software assurance: check SOC 2 reports, SBOMs and signed updates against your use",
          "url": "https://softwaresecurity.com/frameworks/supplier-software-assurance/"
        },
        {
          "title": "NIS2 and DORA for software suppliers: what reaches you and the evidence to keep",
          "url": "https://softwaresecurity.com/frameworks/nis2-dora-for-software-suppliers/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [
        {
          "title": "Build and verify a signed software release",
          "url": "https://softwaresecurity.com/downloads/projects/release-verification-bd914fcbede61c32.zip",
          "limits": "Actual Ed25519 signatures over the DSSE pre-authentication encoding, checked against the DSSE test vector, and executable output; there is no certificate or transparency log, the local producer and consumer are not isolated, and this does not establish a SLSA level."
        }
      ],
      "mappings": []
    },
    {
      "id": "GOV-06",
      "url": "https://softwaresecurity.com/coverage/#GOV-06",
      "domain": "governance",
      "title": "Privacy and regulated data scope",
      "desiredOutcome": "Engineering evidence follows documented product, market, data and organizational applicability.",
      "status": "covered",
      "depth": "scenario",
      "historical": false,
      "remainingGap": "The guides scope GDPR, CCPA and HIPAA for engineering; jurisdiction-specific legal conclusions are out of scope (see OUT-01).",
      "platforms": [
        "Personal and health data"
      ],
      "baselineKeys": [
        "ssdf"
      ],
      "identifiers": [],
      "keywords": [
        "GDPR",
        "CCPA",
        "HIPAA",
        "privacy",
        "health data",
        "personal data"
      ],
      "guides": [
        {
          "title": "GDPR, CCPA, HIPAA or the FTC rule: scope privacy and health-data obligations before choosing controls",
          "url": "https://softwaresecurity.com/frameworks/privacy-and-health-data-scope/"
        },
        {
          "title": "GDPR privacy by design for engineers: Articles 25, 32 and 35 in code",
          "url": "https://softwaresecurity.com/frameworks/gdpr-privacy-by-design-engineering/"
        },
        {
          "title": "UK Software Security Code of Practice: the 14 principles as engineering practice",
          "url": "https://softwaresecurity.com/frameworks/uk-software-security-code-of-practice/"
        },
        {
          "title": "Regulated product security lifecycles: IEC 62443-4-1, FDA 524B, ISO/SAE 21434 and UN R155/R156",
          "url": "https://softwaresecurity.com/frameworks/regulated-product-security-lifecycle/"
        },
        {
          "title": "Secure WebRTC signaling, TURN relays and media servers",
          "url": "https://softwaresecurity.com/domains/appsec/secure-features/webrtc-security/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "GOV-07",
      "url": "https://softwaresecurity.com/coverage/#GOV-07",
      "domain": "governance",
      "title": "EU Cyber Resilience Act",
      "desiredOutcome": "Products with digital elements meet CRA vulnerability handling and reporting duties with evidence ready for the deadlines.",
      "status": "covered",
      "depth": "scenario",
      "historical": false,
      "remainingGap": "Reporting (from 11 September 2026) has a runbook; Annex I conformity evidence and support-period decisions have no dedicated guide yet.",
      "platforms": [
        "Products sold in the EU"
      ],
      "baselineKeys": [
        "ssdf"
      ],
      "identifiers": [],
      "keywords": [
        "CRA",
        "Cyber Resilience Act",
        "ENISA",
        "Single Reporting Platform",
        "Annex I",
        "CE marking"
      ],
      "external": {
        "title": "Regulation (EU) 2024/2847 (Cyber Resilience Act)",
        "url": "https://eur-lex.europa.eu/eli/reg/2024/2847/oj/eng"
      },
      "guides": [
        {
          "title": "Cyber Resilience Act and payment pages: turn product-security obligations into an engineering evidence plan",
          "url": "https://softwaresecurity.com/frameworks/product-security-obligations/"
        },
        {
          "title": "Build a runbook for CRA vulnerability and incident reporting",
          "url": "https://softwaresecurity.com/frameworks/cra-reporting-runbook/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "GOV-08",
      "url": "https://softwaresecurity.com/coverage/#GOV-08",
      "domain": "governance",
      "title": "PCI DSS secure development and payment pages",
      "desiredOutcome": "Requirement 6 and 11.6.1 evidence comes from real engineering records for each release.",
      "status": "covered",
      "depth": "scenario",
      "historical": false,
      "remainingGap": "Requirement 6.2.2 role-based training has no dedicated guide yet.",
      "platforms": [
        "Cardholder data environments"
      ],
      "baselineKeys": [
        "ssdf"
      ],
      "identifiers": [],
      "keywords": [
        "PCI DSS",
        "Requirement 6",
        "6.4.3",
        "11.6.1",
        "payment page",
        "e-skimming"
      ],
      "guides": [
        {
          "title": "Map PCI DSS Requirement 6 to engineering practice and evidence",
          "url": "https://softwaresecurity.com/frameworks/pci-dss-requirement-6/"
        },
        {
          "title": "Cyber Resilience Act and payment pages: turn product-security obligations into an engineering evidence plan",
          "url": "https://softwaresecurity.com/frameworks/product-security-obligations/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "GOV-09",
      "url": "https://softwaresecurity.com/coverage/#GOV-09",
      "domain": "governance",
      "title": "ISO/IEC 27001 and SOC 2 engineering evidence",
      "desiredOutcome": "Engineering supplies evidence for ISO/IEC 27001:2022 Annex A secure-development controls and SOC 2 change and operations criteria.",
      "status": "covered",
      "depth": "scenario",
      "historical": false,
      "remainingGap": "Annex A 8.25 to 8.33 and SOC 2 CC6 to CC8 each have a control-to-evidence guide with a check script, and one evidence set serves both. The SOC 2 criteria outside access, operations and change management (availability, confidentiality, processing integrity and privacy) are not covered.",
      "platforms": [
        "Certified organizations"
      ],
      "baselineKeys": [
        "ssdf"
      ],
      "identifiers": [],
      "keywords": [
        "ISO 27001",
        "ISO/IEC 27001",
        "Annex A",
        "SOC 2",
        "Trust Services Criteria",
        "CC6",
        "CC7",
        "CC8"
      ],
      "external": {
        "title": "ISO/IEC 27001:2022",
        "url": "https://www.iso.org/standard/82875.html"
      },
      "guides": [
        {
          "title": "ISO 27001, SOC 2, NIST CSF or FedRAMP: choose the framework by the question it answers",
          "url": "https://softwaresecurity.com/frameworks/choosing-assurance-frameworks/"
        },
        {
          "title": "SOC 2 for engineering teams: CC6, CC7 and CC8 controls and the evidence auditors test",
          "url": "https://softwaresecurity.com/frameworks/soc2-for-engineering-teams/"
        },
        {
          "title": "ISO 27001 secure development: Annex A 8.25 to 8.33 as engineering practice and evidence",
          "url": "https://softwaresecurity.com/frameworks/iso-27001-secure-development/"
        },
        {
          "title": "Compliance evidence reuse: one evidence set for SSDF, PCI DSS, ISO 27001, SOC 2 and the CRA",
          "url": "https://softwaresecurity.com/frameworks/compliance-evidence-reuse/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "GOV-10",
      "url": "https://softwaresecurity.com/coverage/#GOV-10",
      "domain": "governance",
      "title": "NIS2 and DORA obligations for software teams",
      "desiredOutcome": "Teams in scope of NIS2 or DORA know which duties reach software development and suppliers.",
      "status": "covered",
      "depth": "scenario",
      "historical": false,
      "remainingGap": "The guide covers who is in scope, Implementing Regulation 2024/2690, DORA contract terms and the register of information, with one assurance pack for both. National NIS2 transpositions are not tracked country by country.",
      "platforms": [
        "Organizations in the EU"
      ],
      "baselineKeys": [
        "ssdf"
      ],
      "identifiers": [],
      "keywords": [
        "NIS2",
        "DORA",
        "Digital Operational Resilience Act",
        "ICT third-party risk",
        "EU directive"
      ],
      "external": {
        "title": "Directive (EU) 2022/2555 (NIS2)",
        "url": "https://eur-lex.europa.eu/eli/dir/2022/2555/oj/eng"
      },
      "guides": [
        {
          "title": "NIS2 and DORA for software suppliers: what reaches you and the evidence to keep",
          "url": "https://softwaresecurity.com/frameworks/nis2-dora-for-software-suppliers/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "GOV-11",
      "url": "https://softwaresecurity.com/coverage/#GOV-11",
      "domain": "governance",
      "title": "Vulnerability prioritization",
      "desiredOutcome": "Remediation order and due dates follow exploitation, exposure and impact evidence, not a single score.",
      "status": "covered",
      "depth": "scenario",
      "historical": false,
      "remainingGap": "Scores change over time; recompute priorities on a schedule as EPSS and KEV data update.",
      "platforms": [
        "Vulnerability management"
      ],
      "baselineKeys": [
        "ssdf"
      ],
      "identifiers": [],
      "keywords": [
        "CVSS",
        "EPSS",
        "KEV",
        "SSVC",
        "NVD",
        "prioritization",
        "vulnerability management"
      ],
      "guides": [
        {
          "title": "Prioritize vulnerabilities by exploitation, exposure and impact",
          "url": "https://softwaresecurity.com/frameworks/vulnerability-prioritization/"
        },
        {
          "title": "Triage new dependency vulnerability findings",
          "url": "https://softwaresecurity.com/domains/supply-chain/dependencies/evidence-based-triage/"
        },
        {
          "title": "Respond to an exploited or malicious dependency",
          "url": "https://softwaresecurity.com/domains/appsec/vulnerability-response/dependency-vulnerability-response/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "GOV-12",
      "url": "https://softwaresecurity.com/coverage/#GOV-12",
      "domain": "governance",
      "title": "Security champions and developer training",
      "desiredOutcome": "Champions have protected time and measured outcomes, and developers get training matched to their role.",
      "status": "covered",
      "depth": "scenario",
      "historical": false,
      "remainingGap": "Champions and role-based training each have a guide, with the training evidence PCI DSS 6.2.2 and SSDF PO.2.2 ask for; the team plans on /learn/teams/ supply sessions and exercises. There is no material for running live hands-on events such as capture-the-flag days.",
      "platforms": [
        "Engineering organizations"
      ],
      "baselineKeys": [
        "ssdf"
      ],
      "identifiers": [],
      "keywords": [
        "security champions",
        "developer training",
        "secure coding training",
        "security culture"
      ],
      "guides": [
        {
          "title": "Run a security champions program with protected time and outcome metrics",
          "url": "https://softwaresecurity.com/frameworks/security-champions-program/"
        },
        {
          "title": "Run a developer security training program that changes code",
          "url": "https://softwaresecurity.com/frameworks/developer-security-training/"
        },
        {
          "title": "Run an AppSec program: owners, finding states, deadlines and champions",
          "url": "https://softwaresecurity.com/frameworks/program-operations/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "GOV-13",
      "url": "https://softwaresecurity.com/coverage/#GOV-13",
      "domain": "governance",
      "title": "Secure by Design commitments",
      "desiredOutcome": "Products ship secure by default, and the maker can show progress on the CISA Secure by Design goals.",
      "status": "covered",
      "depth": "scenario",
      "historical": false,
      "remainingGap": "The three principles and the seven pledge goals have engineering actions and evidence checks, and the UK code of practice maps its 14 principles. Secure-by-design guidance from other national agencies is not compared.",
      "platforms": [
        "Software manufacturers"
      ],
      "baselineKeys": [
        "ssdf"
      ],
      "identifiers": [],
      "keywords": [
        "Secure by Design",
        "secure by default",
        "CISA pledge",
        "memory safety roadmap"
      ],
      "external": {
        "title": "CISA Secure by Design",
        "url": "https://www.cisa.gov/securebydesign"
      },
      "guides": [
        {
          "title": "Apply CISA Secure by Design: principles, pledge goals and evidence",
          "url": "https://softwaresecurity.com/frameworks/secure-by-design/"
        },
        {
          "title": "UK Software Security Code of Practice: the 14 principles as engineering practice",
          "url": "https://softwaresecurity.com/frameworks/uk-software-security-code-of-practice/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "GOV-14",
      "url": "https://softwaresecurity.com/coverage/#GOV-14",
      "domain": "governance",
      "title": "Software attestation for public-sector buyers",
      "desiredOutcome": "Producers can state which SSDF practices an attestation covers and back each claim with release evidence.",
      "status": "covered",
      "depth": "scenario",
      "historical": false,
      "remainingGap": "The attestation guide walks through each part of the CISA form, the SSDF 1.1 tasks its appendix maps to each statement, the release evidence to keep with a tested check, the POA&M and third-party assessor options, and the status after OMB M-26-05 and the withdrawn FAR case. Agency-specific terms are covered only where public sources show them, such as GSA's copy of the form; other agencies' contract clauses are not tracked.",
      "platforms": [
        "US federal suppliers"
      ],
      "baselineKeys": [
        "ssdf"
      ],
      "identifiers": [],
      "keywords": [
        "software attestation",
        "secure software development attestation",
        "OMB",
        "federal",
        "M-26-05",
        "CISA attestation form",
        "POA&M"
      ],
      "guides": [
        {
          "title": "Answer a US federal secure software attestation request in 2026: the CISA form, its SSDF mapping and the evidence behind each statement",
          "url": "https://softwaresecurity.com/frameworks/secure-software-attestation-form/"
        },
        {
          "title": "Apply NIST SSDF (SP 800-218) to one product: practices, evidence and attestation in 2026",
          "url": "https://softwaresecurity.com/frameworks/ssdf-product-lifecycle/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "GOV-15",
      "url": "https://softwaresecurity.com/coverage/#GOV-15",
      "domain": "governance",
      "title": "Careers and certifications",
      "desiredOutcome": "Readers can see what each security role does and what each certification demonstrates.",
      "status": "covered",
      "depth": "scenario",
      "historical": false,
      "remainingGap": "Application and product security roles have tracks, a skills matrix, portfolio advice and what each certification shows. Adjacent careers such as security operations, governance and risk, and penetration testing are only touched on.",
      "platforms": [
        "Practitioners"
      ],
      "baselineKeys": [],
      "identifiers": [],
      "keywords": [
        "career",
        "careers",
        "certification",
        "certifications",
        "job",
        "interview",
        "AppSec engineer"
      ],
      "external": {
        "title": "NICE Workforce Framework for Cybersecurity",
        "url": "https://www.nist.gov/itl/applied-cybersecurity/nice/nice-framework-resource-center"
      },
      "guides": [
        {
          "title": "Build an application security career: roles, skills, portfolio and certifications",
          "url": "https://softwaresecurity.com/frameworks/appsec-careers/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "AI-01",
      "url": "https://softwaresecurity.com/coverage/#AI-01",
      "domain": "ai-emerging",
      "title": "Untrusted instruction containment",
      "desiredOutcome": "Retrieved text and tool messages cannot grant authority or redirect privileged application behavior.",
      "status": "covered",
      "depth": "project",
      "historical": false,
      "remainingGap": "Add interoperable MCP transports and delegated-token integration across several services.",
      "platforms": [
        "LLM apps",
        "MCP",
        "multi-agent systems"
      ],
      "baselineKeys": [
        "owasp-llm",
        "owasp-agentic",
        "nist-ai-100-2"
      ],
      "identifiers": [
        "LLM01:2026",
        "ASI01:2026"
      ],
      "keywords": [
        "prompt injection",
        "indirect prompt injection",
        "MCP",
        "goal hijack",
        "jailbreak"
      ],
      "guides": [
        {
          "title": "Contain prompt injection at the application boundary",
          "url": "https://softwaresecurity.com/domains/ai-emerging/llm-security/prompt-injection-boundaries/"
        },
        {
          "title": "Constrain MCP and multi-agent trust boundaries",
          "url": "https://softwaresecurity.com/domains/ai-emerging/agent-security/mcp-multiagent-security/"
        },
        {
          "title": "Red-team LLM applications and agents by their effects",
          "url": "https://softwaresecurity.com/domains/ai-emerging/assurance/ai-red-teaming/"
        },
        {
          "title": "Secure AI-assisted development with coding assistants and agents",
          "url": "https://softwaresecurity.com/domains/ai-emerging/agent-security/ai-assisted-development/"
        },
        {
          "title": "Defend agent memory and context against poisoning (OWASP ASI06)",
          "url": "https://softwaresecurity.com/domains/ai-emerging/agent-security/agent-memory-poisoning/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [
        {
          "title": "Excessive agency lab: Bind an agent’s action to the approved arguments",
          "url": "https://softwaresecurity.com/labs/agent-tool-gateway/"
        }
      ],
      "localProjects": [
        {
          "title": "Enforce retrieval and tool boundaries across crashes",
          "url": "https://softwaresecurity.com/downloads/projects/agent-tool-boundaries-26b9a352bb160338.zip",
          "limits": "Real SQLite transactions and independent durable provider receipts; deterministic ranker and trusted test identities. No model, MCP implementation or external effects."
        }
      ],
      "mappings": []
    },
    {
      "id": "AI-02",
      "url": "https://softwaresecurity.com/coverage/#AI-02",
      "domain": "ai-emerging",
      "title": "Retrieval and memory isolation",
      "desiredOutcome": "Documents and memory cross no unauthorized tenant or user boundary before reranking, generation or caching.",
      "status": "covered",
      "depth": "project",
      "historical": false,
      "remainingGap": "Add real vector-store ACL enforcement, deleted-document propagation and cache invalidation tests, and a runnable project that poisons agent memory across sessions and exercises the write gate, quarantine and rollback.",
      "platforms": [
        "RAG",
        "tenant memory"
      ],
      "baselineKeys": [
        "owasp-llm",
        "owasp-agentic"
      ],
      "identifiers": [
        "LLM02:2026",
        "LLM09:2026",
        "ASI06:2026"
      ],
      "keywords": [
        "RAG",
        "vector database",
        "embeddings",
        "tenant isolation",
        "agent memory",
        "memory poisoning",
        "context poisoning",
        "memory hardening"
      ],
      "guides": [
        {
          "title": "Keep retrieval inside the user’s data boundary",
          "url": "https://softwaresecurity.com/domains/ai-emerging/llm-security/rag-tenant-isolation/"
        },
        {
          "title": "Defend agent memory and context against poisoning (OWASP ASI06)",
          "url": "https://softwaresecurity.com/domains/ai-emerging/agent-security/agent-memory-poisoning/"
        },
        {
          "title": "Bound agent spending, memory and recovery",
          "url": "https://softwaresecurity.com/domains/ai-emerging/agent-security/cost-memory-operations/"
        },
        {
          "title": "Assess extraction, membership and inference risks",
          "url": "https://softwaresecurity.com/domains/ai-emerging/ml-security/model-privacy-attacks/"
        },
        {
          "title": "Call a hosted LLM API safely",
          "url": "https://softwaresecurity.com/domains/ai-emerging/llm-security/calling-llm-apis-safely/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [
        {
          "title": "RAG access control lab: Stop a retriever from returning another tenant’s documents",
          "url": "https://softwaresecurity.com/labs/rag-isolation/"
        }
      ],
      "localProjects": [
        {
          "title": "Enforce retrieval and tool boundaries across crashes",
          "url": "https://softwaresecurity.com/downloads/projects/agent-tool-boundaries-26b9a352bb160338.zip",
          "limits": "Real SQLite transactions and independent durable provider receipts; deterministic ranker and trusted test identities. No model, MCP implementation or external effects."
        }
      ],
      "mappings": []
    },
    {
      "id": "AI-03",
      "url": "https://softwaresecurity.com/coverage/#AI-03",
      "domain": "ai-emerging",
      "title": "Tool authority and side effects",
      "desiredOutcome": "Current access, exact approval, budget and durable execution jointly authorize each agent action.",
      "status": "covered",
      "depth": "project",
      "historical": false,
      "remainingGap": "Add external API side effects with outbox reconciliation and distributed approval consumption.",
      "platforms": [
        "Agent tools",
        "concurrent workers"
      ],
      "baselineKeys": [
        "owasp-llm",
        "owasp-agentic"
      ],
      "identifiers": [
        "LLM03:2026",
        "LLM06:2026",
        "ASI02:2026",
        "ASI03:2026",
        "ASI09:2026"
      ],
      "keywords": [
        "excessive agency",
        "tool misuse",
        "agent permissions",
        "human approval",
        "unbounded consumption",
        "AI cost",
        "approval fatigue",
        "human-agent trust exploitation"
      ],
      "guides": [
        {
          "title": "Authorize agent tools outside the model",
          "url": "https://softwaresecurity.com/domains/ai-emerging/agent-security/tool-authorization/"
        },
        {
          "title": "Bound agent spending, memory and recovery",
          "url": "https://softwaresecurity.com/domains/ai-emerging/agent-security/cost-memory-operations/"
        },
        {
          "title": "Constrain MCP and multi-agent trust boundaries",
          "url": "https://softwaresecurity.com/domains/ai-emerging/agent-security/mcp-multiagent-security/"
        },
        {
          "title": "Contain cascading failures and rogue agents",
          "url": "https://softwaresecurity.com/domains/ai-emerging/agent-security/agent-failure-containment/"
        },
        {
          "title": "Contain LLM misinformation (OWASP LLM07:2026)",
          "url": "https://softwaresecurity.com/domains/ai-emerging/llm-security/llm-misinformation/"
        },
        {
          "title": "Case study: Moffatt v. Air Canada, a chatbot that misstated the refund policy (2022-2024)",
          "url": "https://softwaresecurity.com/domains/ai-emerging/llm-security/case-study-air-canada-chatbot/"
        },
        {
          "title": "Case study: the Nx s1ngularity compromise and its AI-assisted payload (2025)",
          "url": "https://softwaresecurity.com/domains/ai-emerging/agent-security/case-study-nx-s1ngularity/"
        },
        {
          "title": "Case study: the Amazon Q Developer extension compromise (2025)",
          "url": "https://softwaresecurity.com/domains/ai-emerging/agent-security/case-study-amazon-q-extension/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [
        {
          "title": "Excessive agency lab: Bind an agent’s action to the approved arguments",
          "url": "https://softwaresecurity.com/labs/agent-tool-gateway/"
        }
      ],
      "localProjects": [
        {
          "title": "Enforce retrieval and tool boundaries across crashes",
          "url": "https://softwaresecurity.com/downloads/projects/agent-tool-boundaries-26b9a352bb160338.zip",
          "limits": "Real SQLite transactions and independent durable provider receipts; deterministic ranker and trusted test identities. No model, MCP implementation or external effects."
        }
      ],
      "mappings": []
    },
    {
      "id": "AI-04",
      "url": "https://softwaresecurity.com/coverage/#AI-04",
      "domain": "ai-emerging",
      "title": "Generated output handling",
      "desiredOutcome": "Generated content stays untrusted at every rendering, parsing and command boundary.",
      "status": "covered",
      "depth": "project",
      "historical": false,
      "remainingGap": "Add browser DOM and downstream parser tests beyond the current encoder checks. Run the code-sandbox project under gVisor or a microVM, and add a computer-use exercise with injected on-screen instructions; both are described but not yet tested here.",
      "platforms": [
        "Model output consumers"
      ],
      "baselineKeys": [
        "owasp-llm",
        "owasp-agentic"
      ],
      "identifiers": [
        "LLM10:2026",
        "ASI05:2026"
      ],
      "keywords": [
        "improper output handling",
        "LLM output",
        "markdown rendering",
        "code execution",
        "RCE",
        "code sandbox",
        "code interpreter",
        "computer use",
        "browser agent",
        "gVisor",
        "Firecracker"
      ],
      "guides": [
        {
          "title": "Keep generated output out of executable contexts",
          "url": "https://softwaresecurity.com/domains/ai-emerging/llm-security/untrusted-model-output/"
        },
        {
          "title": "Sandbox model-generated code and computer-use agents",
          "url": "https://softwaresecurity.com/domains/ai-emerging/agent-security/agent-code-sandboxing/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [
        {
          "title": "XSS lab: Render a model’s answer as text instead of active markup",
          "url": "https://softwaresecurity.com/labs/output-rendering/"
        }
      ],
      "localProjects": [
        {
          "title": "Run model-generated Python in a locked-down container",
          "url": "https://softwaresecurity.com/downloads/projects/agent-code-sandbox-ca88c140c78d6501.zip",
          "limits": "The offline tests use a stand-in for the docker CLI. The 12 live tests ran in Docker 29.4.3 with python:3.14.8-slim-trixie pinned by digest: network, host environment and files, a link to a host file, a bounded fork bomb, 1 GiB of memory, CPU share, a deadline and an output flood, plus three legitimate jobs. Containers share the host kernel; gVisor and microVMs were not tested."
        }
      ],
      "mappings": []
    },
    {
      "id": "AI-05",
      "url": "https://softwaresecurity.com/coverage/#AI-05",
      "domain": "ai-emerging",
      "title": "AI security evaluation and red teaming",
      "desiredOutcome": "Evaluations observe actual disclosure, effects and resource use across adversarial test sets.",
      "status": "partial",
      "depth": "project",
      "historical": false,
      "remainingGap": "Publish regression results from real models and providers. The versioned corpus, harness and regression gate exist, but the only recorded A-versus-B comparison comes from a deterministic simulator. Running the corpus against at least two real model versions or providers needs API access (or a local server with tool calling, such as vLLM or Ollama), permission to test them and about 300 trials per model; then commit both results files and the regression report.",
      "platforms": [
        "AI application evaluation"
      ],
      "baselineKeys": [
        "owasp-llm",
        "nist-ai-600-1",
        "nist-ai-100-2"
      ],
      "identifiers": [
        "LLM07:2026",
        "LLM08:2026"
      ],
      "keywords": [
        "AI red teaming",
        "LLM evaluation",
        "evals",
        "misinformation",
        "hidden context",
        "system prompt leakage",
        "red team",
        "MITRE ATLAS",
        "garak",
        "PyRIT",
        "promptfoo",
        "Inspect",
        "attack success rate",
        "eval regression"
      ],
      "guides": [
        {
          "title": "Build evaluations around prohibited outcomes",
          "url": "https://softwaresecurity.com/domains/ai-emerging/assurance/ai-security-evaluation/"
        },
        {
          "title": "Red-team LLM applications and agents by their effects",
          "url": "https://softwaresecurity.com/domains/ai-emerging/assurance/ai-red-teaming/"
        },
        {
          "title": "Keep secrets and controls out of hidden context (OWASP LLM08:2026)",
          "url": "https://softwaresecurity.com/domains/ai-emerging/llm-security/hidden-context-exposure/"
        },
        {
          "title": "Contain LLM misinformation (OWASP LLM07:2026)",
          "url": "https://softwaresecurity.com/domains/ai-emerging/llm-security/llm-misinformation/"
        },
        {
          "title": "Case study: Moffatt v. Air Canada, a chatbot that misstated the refund policy (2022-2024)",
          "url": "https://softwaresecurity.com/domains/ai-emerging/llm-security/case-study-air-canada-chatbot/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [
        {
          "title": "Gate model and provider changes on a versioned red-team corpus",
          "url": "https://softwaresecurity.com/downloads/projects/ai-eval-regression-eb82940745d462ec.zip",
          "limits": "The targets are a deterministic simulator of two model versions, not language models, so the recorded A-versus-B results show how the harness and gate behave, not how any real model does. The OpenAI-compatible adapter is tested only against a loopback stub. Effects are observed inside a sandboxed application; nothing is fetched or sent."
        }
      ],
      "mappings": []
    },
    {
      "id": "AI-06",
      "url": "https://softwaresecurity.com/coverage/#AI-06",
      "domain": "ai-emerging",
      "title": "Model and data integrity",
      "desiredOutcome": "Model artifacts and training or retrieval data keep trustworthy provenance and targeted-failure evaluation.",
      "status": "covered",
      "depth": "scenario",
      "historical": false,
      "remainingGap": "Add isolated model-deserialization and dataset-poisoning projects with measured targeted outcomes.",
      "platforms": [
        "Model supply chains",
        "training data"
      ],
      "baselineKeys": [
        "owasp-llm",
        "owasp-agentic",
        "nist-ai-100-2"
      ],
      "identifiers": [
        "LLM04:2026",
        "LLM05:2026",
        "ASI04:2026"
      ],
      "keywords": [
        "model supply chain",
        "safetensors",
        "pickle",
        "data poisoning",
        "model signing",
        "AIBOM"
      ],
      "guides": [
        {
          "title": "Treat model releases as executable supply-chain inputs",
          "url": "https://softwaresecurity.com/domains/ai-emerging/ml-security/model-artifact-security/"
        },
        {
          "title": "Protect training and retrieval data from targeted poisoning",
          "url": "https://softwaresecurity.com/domains/ai-emerging/ml-security/training-data-poisoning/"
        },
        {
          "title": "Constrain MCP and multi-agent trust boundaries",
          "url": "https://softwaresecurity.com/domains/ai-emerging/agent-security/mcp-multiagent-security/"
        },
        {
          "title": "Case study: the Nx s1ngularity compromise and its AI-assisted payload (2025)",
          "url": "https://softwaresecurity.com/domains/ai-emerging/agent-security/case-study-nx-s1ngularity/"
        },
        {
          "title": "Case study: the Amazon Q Developer extension compromise (2025)",
          "url": "https://softwaresecurity.com/domains/ai-emerging/agent-security/case-study-amazon-q-extension/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "AI-07",
      "url": "https://softwaresecurity.com/coverage/#AI-07",
      "domain": "ai-emerging",
      "title": "Privacy attack measurement",
      "desiredOutcome": "Privacy claims account for the attacker's knowledge, base rates and measured error rates.",
      "status": "covered",
      "depth": "scenario",
      "historical": false,
      "remainingGap": "Add a reproducible small-model membership-inference evaluation with documented consent and data provenance.",
      "platforms": [
        "Model privacy evaluations"
      ],
      "baselineKeys": [
        "owasp-llm",
        "nist-ai-100-2"
      ],
      "identifiers": [
        "LLM02:2026"
      ],
      "keywords": [
        "membership inference",
        "training data extraction",
        "model privacy",
        "differential privacy"
      ],
      "guides": [
        {
          "title": "Assess extraction, membership and inference risks",
          "url": "https://softwaresecurity.com/domains/ai-emerging/ml-security/model-privacy-attacks/"
        },
        {
          "title": "Call a hosted LLM API safely",
          "url": "https://softwaresecurity.com/domains/ai-emerging/llm-security/calling-llm-apis-safely/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "AI-09",
      "url": "https://softwaresecurity.com/coverage/#AI-09",
      "domain": "ai-emerging",
      "title": "AI-assisted development",
      "desiredOutcome": "Code from assistants and coding agents passes the same review, dependency and secret controls as human code, and agents run with bounded authority.",
      "status": "covered",
      "depth": "scenario",
      "historical": false,
      "remainingGap": "Add measured comparisons of assistant-generated code against the fix cards' regression tests.",
      "platforms": [
        "Coding assistants and agents"
      ],
      "baselineKeys": [
        "owasp-llm",
        "ssdf"
      ],
      "identifiers": [],
      "keywords": [
        "AI coding assistant",
        "Copilot",
        "coding agent",
        "slopsquatting",
        "AI-generated code"
      ],
      "guides": [
        {
          "title": "Secure AI-assisted development with coding assistants and agents",
          "url": "https://softwaresecurity.com/domains/ai-emerging/agent-security/ai-assisted-development/"
        },
        {
          "title": "Case study: the Nx s1ngularity compromise and its AI-assisted payload (2025)",
          "url": "https://softwaresecurity.com/domains/ai-emerging/agent-security/case-study-nx-s1ngularity/"
        },
        {
          "title": "Case study: the Amazon Q Developer extension compromise (2025)",
          "url": "https://softwaresecurity.com/domains/ai-emerging/agent-security/case-study-amazon-q-extension/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "AI-10",
      "url": "https://softwaresecurity.com/coverage/#AI-10",
      "domain": "ai-emerging",
      "title": "Agent failure containment",
      "desiredOutcome": "A compromised or failing agent cannot cascade through other agents or keep acting outside its mandate.",
      "status": "covered",
      "depth": "scenario",
      "historical": false,
      "remainingGap": "Add a runnable multi-agent project that trips the kill switch, circuit breaker and run limits under injected faults, and a lab on compensating rollback from an operation log.",
      "platforms": [
        "Multi-agent systems"
      ],
      "baselineKeys": [
        "owasp-agentic"
      ],
      "identifiers": [
        "ASI08:2026",
        "ASI10:2026"
      ],
      "keywords": [
        "cascading failures",
        "rogue agent",
        "agent kill switch",
        "multi-agent failure"
      ],
      "external": {
        "title": "OWASP Top 10 for Agentic Applications 2026",
        "url": "https://genai.owasp.org/resource/owasp-top-10-for-agentic-applications-for-2026/"
      },
      "guides": [
        {
          "title": "Contain cascading failures and rogue agents",
          "url": "https://softwaresecurity.com/domains/ai-emerging/agent-security/agent-failure-containment/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "AI-11",
      "url": "https://softwaresecurity.com/coverage/#AI-11",
      "domain": "ai-emerging",
      "title": "AI governance and regulation",
      "desiredOutcome": "Teams map AI features to the NIST AI RMF and Generative AI Profile, ISO/IEC 42001 and the EU AI Act timeline.",
      "status": "covered",
      "depth": "scenario",
      "historical": false,
      "remainingGap": "Add a worked Annex IV technical documentation and conformity-assessment example. Revisit when the high-risk classification guidelines are final, harmonised standards are cited in the Official Journal and NIST publishes its AI RMF revision.",
      "platforms": [
        "AI features"
      ],
      "baselineKeys": [
        "nist-ai-600-1"
      ],
      "identifiers": [],
      "keywords": [
        "AI governance",
        "EU AI Act",
        "AI Act",
        "NIST AI RMF",
        "AI 600-1",
        "ISO 42001",
        "ISO/IEC 42001",
        "AI risk management"
      ],
      "external": {
        "title": "NIST AI 600-1: Generative AI Profile",
        "url": "https://www.nist.gov/publications/artificial-intelligence-risk-management-framework-generative-artificial-intelligence"
      },
      "guides": [
        {
          "title": "Turn NIST AI RMF, ISO/IEC 42001 and EU AI Act duties into engineering evidence",
          "url": "https://softwaresecurity.com/domains/ai-emerging/governance/ai-governance-regulation/"
        },
        {
          "title": "Build evaluations around prohibited outcomes",
          "url": "https://softwaresecurity.com/domains/ai-emerging/assurance/ai-security-evaluation/"
        }
      ],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "OUT-01",
      "url": "https://softwaresecurity.com/coverage/#OUT-01",
      "domain": "governance",
      "title": "Legal advice and compliance conclusions",
      "desiredOutcome": "Readers know where engineering guidance ends and legal advice begins.",
      "status": "out-of-scope",
      "depth": "gap",
      "historical": false,
      "remainingGap": "Out of scope: the guides explain engineering duties and evidence, not whether a law applies to a particular organization. Ask counsel for jurisdiction-specific conclusions.",
      "platforms": [
        "All"
      ],
      "baselineKeys": [],
      "identifiers": [],
      "keywords": [
        "legal advice",
        "lawyer",
        "is my company in scope",
        "compliance certification"
      ],
      "guides": [],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "OUT-02",
      "url": "https://softwaresecurity.com/coverage/#OUT-02",
      "domain": "governance",
      "title": "Product reviews and vendor rankings",
      "desiredOutcome": "Readers can evaluate tools against their own requirements.",
      "status": "out-of-scope",
      "depth": "gap",
      "historical": false,
      "remainingGap": "Out of scope: the site is vendor-neutral and does not rank or review commercial products; guides give selection criteria and test methods instead.",
      "platforms": [
        "All"
      ],
      "baselineKeys": [],
      "identifiers": [],
      "keywords": [
        "best SAST tool",
        "vendor comparison",
        "product review",
        "Gartner",
        "tool ranking"
      ],
      "guides": [],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "OUT-03",
      "url": "https://softwaresecurity.com/coverage/#OUT-03",
      "domain": "appsec",
      "title": "Exploit development and offensive tooling",
      "desiredOutcome": "Exploits shown here demonstrate a weakness well enough to prove the fix.",
      "status": "out-of-scope",
      "depth": "gap",
      "historical": false,
      "remainingGap": "Out of scope: weaponized exploits, exploit chains against real products and offensive tooling. Labs and fix cards include only the minimal exploit a regression test needs.",
      "platforms": [
        "All"
      ],
      "baselineKeys": [],
      "identifiers": [],
      "keywords": [
        "exploit development",
        "red team tooling",
        "malware",
        "C2",
        "0-day"
      ],
      "guides": [],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "OUT-04",
      "url": "https://softwaresecurity.com/coverage/#OUT-04",
      "domain": "runtime",
      "title": "Enterprise IT and network security operations",
      "desiredOutcome": "Software teams know which controls their own code and pipelines must provide.",
      "status": "out-of-scope",
      "depth": "gap",
      "historical": false,
      "remainingGap": "Out of scope: endpoint protection, email security, corporate network perimeter and SOC staffing. The runtime guides cover the workloads that teams build and run.",
      "platforms": [
        "All"
      ],
      "baselineKeys": [],
      "identifiers": [],
      "keywords": [
        "EDR",
        "antivirus",
        "email security",
        "firewall",
        "SOC",
        "SIEM vendor"
      ],
      "guides": [],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    },
    {
      "id": "OUT-05",
      "url": "https://softwaresecurity.com/coverage/#OUT-05",
      "domain": "appsec",
      "title": "Hardware and physical security",
      "desiredOutcome": "Firmware and update paths that software teams own are covered; silicon and physical access are not.",
      "status": "out-of-scope",
      "depth": "gap",
      "historical": false,
      "remainingGap": "Out of scope: chip design, hardware side channels and physical access controls. Firmware updates and secure boot are covered under APP-13.",
      "platforms": [
        "All"
      ],
      "baselineKeys": [],
      "identifiers": [],
      "keywords": [
        "hardware security",
        "side channel",
        "Spectre",
        "physical security",
        "chip"
      ],
      "guides": [],
      "fixCards": [],
      "fixStacks": [],
      "workshops": [],
      "localProjects": [],
      "mappings": []
    }
  ]
}