@blamejs/exceptd-skills 0.12.6 → 0.12.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +14 -0
- package/CHANGELOG.md +97 -0
- package/bin/exceptd.js +189 -52
- package/data/_indexes/_meta.json +37 -37
- package/data/_indexes/activity-feed.json +26 -26
- package/data/_indexes/catalog-summaries.json +8 -8
- package/data/_indexes/chains.json +238 -0
- package/data/_indexes/frequency.json +63 -5
- package/data/_indexes/jurisdiction-map.json +13 -3
- package/data/_indexes/section-offsets.json +881 -845
- package/data/_indexes/summary-cards.json +2 -2
- package/data/_indexes/token-budget.json +145 -125
- package/data/atlas-ttps.json +189 -1
- package/data/cwe-catalog.json +290 -1
- package/data/d3fend-catalog.json +163 -1
- package/data/framework-control-gaps.json +243 -0
- package/data/playbooks/containers.json +23 -5
- package/data/playbooks/cred-stores.json +9 -9
- package/data/playbooks/crypto.json +8 -8
- package/data/playbooks/hardening.json +46 -10
- package/data/playbooks/library-author.json +16 -20
- package/data/playbooks/mcp.json +64 -1
- package/data/playbooks/runtime.json +7 -7
- package/data/playbooks/sbom.json +11 -11
- package/data/playbooks/secrets.json +4 -4
- package/data/rfc-references.json +144 -0
- package/lib/refresh-external.js +25 -5
- package/lib/schemas/skill-frontmatter.schema.json +2 -2
- package/manifest-snapshot.json +1 -1
- package/manifest.json +67 -67
- package/package.json +2 -1
- package/sbom.cdx.json +6 -6
- package/scripts/check-sbom-currency.js +87 -0
- package/scripts/check-test-coverage.README.md +148 -0
- package/scripts/check-test-coverage.js +455 -0
- package/scripts/hooks/pre-commit.sh +19 -0
- package/scripts/predeploy.js +16 -30
- package/skills/age-gates-child-safety/skill.md +3 -0
- package/skills/ai-attack-surface/skill.md +4 -1
- package/skills/ai-c2-detection/skill.md +6 -1
- package/skills/ai-risk-management/skill.md +3 -0
- package/skills/api-security/skill.md +3 -0
- package/skills/attack-surface-pentest/skill.md +3 -0
- package/skills/cloud-security/skill.md +3 -0
- package/skills/container-runtime-security/skill.md +3 -0
- package/skills/coordinated-vuln-disclosure/skill.md +8 -1
- package/skills/defensive-countermeasure-mapping/skill.md +1 -1
- package/skills/dlp-gap-analysis/skill.md +3 -0
- package/skills/email-security-anti-phishing/skill.md +9 -1
- package/skills/identity-assurance/skill.md +6 -1
- package/skills/incident-response-playbook/skill.md +8 -2
- package/skills/kernel-lpe-triage/skill.md +24 -4
- package/skills/mcp-agent-trust/skill.md +4 -1
- package/skills/mlops-security/skill.md +3 -0
- package/skills/ot-ics-security/skill.md +3 -0
- package/skills/rag-pipeline-security/skill.md +3 -0
- package/skills/sector-energy/skill.md +3 -0
- package/skills/sector-federal-government/skill.md +3 -0
- package/skills/sector-financial/skill.md +3 -0
- package/skills/sector-healthcare/skill.md +3 -0
- package/skills/security-maturity-tiers/skill.md +19 -1
- package/skills/skill-update-loop/skill.md +32 -0
- package/skills/supply-chain-integrity/skill.md +3 -0
- package/skills/threat-modeling-methodology/skill.md +3 -0
- package/skills/webapp-security/skill.md +3 -0
package/data/d3fend-catalog.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"_meta": {
|
|
3
3
|
"schema_version": "1.0.0",
|
|
4
|
-
"last_updated": "2026-05-
|
|
4
|
+
"last_updated": "2026-05-13",
|
|
5
5
|
"d3fend_version": "1.0.0",
|
|
6
6
|
"d3fend_release_date": "2024-06-01",
|
|
7
7
|
"source": "https://d3fend.mitre.org",
|
|
@@ -734,5 +734,167 @@
|
|
|
734
734
|
"ai_pipeline_applicability": "Applies to persistent hosts running MCP servers, AI coding assistants, or AI build agents. For serverless invocations, equivalent is per-invocation runtime telemetry (Lambda extension hooks, Cloud Run service workload identity logs) correlated with the AI-API call graph.",
|
|
735
735
|
"lag_notes": "SI-4 / AU-2 require monitoring but do not require parent-child process-tree analytics. Most enterprise audits accept 'we have EDR' as evidence regardless of whether behavioral rules are tuned. Lag is in operationalization — control existence vs. detection quality.",
|
|
736
736
|
"last_verified": "2026-05-11"
|
|
737
|
+
},
|
|
738
|
+
"D3-ANCI": {
|
|
739
|
+
"id": "D3-ANCI",
|
|
740
|
+
"name": "Authentication Cache Invalidation",
|
|
741
|
+
"tactic": "Evict",
|
|
742
|
+
"subtactic": "Credential Eviction",
|
|
743
|
+
"description": "Forcibly invalidating cached or active authentication artifacts (tokens, session IDs, cached Kerberos tickets, browser SSO cookies) so that a compromised credential cannot be reused after detection. Distinct from credential rotation in that it acts on the live session state, not just the stored material.",
|
|
744
|
+
"counters_attack_techniques": ["T1078", "T1550", "T1539", "AML.T0055"],
|
|
745
|
+
"digital_artifacts_addressed": ["Authentication Session", "Access Token", "Browser Session", "Kerberos Ticket"],
|
|
746
|
+
"skills_referencing": ["cred-stores", "identity-assurance", "incident-response-playbook"],
|
|
747
|
+
"implementation_examples": [
|
|
748
|
+
"OAuth refresh-token revocation on detected credential compromise",
|
|
749
|
+
"klist purge + ticket-granting-service revocation on suspicious Kerberos use",
|
|
750
|
+
"Browser-side single-sign-on cookie invalidation pushed via IDP signal",
|
|
751
|
+
"Service-account JWT issuer kid-rotation followed by global verifier refresh"
|
|
752
|
+
],
|
|
753
|
+
"framework_controls_partially_mapped": ["NIST-800-53-IA-5(1)", "NIST-800-53-AC-12", "ISO-27001-2022-A.5.18"],
|
|
754
|
+
"ai_pipeline_applicability": "Applies to AI assistant identities (MCP server tokens, model-provider API keys). For ephemeral AI agents the cache invalidation is per-invocation; for long-lived AI sessions (assistant subscriptions), provider must expose a revoke API the operator can call.",
|
|
755
|
+
"lag_notes": "AC-12 (session termination) speaks to user sessions; service-to-service token invalidation under credential compromise is rarely audited. Operationalization gap: most orgs lack the integration to actively invalidate on detection.",
|
|
756
|
+
"last_verified": "2026-05-13"
|
|
757
|
+
},
|
|
758
|
+
"D3-CAA": {
|
|
759
|
+
"id": "D3-CAA",
|
|
760
|
+
"name": "Credential Access Auditing",
|
|
761
|
+
"tactic": "Detect",
|
|
762
|
+
"subtactic": "Credential Activity Analysis",
|
|
763
|
+
"description": "Recording and analyzing every access to credential stores (cloud secret managers, password vaults, KMS, environment-variable reads on privileged processes) to detect anomalous read patterns indicating credential theft or misuse.",
|
|
764
|
+
"counters_attack_techniques": ["T1555", "T1552", "T1078", "AML.T0055"],
|
|
765
|
+
"digital_artifacts_addressed": ["Credential Store Access Log", "Process Environment Variable Access"],
|
|
766
|
+
"skills_referencing": ["cred-stores", "secrets", "dlp-gap-analysis"],
|
|
767
|
+
"implementation_examples": [
|
|
768
|
+
"AWS Secrets Manager + CloudTrail GetSecretValue audit with anomaly baseline per principal",
|
|
769
|
+
"HashiCorp Vault audit log forwarded to SIEM with per-policy read-rate alerting",
|
|
770
|
+
"Linux audit on /proc/<pid>/environ reads outside the owning process",
|
|
771
|
+
"GitHub Actions secret-access audit + repository-event correlation"
|
|
772
|
+
],
|
|
773
|
+
"framework_controls_partially_mapped": ["NIST-800-53-AU-2", "NIST-800-53-AU-12", "ISO-27001-2022-A.8.15"],
|
|
774
|
+
"ai_pipeline_applicability": "Applies wherever AI agents fetch credentials at runtime (MCP server bootstrap, fine-tuning job startup). Serverless equivalent: cloud-provider native secret-fetch audit (Secrets Manager VPC endpoint logs, GCP Secret Manager IAM audit logs).",
|
|
775
|
+
"lag_notes": "AU-2 prescribes audit event categories; framework controls do not require per-secret access baselining. Compliance audits accept 'logging is enabled' without requiring detection rules on read anomalies.",
|
|
776
|
+
"last_verified": "2026-05-13"
|
|
777
|
+
},
|
|
778
|
+
"D3-CH": {
|
|
779
|
+
"id": "D3-CH",
|
|
780
|
+
"name": "Credential Hardening",
|
|
781
|
+
"tactic": "Harden",
|
|
782
|
+
"subtactic": "Credential Hardening",
|
|
783
|
+
"description": "Increasing the cryptographic and operational strength of credentials at rest and in transit — memory-hard password hashing, hardware-backed key storage, short credential lifetime, mandatory MFA on high-impact identities.",
|
|
784
|
+
"counters_attack_techniques": ["T1110", "T1555", "T1552"],
|
|
785
|
+
"digital_artifacts_addressed": ["Password Hash", "Private Key", "API Token", "Session Token"],
|
|
786
|
+
"skills_referencing": ["crypto-codebase", "identity-assurance", "cred-stores"],
|
|
787
|
+
"implementation_examples": [
|
|
788
|
+
"Argon2id password hashing with tuned m/t/p",
|
|
789
|
+
"TPM/HSM-backed private keys (Windows Hello for Business, Apple Secure Enclave, AWS CloudHSM)",
|
|
790
|
+
"Short-lived OIDC tokens with mandatory refresh-token rotation",
|
|
791
|
+
"WebAuthn/passkey adoption replacing password authentication"
|
|
792
|
+
],
|
|
793
|
+
"framework_controls_partially_mapped": ["NIST-800-53-IA-5", "NIST-800-53-SC-12", "NIST-SP-800-63B"],
|
|
794
|
+
"ai_pipeline_applicability": "Applies to credentials issued to AI agents — model-provider keys should be short-lived and rotated; MCP server tokens should use mTLS or signed JWTs rather than long-lived bearer secrets.",
|
|
795
|
+
"lag_notes": "IA-5 covers authenticator strength categorically; framework audit rarely samples the actual KDF in use. SP 800-63B's 2022 iteration-count update (PBKDF2 ≥ 600,000) lags in many compliance attestations citing the 2017 numbers.",
|
|
796
|
+
"last_verified": "2026-05-13"
|
|
797
|
+
},
|
|
798
|
+
"D3-EI": {
|
|
799
|
+
"id": "D3-EI",
|
|
800
|
+
"name": "Execution Isolation",
|
|
801
|
+
"tactic": "Isolate",
|
|
802
|
+
"subtactic": "Execution Isolation",
|
|
803
|
+
"description": "Constraining a process so that even successful exploitation cannot reach resources outside the isolation boundary — containers with read-only rootfs, sandboxed renderers, seccomp-restricted syscall sets, namespace-isolated workers, gVisor / Firecracker microVMs.",
|
|
804
|
+
"counters_attack_techniques": ["T1611", "T1068", "T1055", "T1106"],
|
|
805
|
+
"digital_artifacts_addressed": ["Process", "Container", "Sandbox", "Namespace"],
|
|
806
|
+
"skills_referencing": ["container-runtime-security", "hardening"],
|
|
807
|
+
"implementation_examples": [
|
|
808
|
+
"Read-only container rootfs + tmpfs for ephemeral state",
|
|
809
|
+
"seccomp-bpf default-deny syscall profiles per workload",
|
|
810
|
+
"gVisor (runsc) for untrusted-tenant workloads",
|
|
811
|
+
"Firecracker microVMs for multi-tenant SaaS execution",
|
|
812
|
+
"Linux user namespaces dropping CAP_SYS_ADMIN at process start"
|
|
813
|
+
],
|
|
814
|
+
"framework_controls_partially_mapped": ["NIST-800-53-SC-39", "NIST-800-53-AC-4", "ISO-27001-2022-A.8.22"],
|
|
815
|
+
"ai_pipeline_applicability": "Critical for AI agent execution: untrusted-code-execution tools (interpreter, code-runner MCP servers) must run in a microVM or gVisor sandbox, not in the host AI's process. Serverless platforms provide this implicitly (Lambda firecracker, Cloud Run gVisor).",
|
|
816
|
+
"lag_notes": "SC-39 covers process isolation conceptually; framework controls do not specify required isolation primitives. 'Containers' alone do not satisfy isolation without read-only rootfs + seccomp + capability dropping — controls rarely audit which container hardening is actually enforced.",
|
|
817
|
+
"last_verified": "2026-05-13"
|
|
818
|
+
},
|
|
819
|
+
"D3-FCR": {
|
|
820
|
+
"id": "D3-FCR",
|
|
821
|
+
"name": "File Content Rules",
|
|
822
|
+
"tactic": "Detect",
|
|
823
|
+
"subtactic": "File Analysis",
|
|
824
|
+
"description": "Inspecting file contents against rule sets (YARA, Sigma, custom regex, ML classifier) to detect malicious patterns, embedded secrets, or unauthorized content classes at rest or at egress.",
|
|
825
|
+
"counters_attack_techniques": ["T1552.001", "T1552.004", "T1567", "AML.T0055"],
|
|
826
|
+
"digital_artifacts_addressed": ["File Content", "Source Code", "Configuration File"],
|
|
827
|
+
"skills_referencing": ["secrets", "dlp-gap-analysis", "cred-stores"],
|
|
828
|
+
"implementation_examples": [
|
|
829
|
+
"gitleaks / trufflehog pre-commit and CI-time secret scanning",
|
|
830
|
+
"YARA rules on uploaded files at SaaS file-upload boundaries",
|
|
831
|
+
"DLP content-classification on outbound email + cloud-storage uploads",
|
|
832
|
+
"AI prompt-content classification before egress to public LLM endpoints"
|
|
833
|
+
],
|
|
834
|
+
"framework_controls_partially_mapped": ["NIST-800-53-SI-3", "NIST-800-53-SI-4", "ISO-27001-2022-A.8.12"],
|
|
835
|
+
"ai_pipeline_applicability": "Critical for AI exfil prevention: prompt content rules block sending sensitive data to public AI endpoints; retrieval-corpus content rules block injection of attacker-controlled documents. For RAG: per-document content classification at ingest.",
|
|
836
|
+
"lag_notes": "SI-3 / SI-4 cover monitoring categorically; rule-set freshness and tuning are operational concerns rarely audited. DLP frameworks lag in covering AI prompts as an egress channel.",
|
|
837
|
+
"last_verified": "2026-05-13"
|
|
838
|
+
},
|
|
839
|
+
"D3-KBPI": {
|
|
840
|
+
"id": "D3-KBPI",
|
|
841
|
+
"name": "Kernel-Based Process Isolation",
|
|
842
|
+
"tactic": "Isolate",
|
|
843
|
+
"subtactic": "Execution Isolation",
|
|
844
|
+
"description": "Using kernel primitives (namespaces, cgroups, seccomp, capabilities, LSMs, eBPF) to enforce isolation boundaries between processes that share the same kernel. Distinct from D3-EI in that the isolation is enforced inside a shared kernel rather than across a hypervisor or microVM boundary.",
|
|
845
|
+
"counters_attack_techniques": ["T1055", "T1068", "T1611"],
|
|
846
|
+
"digital_artifacts_addressed": ["Process", "Namespace", "cgroup", "LSM Profile"],
|
|
847
|
+
"skills_referencing": ["kernel-lpe-triage", "hardening", "container-runtime-security"],
|
|
848
|
+
"implementation_examples": [
|
|
849
|
+
"SELinux / AppArmor confinement profiles per workload",
|
|
850
|
+
"Linux user namespaces + capability dropping (CAP_SYS_ADMIN removed)",
|
|
851
|
+
"Landlock for application-level filesystem restriction",
|
|
852
|
+
"eBPF LSM hooks for fine-grained policy enforcement",
|
|
853
|
+
"systemd hardening directives (ProtectSystem=strict, RestrictSUIDSGID, NoNewPrivileges)"
|
|
854
|
+
],
|
|
855
|
+
"framework_controls_partially_mapped": ["NIST-800-53-SC-39", "NIST-800-53-AC-6"],
|
|
856
|
+
"ai_pipeline_applicability": "Less applicable on managed serverless (no kernel-tuning surface). Critical on self-managed hosts running MCP servers, AI build agents, training pipelines. Containerized AI runtimes still rely on kernel isolation primitives — a kernel LPE escapes the container.",
|
|
857
|
+
"lag_notes": "SC-39 process isolation is named but not parameterized; framework controls accept 'containers are used' as evidence without auditing the kernel-level confinement layer. KASLR + SMEP + SMAP + KPTI presence is implicit not explicit in any framework control.",
|
|
858
|
+
"last_verified": "2026-05-13"
|
|
859
|
+
},
|
|
860
|
+
"D3-SCA": {
|
|
861
|
+
"id": "D3-SCA",
|
|
862
|
+
"name": "System Call Analysis",
|
|
863
|
+
"tactic": "Detect",
|
|
864
|
+
"subtactic": "Process Analysis",
|
|
865
|
+
"description": "Recording and analyzing system calls made by processes to detect malicious behavior — unusual syscall patterns, attempts to disable security mechanisms, kernel exploitation primitives (e.g. unshare(2), ptrace(2) on unrelated PIDs, bpf(2) on unprivileged contexts).",
|
|
866
|
+
"counters_attack_techniques": ["T1055", "T1068", "T1562", "T1106"],
|
|
867
|
+
"digital_artifacts_addressed": ["System Call", "Process Behavior"],
|
|
868
|
+
"skills_referencing": ["runtime", "kernel-lpe-triage"],
|
|
869
|
+
"implementation_examples": [
|
|
870
|
+
"Linux auditd with syscall rules (ausearch -k privesc)",
|
|
871
|
+
"Falco runtime rules on suspicious syscall sequences",
|
|
872
|
+
"eBPF-based tools (tetragon, tracee) for kernel-level visibility",
|
|
873
|
+
"Sysdig / inspector for container-syscall-anomaly detection"
|
|
874
|
+
],
|
|
875
|
+
"framework_controls_partially_mapped": ["NIST-800-53-SI-4", "NIST-800-53-AU-2", "ISO-27001-2022-A.8.16"],
|
|
876
|
+
"ai_pipeline_applicability": "Self-managed AI hosts: standard syscall monitoring applies. Serverless: equivalent is provider-side runtime telemetry (Lambda runtime API, GVisor sentry events). MCP server hosts especially: malicious MCP plugins often hit suspicious syscalls (ptrace, bpf, unshare).",
|
|
877
|
+
"lag_notes": "SI-4 prescribes monitoring at the system level abstractly; specific syscall analytics (which calls, which thresholds, which response) are deployment-team choices that framework audits do not sample.",
|
|
878
|
+
"last_verified": "2026-05-13"
|
|
879
|
+
},
|
|
880
|
+
"D3-SFA": {
|
|
881
|
+
"id": "D3-SFA",
|
|
882
|
+
"name": "System File Analysis",
|
|
883
|
+
"tactic": "Detect",
|
|
884
|
+
"subtactic": "File Analysis",
|
|
885
|
+
"description": "Monitoring critical system files (auth databases, audit configurations, init scripts, boot loaders, sudoers, SSH authorized_keys) for unauthorized modification — file integrity monitoring with cryptographic baselines and immutable-write enforcement.",
|
|
886
|
+
"counters_attack_techniques": ["T1543", "T1547", "T1098", "T1562.001"],
|
|
887
|
+
"digital_artifacts_addressed": ["System File", "Configuration File", "File Hash"],
|
|
888
|
+
"skills_referencing": ["runtime", "hardening", "incident-response-playbook"],
|
|
889
|
+
"implementation_examples": [
|
|
890
|
+
"AIDE / Tripwire / OSSEC file-integrity baselines on /etc, /usr/bin, /sbin",
|
|
891
|
+
"Auditd watch rules on /etc/passwd, /etc/shadow, /etc/sudoers, ~/.ssh/authorized_keys",
|
|
892
|
+
"Linux IMA-EVM measured boot extending into runtime FIM",
|
|
893
|
+
"AWS Config rules monitoring IAM policy file analogs (managed-policy versions)"
|
|
894
|
+
],
|
|
895
|
+
"framework_controls_partially_mapped": ["NIST-800-53-SI-7", "NIST-800-53-AU-2", "ISO-27001-2022-A.8.13"],
|
|
896
|
+
"ai_pipeline_applicability": "Self-managed AI hosts: standard FIM applies to MCP server configs, ~/.claude, ~/.cursor settings. Serverless: equivalent is image-immutability + read-only rootfs (modifications outside writable tmpfs are structurally impossible).",
|
|
897
|
+
"lag_notes": "SI-7 covers software/firmware integrity; user-space configuration FIM is implicit not explicit. Framework audits accept 'FIM is deployed' without sampling whether the rule set covers AI-assistant config paths that have become high-value targets.",
|
|
898
|
+
"last_verified": "2026-05-13"
|
|
737
899
|
}
|
|
738
900
|
}
|
|
@@ -1251,5 +1251,248 @@
|
|
|
1251
1251
|
"attack_refs": [
|
|
1252
1252
|
"T1059"
|
|
1253
1253
|
]
|
|
1254
|
+
},
|
|
1255
|
+
"NIS2-Art21-incident-handling": {
|
|
1256
|
+
"framework": "EU NIS2 Directive (2022/2555)",
|
|
1257
|
+
"control_id": "Art. 21(2)(b)",
|
|
1258
|
+
"control_name": "Incident handling",
|
|
1259
|
+
"designed_for": "Essential and important entities operating in critical sectors across the EU; sets minimum cybersecurity risk-management measures including incident handling, business continuity, and supply chain security",
|
|
1260
|
+
"misses": [
|
|
1261
|
+
"Incident-handling 24-hour early-warning + 72-hour notification clock starts from awareness, not from detection — gap covers AI-mediated incidents detected only after material harm",
|
|
1262
|
+
"No explicit AI/ML incident category — prompt injection RCE, MCP supply-chain compromise, AI-API C2 not enumerated as in-scope incident classes",
|
|
1263
|
+
"'State of the art' wording leaves the framework lag-permissive — operators can claim compliance without AI-specific incident playbooks",
|
|
1264
|
+
"Cross-border supply-chain incidents (Shai-Hulud-class) span multiple competent authorities; coordination requirements are weakly specified"
|
|
1265
|
+
],
|
|
1266
|
+
"real_requirement": "Incident-handling playbook enumerates AI-specific classes (LLM prompt injection RCE, MCP plugin compromise, AI-API C2 beaconing) with detection sources, evidence requirements, and the cross-jurisdiction notification matrix (NIS2 24h early-warning + 72h full report alongside DORA 4h + GDPR 72h). Continuity plans assume AI-assistant denial-of-service alongside classical IT outages.",
|
|
1267
|
+
"status": "open",
|
|
1268
|
+
"opened_date": "2026-05-13",
|
|
1269
|
+
"evidence_cves": [
|
|
1270
|
+
"CVE-2025-53773",
|
|
1271
|
+
"CVE-2026-30615",
|
|
1272
|
+
"CVE-2026-45321"
|
|
1273
|
+
],
|
|
1274
|
+
"atlas_refs": [
|
|
1275
|
+
"AML.T0051",
|
|
1276
|
+
"AML.T0096"
|
|
1277
|
+
],
|
|
1278
|
+
"attack_refs": [
|
|
1279
|
+
"T1059",
|
|
1280
|
+
"T1567"
|
|
1281
|
+
]
|
|
1282
|
+
},
|
|
1283
|
+
"EU-AI-Act-Art-15": {
|
|
1284
|
+
"framework": "EU Artificial Intelligence Act (2024/1689)",
|
|
1285
|
+
"control_id": "Art. 15",
|
|
1286
|
+
"control_name": "Accuracy, robustness and cybersecurity",
|
|
1287
|
+
"designed_for": "Providers of high-risk AI systems; requires AI systems to achieve appropriate accuracy, robustness, and cybersecurity throughout their lifecycle",
|
|
1288
|
+
"misses": [
|
|
1289
|
+
"'Appropriate level of cybersecurity' is undefined operationally — no benchmark for prompt-injection resistance, RAG-poisoning robustness, or supply-chain attack resilience",
|
|
1290
|
+
"No required testing methodology — adversarial robustness assessment is recommended but not mandated with specific test classes",
|
|
1291
|
+
"Scope binds providers of high-risk AI systems; downstream operators integrating non-high-risk-classified AI (e.g. coding assistants) inherit no Art. 15 obligations even when they reach equivalent threat exposure",
|
|
1292
|
+
"Cybersecurity reporting integrates with NIS2 but does not specify AI-specific incident classes (prompt injection, model theft, RAG poisoning)"
|
|
1293
|
+
],
|
|
1294
|
+
"real_requirement": "AI-systems-in-scope undergo prompt-injection red-team (per OWASP LLM Top 10), RAG corpus integrity testing, MCP plugin trust verification, model-extraction-resistance assessment, and continuous adversarial regression. Cybersecurity reporting bridges to NIS2 + DORA notification clocks. Downstream operators apply equivalent diligence to AI tools used in their pipeline even when the AI itself isn't classified high-risk.",
|
|
1295
|
+
"status": "open",
|
|
1296
|
+
"opened_date": "2026-05-13",
|
|
1297
|
+
"evidence_cves": [
|
|
1298
|
+
"CVE-2025-53773",
|
|
1299
|
+
"CVE-2026-30615"
|
|
1300
|
+
],
|
|
1301
|
+
"atlas_refs": [
|
|
1302
|
+
"AML.T0010",
|
|
1303
|
+
"AML.T0051",
|
|
1304
|
+
"AML.T0054",
|
|
1305
|
+
"AML.T0057"
|
|
1306
|
+
],
|
|
1307
|
+
"attack_refs": []
|
|
1308
|
+
},
|
|
1309
|
+
"UK-CAF-A1": {
|
|
1310
|
+
"framework": "UK NCSC Cyber Assessment Framework v3.2",
|
|
1311
|
+
"control_id": "Objective A — Principle A1",
|
|
1312
|
+
"control_name": "Governance",
|
|
1313
|
+
"designed_for": "Operators of essential services and critical national infrastructure; sets a board-level governance expectation for cyber risk management",
|
|
1314
|
+
"misses": [
|
|
1315
|
+
"Governance principle is intentionally outcome-focused; without published Indicators of Good Practice (IGPs) for AI-specific governance, boards have no specific test for AI risk awareness",
|
|
1316
|
+
"No requirement to enumerate AI/ML supply-chain trust dependencies as a governance artefact",
|
|
1317
|
+
"AI-procurement governance overlap with NCSC AI Cyber Code of Practice is recommended but not enforced through CAF assessment criteria"
|
|
1318
|
+
],
|
|
1319
|
+
"real_requirement": "Board-level governance includes an AI-systems-in-use inventory, an MCP/plugin trust register with provenance attestation, and a documented assignment of accountability for AI security outcomes that maps to the NIS2/CCRA scope.",
|
|
1320
|
+
"status": "open",
|
|
1321
|
+
"opened_date": "2026-05-13",
|
|
1322
|
+
"evidence_cves": [
|
|
1323
|
+
"CVE-2026-30615"
|
|
1324
|
+
],
|
|
1325
|
+
"atlas_refs": [
|
|
1326
|
+
"AML.T0010"
|
|
1327
|
+
],
|
|
1328
|
+
"attack_refs": []
|
|
1329
|
+
},
|
|
1330
|
+
"UK-CAF-B2": {
|
|
1331
|
+
"framework": "UK NCSC Cyber Assessment Framework v3.2",
|
|
1332
|
+
"control_id": "Objective B — Principle B2",
|
|
1333
|
+
"control_name": "Identity and access control",
|
|
1334
|
+
"designed_for": "Restricting access to systems and data to authorised users, devices, and systems",
|
|
1335
|
+
"misses": [
|
|
1336
|
+
"AI agent identity is not addressed — AI assistants operate under user identity but execute attacker-controlled actions when prompt-injected (the access decision is correct at IAM layer; the action is not)",
|
|
1337
|
+
"MCP server / plugin trust is access-control-adjacent but framework treats plugins as part of the user's process, not as separate identities requiring authorization",
|
|
1338
|
+
"Service-account credentials for AI providers (OpenAI/Anthropic/HuggingFace) are not enumerated as a regulated credential class with rotation policy"
|
|
1339
|
+
],
|
|
1340
|
+
"real_requirement": "Identity controls treat AI agents as distinct principals where they execute tools; MCP plugin invocations log model decision + tool name + arguments + user identity; AI-provider service credentials are short-lived, rotated, and excluded from cleartext storage policy exceptions; passkeys/WebAuthn for human-operator-to-AI authentication where supported.",
|
|
1341
|
+
"status": "open",
|
|
1342
|
+
"opened_date": "2026-05-13",
|
|
1343
|
+
"evidence_cves": [
|
|
1344
|
+
"CVE-2025-53773",
|
|
1345
|
+
"CVE-2026-30615"
|
|
1346
|
+
],
|
|
1347
|
+
"atlas_refs": [
|
|
1348
|
+
"AML.T0010",
|
|
1349
|
+
"AML.T0051"
|
|
1350
|
+
],
|
|
1351
|
+
"attack_refs": [
|
|
1352
|
+
"T1078"
|
|
1353
|
+
]
|
|
1354
|
+
},
|
|
1355
|
+
"UK-CAF-C1": {
|
|
1356
|
+
"framework": "UK NCSC Cyber Assessment Framework v3.2",
|
|
1357
|
+
"control_id": "Objective C — Principle C1",
|
|
1358
|
+
"control_name": "Security monitoring",
|
|
1359
|
+
"designed_for": "Detecting and analysing events that may indicate a cybersecurity incident on the operator's essential function",
|
|
1360
|
+
"misses": [
|
|
1361
|
+
"AI-API traffic monitoring is not a recognised security-monitoring discipline — egress logs typically allowlist AI providers, leaving AI-API C2 (SesameOp / PROMPTFLUX class) invisible",
|
|
1362
|
+
"Prompt/response content classification is absent from typical SOC tooling — DLP on AI prompts is structurally outside C1's monitored event set",
|
|
1363
|
+
"MCP server invocations are not enumerated as a monitored event source"
|
|
1364
|
+
],
|
|
1365
|
+
"real_requirement": "Security monitoring includes prompt/response content classification on egress to AI providers, MCP tool-call audit trail (model decision + tool name + arguments + result), AI-API traffic baselines per service identity with anomaly alerts, and unified retention covering AI events alongside classical telemetry.",
|
|
1366
|
+
"status": "open",
|
|
1367
|
+
"opened_date": "2026-05-13",
|
|
1368
|
+
"evidence_cves": [
|
|
1369
|
+
"CVE-2025-53773",
|
|
1370
|
+
"CVE-2026-30615"
|
|
1371
|
+
],
|
|
1372
|
+
"atlas_refs": [
|
|
1373
|
+
"AML.T0096",
|
|
1374
|
+
"AML.T0024",
|
|
1375
|
+
"AML.T0057"
|
|
1376
|
+
],
|
|
1377
|
+
"attack_refs": [
|
|
1378
|
+
"T1567"
|
|
1379
|
+
]
|
|
1380
|
+
},
|
|
1381
|
+
"UK-CAF-D1": {
|
|
1382
|
+
"framework": "UK NCSC Cyber Assessment Framework v3.2",
|
|
1383
|
+
"control_id": "Objective D — Principle D1",
|
|
1384
|
+
"control_name": "Response and recovery planning",
|
|
1385
|
+
"designed_for": "Maintaining the ability to respond and recover from cybersecurity incidents affecting the operator's essential function",
|
|
1386
|
+
"misses": [
|
|
1387
|
+
"Response planning treats patch deployment as a routine activity; CISA KEV class kernel-LPE timelines (hours-not-days) demand a live-patch workflow that response plans rarely include",
|
|
1388
|
+
"AI-incident response (model rollback, prompt blocklist updates, MCP allowlist tightening) is not a standard response-plan category",
|
|
1389
|
+
"Backup-and-recovery validation does not include AI-system artefacts (fine-tuned model weights, RAG corpora, MCP server inventories)"
|
|
1390
|
+
],
|
|
1391
|
+
"real_requirement": "Response plans include live kernel patching as a documented capability with operator drill cadence; AI-incident playbooks cover model rollback, prompt classifier updates, MCP allowlist tightening; backups validate AI-system artefacts; recovery clocks align to NIS2 24h + DORA 4h + GDPR 72h notification matrix.",
|
|
1392
|
+
"status": "open",
|
|
1393
|
+
"opened_date": "2026-05-13",
|
|
1394
|
+
"evidence_cves": [
|
|
1395
|
+
"CVE-2026-31431",
|
|
1396
|
+
"CVE-2026-43284",
|
|
1397
|
+
"CVE-2026-43500"
|
|
1398
|
+
],
|
|
1399
|
+
"atlas_refs": [],
|
|
1400
|
+
"attack_refs": [
|
|
1401
|
+
"T1068"
|
|
1402
|
+
]
|
|
1403
|
+
},
|
|
1404
|
+
"AU-Essential-8-MFA": {
|
|
1405
|
+
"framework": "ASD Essential Eight (AU)",
|
|
1406
|
+
"control_id": "Multi-factor authentication",
|
|
1407
|
+
"control_name": "Multi-factor authentication",
|
|
1408
|
+
"designed_for": "Reducing the impact of compromised credentials on Australian Government and broader essential-service identities; Maturity Levels 1-3",
|
|
1409
|
+
"misses": [
|
|
1410
|
+
"MFA on AI-provider service accounts (OpenAI, Anthropic, HuggingFace API tokens) is not addressed — these are bearer tokens, not user identities, but carry equivalent or greater blast radius",
|
|
1411
|
+
"Phishing-resistance criterion (ML2+) does not specify resistance to AI-generated social engineering — deepfake-grade phishing breaks SMS/voice MFA categorically",
|
|
1412
|
+
"MCP server / plugin authentication is silent; bearer tokens with no rotation policy commonly stored alongside developer credentials"
|
|
1413
|
+
],
|
|
1414
|
+
"real_requirement": "MFA covers human identities at ML2+ with phishing-resistant factors (WebAuthn/passkeys, FIDO2). AI-provider credentials use short-lived OIDC tokens with mandatory rotation, never long-lived bearer keys. MCP server authentication uses signed JWTs / mTLS in production. Deepfake-grade phishing assumed; MFA decisions treat SMS/voice as insufficient.",
|
|
1415
|
+
"status": "open",
|
|
1416
|
+
"opened_date": "2026-05-13",
|
|
1417
|
+
"evidence_cves": [],
|
|
1418
|
+
"atlas_refs": [
|
|
1419
|
+
"AML.T0055"
|
|
1420
|
+
],
|
|
1421
|
+
"attack_refs": [
|
|
1422
|
+
"T1078",
|
|
1423
|
+
"T1556"
|
|
1424
|
+
]
|
|
1425
|
+
},
|
|
1426
|
+
"AU-Essential-8-App-Hardening": {
|
|
1427
|
+
"framework": "ASD Essential Eight (AU)",
|
|
1428
|
+
"control_id": "User application hardening",
|
|
1429
|
+
"control_name": "User application hardening",
|
|
1430
|
+
"designed_for": "Reducing the attack surface of common user applications (browsers, office, PDF readers) on Australian Government and essential-service endpoints",
|
|
1431
|
+
"misses": [
|
|
1432
|
+
"AI coding assistants (Copilot, Cursor, Windsurf, Claude) are not enumerated in the standard hardened-application list, yet they are the highest-value attack surface on developer endpoints (CVE-2025-53773, CVE-2026-30615 class)",
|
|
1433
|
+
"MCP server runtime is not addressed — these are user-mode processes with capabilities that exceed typical productivity applications",
|
|
1434
|
+
"Hardening focuses on browser/Java/Flash legacy classes; the equivalent for AI tools (default-deny MCP servers, plugin signing, capability-grant prompts) has no Essential-Eight analogue"
|
|
1435
|
+
],
|
|
1436
|
+
"real_requirement": "User-application hardening enumerates AI assistants and MCP servers in scope; sets default-deny on tool grants with explicit per-tool acknowledgement; pins MCP server versions with signature verification; treats AI-tool config files (.claude/settings.json, .cursor/mcp.json, .vscode/settings.json's chat.tools.autoApprove) as integrity-monitored configuration with the same protection profile as security-sensitive files.",
|
|
1437
|
+
"status": "open",
|
|
1438
|
+
"opened_date": "2026-05-13",
|
|
1439
|
+
"evidence_cves": [
|
|
1440
|
+
"CVE-2025-53773",
|
|
1441
|
+
"CVE-2026-30615"
|
|
1442
|
+
],
|
|
1443
|
+
"atlas_refs": [
|
|
1444
|
+
"AML.T0010",
|
|
1445
|
+
"AML.T0051"
|
|
1446
|
+
],
|
|
1447
|
+
"attack_refs": [
|
|
1448
|
+
"T1059",
|
|
1449
|
+
"T1204"
|
|
1450
|
+
]
|
|
1451
|
+
},
|
|
1452
|
+
"AU-Essential-8-Patch": {
|
|
1453
|
+
"framework": "ASD Essential Eight (AU)",
|
|
1454
|
+
"control_id": "Patch operating systems",
|
|
1455
|
+
"control_name": "Patch operating systems",
|
|
1456
|
+
"designed_for": "Maintaining current security patches on operating systems on Australian Government and essential-service endpoints; ML3 target is 48 hours for critical exploits",
|
|
1457
|
+
"misses": [
|
|
1458
|
+
"ML3 '48 hours for public exploit' is the closest framework target to KEV reality, but still assumes a reboot is acceptable within that window — live-patching deployment is not a required capability",
|
|
1459
|
+
"Linux kernel patching cadence differs from OS-vendor patch cadence; third-party kernel modules (OOT drivers, runtime hardening modules) are silent in scope",
|
|
1460
|
+
"Patch-management metrics rarely measure 'time from CISA KEV listing to patched on fleet' as the operational SLA"
|
|
1461
|
+
],
|
|
1462
|
+
"real_requirement": "Patch operating systems with KEV-anchored SLA (≤48h for critical with public PoC, live-patching mandatory on hosts that can't accept a reboot within window); kernel patching pipeline distinct from userspace patch pipeline; third-party kernel module patches tracked alongside vendor patches; SLA metric is 'time from KEV listing to deployed', not 'time from advisory publication'.",
|
|
1463
|
+
"status": "open",
|
|
1464
|
+
"opened_date": "2026-05-13",
|
|
1465
|
+
"evidence_cves": [
|
|
1466
|
+
"CVE-2026-31431",
|
|
1467
|
+
"CVE-2026-43284",
|
|
1468
|
+
"CVE-2026-43500"
|
|
1469
|
+
],
|
|
1470
|
+
"atlas_refs": [],
|
|
1471
|
+
"attack_refs": [
|
|
1472
|
+
"T1068"
|
|
1473
|
+
]
|
|
1474
|
+
},
|
|
1475
|
+
"AU-Essential-8-Backup": {
|
|
1476
|
+
"framework": "ASD Essential Eight (AU)",
|
|
1477
|
+
"control_id": "Regular backups",
|
|
1478
|
+
"control_name": "Regular backups",
|
|
1479
|
+
"designed_for": "Ensuring critical data and configuration can be restored after a cybersecurity incident; coverage spans daily backups with off-network retention",
|
|
1480
|
+
"misses": [
|
|
1481
|
+
"AI-system artefacts (fine-tuned model weights, RAG corpora, MCP server inventories, .claude/settings.json local-override files) are not enumerated as backup scope",
|
|
1482
|
+
"Backup-integrity verification typically targets data restoration; AI-corpus poisoning detection requires per-document hash comparison against backup state, which is not standard practice",
|
|
1483
|
+
"Incident-driven 'restore to last-known-good' for AI systems implies a known-good baseline that the backup process must maintain — workflow rarely documented"
|
|
1484
|
+
],
|
|
1485
|
+
"real_requirement": "Backups cover AI-system artefacts (model weights, RAG corpora, plugin registries, AI-tool configuration files) with off-network retention; backup-integrity verification includes per-document hash comparison for RAG corpora to detect corpus poisoning; documented 'AI-system restore to last-known-good' workflow that maps to detected AI-incident classes.",
|
|
1486
|
+
"status": "open",
|
|
1487
|
+
"opened_date": "2026-05-13",
|
|
1488
|
+
"evidence_cves": [
|
|
1489
|
+
"CVE-2026-45321"
|
|
1490
|
+
],
|
|
1491
|
+
"atlas_refs": [
|
|
1492
|
+
"AML.T0010",
|
|
1493
|
+
"AML.T0020",
|
|
1494
|
+
"AML.T0048"
|
|
1495
|
+
],
|
|
1496
|
+
"attack_refs": []
|
|
1254
1497
|
}
|
|
1255
1498
|
}
|
|
@@ -395,7 +395,7 @@
|
|
|
395
395
|
{
|
|
396
396
|
"id": "dockerfile-from-latest",
|
|
397
397
|
"type": "file_path",
|
|
398
|
-
"value": "
|
|
398
|
+
"value": "For each file in the dockerfile-inventory artifact, scan dockerfile-content lines: FROM directive with :latest tag OR no tag at all (defaults to :latest)",
|
|
399
399
|
"description": "Image base resolves differently between scan and deploy. Image scanning attestation does not apply to the deployed image.",
|
|
400
400
|
"confidence": "deterministic",
|
|
401
401
|
"deterministic": true,
|
|
@@ -404,7 +404,7 @@
|
|
|
404
404
|
{
|
|
405
405
|
"id": "dockerfile-no-digest-pin",
|
|
406
406
|
"type": "log_pattern",
|
|
407
|
-
"value": "
|
|
407
|
+
"value": "For each file in the dockerfile-inventory artifact, scan dockerfile-content lines: FROM directive without @sha256:* digest",
|
|
408
408
|
"description": "Tag-only base reference. Tag mutability means provenance cannot be verified.",
|
|
409
409
|
"confidence": "high",
|
|
410
410
|
"deterministic": false,
|
|
@@ -431,7 +431,7 @@
|
|
|
431
431
|
{
|
|
432
432
|
"id": "compose-privileged",
|
|
433
433
|
"type": "log_pattern",
|
|
434
|
-
"value": "docker-compose service block containing `privileged: true`",
|
|
434
|
+
"value": "Within any compose-files artifact: docker-compose service block containing `privileged: true`",
|
|
435
435
|
"description": "Container has full host kernel access. Container escape is built in by configuration.",
|
|
436
436
|
"confidence": "deterministic",
|
|
437
437
|
"deterministic": true,
|
|
@@ -467,7 +467,7 @@
|
|
|
467
467
|
{
|
|
468
468
|
"id": "k8s-privileged",
|
|
469
469
|
"type": "log_pattern",
|
|
470
|
-
"value": "k8s
|
|
470
|
+
"value": "Within any k8s-manifests artifact (including templates rendered from helm-charts or kustomize-overlays): containers[].securityContext.privileged: true",
|
|
471
471
|
"description": "K8s container with privileged: true. Same risk class as compose-privileged.",
|
|
472
472
|
"confidence": "deterministic",
|
|
473
473
|
"deterministic": true,
|
|
@@ -521,11 +521,29 @@
|
|
|
521
521
|
{
|
|
522
522
|
"id": "k8s-cluster-admin-binding",
|
|
523
523
|
"type": "log_pattern",
|
|
524
|
-
"value": "k8s
|
|
524
|
+
"value": "Within service-account-manifests artifact entries (or any k8s-manifests artifact containing RBAC kinds): kind: ClusterRoleBinding referencing cluster-admin role AND subjects include a ServiceAccount in a workload namespace",
|
|
525
525
|
"description": "Workload SA bound to cluster-admin. Pod compromise = cluster compromise.",
|
|
526
526
|
"confidence": "deterministic",
|
|
527
527
|
"deterministic": true,
|
|
528
528
|
"attack_ref": "T1078.004"
|
|
529
|
+
},
|
|
530
|
+
{
|
|
531
|
+
"id": "psa-policy-permissive-or-absent",
|
|
532
|
+
"type": "log_pattern",
|
|
533
|
+
"value": "pod-security-admission-config artifact missing OR enforces only `pod-security.kubernetes.io/enforce: privileged` (the most permissive level) on a workload namespace; OR no PodSecurity admission configuration exists for namespaces hosting deployable manifests",
|
|
534
|
+
"description": "Without PodSecurity admission enforcement at baseline or restricted level on workload namespaces, the cluster will accept manifests that the other detect indicators (k8s-privileged, k8s-host-namespaces, k8s-run-as-root, k8s-hostpath-sensitive) flag — admission control is the gate that turns those manifest findings into rejections at apply time.",
|
|
535
|
+
"confidence": "high",
|
|
536
|
+
"deterministic": false,
|
|
537
|
+
"attack_ref": "T1611"
|
|
538
|
+
},
|
|
539
|
+
{
|
|
540
|
+
"id": "network-policies-absent-from-workload-namespace",
|
|
541
|
+
"type": "log_pattern",
|
|
542
|
+
"value": "For each workload namespace observed in k8s-manifests: zero entries in the network-policies artifact target that namespace (no NetworkPolicy / CiliumNetworkPolicy / CalicoNetworkPolicy with metadata.namespace == workload_ns). Kubernetes default is allow-all pod-to-pod traffic.",
|
|
543
|
+
"description": "Absent NetworkPolicy on a workload namespace leaves East-West traffic unrestricted: a compromised pod can reach every other pod, including the API server, etcd, and management planes. Closes the lateral-movement primitive that container escape playbooks rely on.",
|
|
544
|
+
"confidence": "high",
|
|
545
|
+
"deterministic": false,
|
|
546
|
+
"attack_ref": "T1610"
|
|
529
547
|
}
|
|
530
548
|
],
|
|
531
549
|
"false_positive_profile": [
|
|
@@ -414,7 +414,7 @@
|
|
|
414
414
|
{
|
|
415
415
|
"id": "aws-static-key-present",
|
|
416
416
|
"type": "log_pattern",
|
|
417
|
-
"value": "~/.aws/credentials
|
|
417
|
+
"value": "Within the aws-credentials artifact (~/.aws/credentials): a [profile] block with aws_access_key_id = AKIA* AND no sso_session / credential_process; cross-reference the aws-sso-cache artifact — if aws-sso-cache is empty AND aws-credentials carries an AKIA* key, the workstation has zero federated session coverage for that profile",
|
|
418
418
|
"description": "Long-lived AWS IAM user key. AAL1-equivalent. Static credential.",
|
|
419
419
|
"confidence": "deterministic",
|
|
420
420
|
"deterministic": true,
|
|
@@ -423,7 +423,7 @@
|
|
|
423
423
|
{
|
|
424
424
|
"id": "kube-static-token",
|
|
425
425
|
"type": "log_pattern",
|
|
426
|
-
"value": "~/.kube/config users[].user.token: field present AND no exec: federated flow alongside",
|
|
426
|
+
"value": "Within the kube-config artifact (~/.kube/config): users[].user.token: field present AND no exec: federated flow alongside",
|
|
427
427
|
"description": "Static Kubernetes service-account or admin token. Long-lived bearer. Indistinguishable from a federated kube context that uses cached token unless exec: is also present.",
|
|
428
428
|
"confidence": "deterministic",
|
|
429
429
|
"deterministic": true,
|
|
@@ -432,7 +432,7 @@
|
|
|
432
432
|
{
|
|
433
433
|
"id": "gcp-service-account-json-adc",
|
|
434
434
|
"type": "log_pattern",
|
|
435
|
-
"value": "~/.config/gcloud/application_default_credentials.json contains \"type\": \"service_account\"",
|
|
435
|
+
"value": "Within the gcloud-credentials artifact: ~/.config/gcloud/application_default_credentials.json contains \"type\": \"service_account\" — OR the credentials.db SQLite query returns rows where type='service_account' for any active configuration",
|
|
436
436
|
"description": "ADC pointing at a service-account JSON private key. Long-lived. The recommended posture is type=external_account (workforce identity) or type=authorized_user (federated user creds).",
|
|
437
437
|
"confidence": "deterministic",
|
|
438
438
|
"deterministic": true,
|
|
@@ -441,7 +441,7 @@
|
|
|
441
441
|
{
|
|
442
442
|
"id": "docker-cleartext-auth",
|
|
443
443
|
"type": "log_pattern",
|
|
444
|
-
"value": "~/.docker/config.json
|
|
444
|
+
"value": "Within the docker-config artifact (~/.docker/config.json): auths[].auth field with base64(user:password) AND no credHelpers / credsStore for that registry",
|
|
445
445
|
"description": "Docker registry credentials in cleartext (base64 is not encryption). credHelpers/credsStore would route to OS keychain or cloud-IAM-federated path.",
|
|
446
446
|
"confidence": "deterministic",
|
|
447
447
|
"deterministic": true,
|
|
@@ -468,7 +468,7 @@
|
|
|
468
468
|
{
|
|
469
469
|
"id": "ssh-key-rsa-short-bits",
|
|
470
470
|
"type": "log_pattern",
|
|
471
|
-
"value": "ssh-keygen reports RSA key with bit-length < 3072 OR DSA key of any size",
|
|
471
|
+
"value": "Within the ssh-keys-inventory artifact: ssh-keygen reports any RSA key with bit-length < 3072 OR DSA key of any size",
|
|
472
472
|
"description": "Weak SSH key. RSA-2048 is acceptable but trending out; RSA-1024 / DSA are deprecated. Cryptographic posture issue.",
|
|
473
473
|
"confidence": "high",
|
|
474
474
|
"deterministic": false
|
|
@@ -476,7 +476,7 @@
|
|
|
476
476
|
{
|
|
477
477
|
"id": "ssh-key-old",
|
|
478
478
|
"type": "behavioral_signal",
|
|
479
|
-
"value": "
|
|
479
|
+
"value": "Within the ssh-keys-inventory artifact: any ~/.ssh/id_* file with mtime > 365 days ago; cross-reference the ssh-config artifact — if ssh-config carries no CertificateFile / ProxyJump bastion-mediated entry covering the same host, the stale raw key is the sole auth path",
|
|
480
480
|
"description": "Stale SSH key. Predates likely org rotation cadence; predates likely AAL/FIDO2 enrollment.",
|
|
481
481
|
"confidence": "high",
|
|
482
482
|
"deterministic": false
|
|
@@ -484,7 +484,7 @@
|
|
|
484
484
|
{
|
|
485
485
|
"id": "gpg-key-old-or-weak",
|
|
486
486
|
"type": "log_pattern",
|
|
487
|
-
"value": "gpg
|
|
487
|
+
"value": "Within the gpg-keys artifact: any secret key reported with algorithm DSA OR RSA<3072 OR creation date > 5 years AND no expiration set",
|
|
488
488
|
"description": "Weak or never-expiring GPG private key. Long-lived signing credential outside any rotation cadence.",
|
|
489
489
|
"confidence": "high",
|
|
490
490
|
"deterministic": false
|
|
@@ -501,8 +501,8 @@
|
|
|
501
501
|
{
|
|
502
502
|
"id": "all-stores-empty-or-federated",
|
|
503
503
|
"type": "behavioral_signal",
|
|
504
|
-
"value": "
|
|
505
|
-
"description": "Clean federated posture. AAL3-equivalent. Not a finding; emit as positive evidence.",
|
|
504
|
+
"value": "Across the union of aws-credentials, aws-sso-cache, kube-config, gcloud-credentials, docker-config, npmrc, pypirc, gpg-keys, ssh-keys-inventory, ssh-config, and keychain-inventory artifacts: inventory shows zero static credentials AND every present store uses exec: / sso_session / credsStore / type=external_account (federated paths) OR is empty",
|
|
505
|
+
"description": "Clean federated posture. AAL3-equivalent. Not a finding; emit as positive evidence. The keychain-inventory artifact serves as the compensating-store check — when OS-keychain-resident items account for the credential surface, the on-disk stores can legitimately be empty.",
|
|
506
506
|
"confidence": "high",
|
|
507
507
|
"deterministic": false
|
|
508
508
|
}
|