@blamejs/exceptd-skills 0.16.15 → 0.16.16

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/sbom.cdx.json CHANGED
@@ -1,23 +1,23 @@
1
1
  {
2
2
  "bomFormat": "CycloneDX",
3
3
  "specVersion": "1.6",
4
- "serialNumber": "urn:uuid:ddba3c25-e008-44bd-8778-18d2b1d24f48",
4
+ "serialNumber": "urn:uuid:04e89773-5ab6-4db8-9c18-bb4abb56fd87",
5
5
  "version": 1,
6
6
  "metadata": {
7
- "timestamp": "2143-11-19T04:57:09.000Z",
7
+ "timestamp": "2028-08-11T03:33:07.000Z",
8
8
  "tools": [
9
9
  {
10
10
  "vendor": "blamejs",
11
11
  "name": "scripts/refresh-sbom.js",
12
- "version": "0.16.15"
12
+ "version": "0.16.16"
13
13
  }
14
14
  ],
15
15
  "component": {
16
- "bom-ref": "pkg:npm/@blamejs/exceptd-skills@0.16.15",
16
+ "bom-ref": "pkg:npm/@blamejs/exceptd-skills@0.16.16",
17
17
  "type": "application",
18
18
  "name": "@blamejs/exceptd-skills",
19
- "version": "0.16.15",
20
- "description": "AI security skills grounded in mid-2026 threat reality, not stale framework documentation. 47 skills, 11 catalogs (439 CVEs / 174 CWEs / 805 ATT&CK + ICS / 170 ATLAS / 468 D3FEND / 8888 RFCs), 35 jurisdictions, 10-class catalog gap detector + budget gate, real XML parser + canonical-form diff + content-pattern regression detection, Ed25519-signed.",
19
+ "version": "0.16.16",
20
+ "description": "AI security skills grounded in mid-2026 threat reality, not stale framework documentation. 48 skills, 11 catalogs (439 CVEs / 174 CWEs / 805 ATT&CK + ICS / 170 ATLAS / 468 D3FEND / 8888 RFCs), 35 jurisdictions, 10-class catalog gap detector + budget gate, real XML parser + canonical-form diff + content-pattern regression detection, Ed25519-signed.",
21
21
  "licenses": [
22
22
  {
23
23
  "license": {
@@ -25,17 +25,17 @@
25
25
  }
26
26
  }
27
27
  ],
28
- "purl": "pkg:npm/%40blamejs/exceptd-skills@0.16.15",
28
+ "purl": "pkg:npm/%40blamejs/exceptd-skills@0.16.16",
29
29
  "hashes": [
30
30
  {
31
31
  "alg": "SHA-256",
32
- "content": "25697f2d58e577860cb8d7bbbbaab671c8e68f68919b2ea4f7a6d71cf964cf16"
32
+ "content": "19fd1d02fb02bcc9ce834018a04cb4499913fc116b9c3d1afe8e0553161e9b91"
33
33
  }
34
34
  ],
35
35
  "externalReferences": [
36
36
  {
37
37
  "type": "distribution",
38
- "url": "https://www.npmjs.com/package/@blamejs/exceptd-skills/v/0.16.15"
38
+ "url": "https://www.npmjs.com/package/@blamejs/exceptd-skills/v/0.16.16"
39
39
  },
40
40
  {
41
41
  "type": "vcs",
@@ -54,7 +54,7 @@
54
54
  },
55
55
  {
56
56
  "name": "exceptd:skill:count",
57
- "value": "47"
57
+ "value": "48"
58
58
  },
59
59
  {
60
60
  "name": "exceptd:integrity:method",
@@ -86,11 +86,11 @@
86
86
  "hashes": [
87
87
  {
88
88
  "alg": "SHA-256",
89
- "content": "73316ff6fed755b6eef4882a28c7af48e341a480f19df3f79f7dd56875e3c178"
89
+ "content": "c33b531131baa65065c83571c6b8e24509ebf8c996f3d4201c1455748a38504a"
90
90
  },
91
91
  {
92
92
  "alg": "SHA3-512",
93
- "content": "78a17ef72a8d11cdf881f78df473e8e0f0d238aee71870c19f2177b5c6dd5291948b7b51ec7df21d9af754fecc6087baba9875eacc67913971c0e67acde1d1be"
93
+ "content": "654f61a4cd4a95467903a2f2c5b1d1d5d14c16d4b098993fce89d35b51c0f9f3192e8789a5ad887eac75cd90044096b6c3a9341665f663306186bad4edfbe0fc"
94
94
  }
95
95
  ]
96
96
  },
@@ -116,11 +116,11 @@
116
116
  "hashes": [
117
117
  {
118
118
  "alg": "SHA-256",
119
- "content": "f9aff10e9d135c2b3ddd3b71dfaaa4852c0f4ad8315b3cc64e45d436ae061004"
119
+ "content": "3049953c76658c14f8e4b6f6cfc4eaa717d1ea872b90b46e0d32a0b7b6fab3b5"
120
120
  },
121
121
  {
122
122
  "alg": "SHA3-512",
123
- "content": "fcf03767f972e9b13bd4ae04f7796e41570d563b69878274c1eba54e430e28b4c9254263c0d94615a90119a580c2f950d3f99d1f24ac52439c0e47b1bd6c00d5"
123
+ "content": "3e0978a7d16170cf31e425b9e945b48a8c8146aad38f246847a2d2deeff41013cc38193ff09afe849eda8b4cfb3bf889522f68b0115d5a5e2676f75d21912aac"
124
124
  }
125
125
  ]
126
126
  },
@@ -176,11 +176,11 @@
176
176
  "hashes": [
177
177
  {
178
178
  "alg": "SHA-256",
179
- "content": "4b7b2d204541a053fbdd94723196f6f368a67952e30d6c941ba5419bd3f0d9c1"
179
+ "content": "d60ea592639a1c721162bdb8f72b5b12d624cefc90f36b606b7f116353e36b08"
180
180
  },
181
181
  {
182
182
  "alg": "SHA3-512",
183
- "content": "fbdc8fdaf6b82992cf73d77c0678615d26618b4aa698bf71e2e69fb2f9413197ff13fcb2565041cc9b1510dbf156d3a81111b9e835ec56a555e3ac2b09899556"
183
+ "content": "18a5b34d22cc5b4e43da00c891f30ecb1cc535876dc9de3983b5886bbd9492c3731c3f41688e0d2f6a5d1017331fef97fcfd780f7ef6d5b2a04ce8d61029970c"
184
184
  }
185
185
  ]
186
186
  },
@@ -281,11 +281,11 @@
281
281
  "hashes": [
282
282
  {
283
283
  "alg": "SHA-256",
284
- "content": "bb83dfb133c97b8aba15bde9bf7d04ac02a52b90d4471203aff487200e7bbde1"
284
+ "content": "d3715b8a3a5fa54d7b5b0176bc6adac8f2ee0113f40b6b9ea96ca63d673b202f"
285
285
  },
286
286
  {
287
287
  "alg": "SHA3-512",
288
- "content": "bb316671de5bbd311aebc34c39cd000d177bde130712ff2878cae432237337cf79d92a4fffd022d59a370adaf8fdcccfd41b69308ee8e8483330c2cb0b404531"
288
+ "content": "bf130a643490db459df0adb4cca9b03e116c1524f2940746b13a916ba1d22b90342b5963b0650627669dd07ed12518a149c758afa02ffb7f7fe7962ce87fdb12"
289
289
  }
290
290
  ]
291
291
  },
@@ -341,11 +341,11 @@
341
341
  "hashes": [
342
342
  {
343
343
  "alg": "SHA-256",
344
- "content": "eb30305b76deddf87b5a128ab416280b0bc908c15cd3ccecd74f3cf063a8dbca"
344
+ "content": "11e035b62bf760eb7ea5e408b7364f737f3b3510612d6a65948c8d8ab1085587"
345
345
  },
346
346
  {
347
347
  "alg": "SHA3-512",
348
- "content": "b8cb9999b60e7fae82ce025a2a891d13e2d289f9349c3b7aac50806ba171ac772870e97182c3514b82d86b910244137de9e48e0a004aacacca431efb70f56d0a"
348
+ "content": "ecf8f495282ad4302cf058f4a8846afeddfc2cc04ea879b883e995a3b5c9555e292b59dbc8e0679e40678c5212bf9b4c3737c0d8b1c5528fc7fa08c12d63a7b8"
349
349
  }
350
350
  ]
351
351
  },
@@ -506,11 +506,11 @@
506
506
  "hashes": [
507
507
  {
508
508
  "alg": "SHA-256",
509
- "content": "0c85b2967726a513e1c25940c39705702252f505bfc958e560f554171370c527"
509
+ "content": "8d5945f5aff2d349b852572c84ff76ab8b14fab7b38aaa0b968ca56c5496b2fe"
510
510
  },
511
511
  {
512
512
  "alg": "SHA3-512",
513
- "content": "f45572b2976dc3c7c897eb506d418de28f7b0e8ce58a4c07fa2ac833bb6ab9334187d07d6d4507b38e151b953decf6eb555b4900fb57654259e735bc5a59d3e9"
513
+ "content": "78c1767f798485e2143283c00edf50bf3402d8bdd3fe085533d6beb004d870a226159bc6ba45e2adb18bde241d30d0ebc5bc87f1ba4820fe6dd05da567d6e265"
514
514
  }
515
515
  ]
516
516
  },
@@ -581,11 +581,11 @@
581
581
  "hashes": [
582
582
  {
583
583
  "alg": "SHA-256",
584
- "content": "90d4c641a4d301402ba6cb9c28ba99083b3c89a5eb03ba3f78dc1a154e6e6824"
584
+ "content": "81dcd98aca801cccdeb81063af985cc2e87015cc750a42f3f557b35968d7730d"
585
585
  },
586
586
  {
587
587
  "alg": "SHA3-512",
588
- "content": "0c6e413a5a9184bc6579e85179d01c006b5f5adba28e471efb4d0c7976dccaba9a81ab942855db136820b55e9b33da38ae045db98c28bb1182feb691fb51626e"
588
+ "content": "c27c06699191eb8b08d39a6a2fe02b547f7bb95dca79d07d9e5b02b8a5ccfc5396f20c0d89cc45be3404829baceb505794dc20efda2a3787e52d3a51f036fe30"
589
589
  }
590
590
  ]
591
591
  },
@@ -709,6 +709,21 @@
709
709
  }
710
710
  ]
711
711
  },
712
+ {
713
+ "bom-ref": "file:data/playbooks/multitenancy-isolation.json",
714
+ "type": "file",
715
+ "name": "data/playbooks/multitenancy-isolation.json",
716
+ "hashes": [
717
+ {
718
+ "alg": "SHA-256",
719
+ "content": "3ca080c89326dc369736dadb12431379bd039cf3776ee9633992b0fef42130fc"
720
+ },
721
+ {
722
+ "alg": "SHA3-512",
723
+ "content": "9e085d55f4ae506cde7d06285a0efe9f13df12b9b0042a84b6d48bddc4e7dff628dc7e8a6ae92aa35a0047521428338c822b2252775da1d32817634d482d65fd"
724
+ }
725
+ ]
726
+ },
712
727
  {
713
728
  "bom-ref": "file:data/playbooks/network-trust.json",
714
729
  "type": "file",
@@ -1796,11 +1811,11 @@
1796
1811
  "hashes": [
1797
1812
  {
1798
1813
  "alg": "SHA-256",
1799
- "content": "ec619d5899698562c284593dd8a13d9c5045f0700caa175a0278349a3c96a3da"
1814
+ "content": "58d5adcb2f75841236338793c49b71adbd5662743fbd444b16c349dd26edbd21"
1800
1815
  },
1801
1816
  {
1802
1817
  "alg": "SHA3-512",
1803
- "content": "efb7e3e045cd5c88a59164c8a7c8cdde01b375893d784ce09be7f3651af20417cb13473a7b5c5dea3a08ce8b64f099c221407a9d3e8c6326a0da2fc73f09ad87"
1818
+ "content": "bfbca81d382983435fd8994cb4bed554d56d01008dd5ae6f581c61d00d88a2791087e56cd405ad1e9e7e0255a1ee454562ba6c6276446077a53f97df606e52c8"
1804
1819
  }
1805
1820
  ]
1806
1821
  },
@@ -1811,11 +1826,11 @@
1811
1826
  "hashes": [
1812
1827
  {
1813
1828
  "alg": "SHA-256",
1814
- "content": "991feef6541fb4430b787a8426967e7df688a3941b57e2305de780d1d1c2807e"
1829
+ "content": "643d612268e8a98f27a0d53e2f749bc81d217ae3c37b47d90075c81d676db09f"
1815
1830
  },
1816
1831
  {
1817
1832
  "alg": "SHA3-512",
1818
- "content": "d8258fd4821dcf21706cc2ace47597e5a3f52976fbbbebc6c20e5a00716a255ef2bcafc9ec7c68ae67cd61d935c51fcb5a320ca601c72229d62ae6623d99de79"
1833
+ "content": "273e5881d3832a17c574cf1f933219f7f1209593cd5c6cf9e821899594af3f55bf6f4168f1217b8beca2f11483516cfbba46d8d292d10df19761fa512a14201f"
1819
1834
  }
1820
1835
  ]
1821
1836
  },
@@ -1826,11 +1841,11 @@
1826
1841
  "hashes": [
1827
1842
  {
1828
1843
  "alg": "SHA-256",
1829
- "content": "35fe3df80c4f8717e4eb397f4358a97522cd01bc375df3d1d31710ba43df603b"
1844
+ "content": "9156c60052b185a8d265bbb53d586ed6be9b1387b2aa2cdb77186bed997d5fbd"
1830
1845
  },
1831
1846
  {
1832
1847
  "alg": "SHA3-512",
1833
- "content": "b940529b951f34286b9256ee20d888cc79a026cf942f2cdd57443029c926037df48bd8e839ca04cddd6701b1106b32c75e7c2f8203e4e7a18bf30fbc75c3e5ab"
1848
+ "content": "3f1fefe1ff7236635e00a4e92886980f747fe546827fa134ac122cf276cf09420778d051b6f736ced0c5d9592300a41c7aeced7ddf584ec6f1f47c662307cff5"
1834
1849
  }
1835
1850
  ]
1836
1851
  },
@@ -3019,6 +3034,21 @@
3019
3034
  }
3020
3035
  ]
3021
3036
  },
3037
+ {
3038
+ "bom-ref": "file:skills/multitenancy-isolation/skill.md",
3039
+ "type": "file",
3040
+ "name": "skills/multitenancy-isolation/skill.md",
3041
+ "hashes": [
3042
+ {
3043
+ "alg": "SHA-256",
3044
+ "content": "60d7db9cbac49b307c7062a3b27a3cef8aab8cc774176c428075981fbc18758f"
3045
+ },
3046
+ {
3047
+ "alg": "SHA3-512",
3048
+ "content": "702591a3b7a299e2d204dc48c24cc4123379de1aa9912597149b9c1be3f42cd490c0c4cb7afba9dba310283237a4d4f01a2f2842650daa6820f3af4e0eeaa0cf"
3049
+ }
3050
+ ]
3051
+ },
3022
3052
  {
3023
3053
  "bom-ref": "file:skills/network-trust/skill.md",
3024
3054
  "type": "file",
@@ -0,0 +1,83 @@
1
+ ---
2
+ name: multitenancy-isolation
3
+ version: "1.0.0"
4
+ description: Application multitenancy isolation and availability/DoS resilience for mid-2026 — principal-bound tenant identity, data-layer row-level-security under a non-bypass role, cross-tenant cache/queue namespacing, per-tenant rate/byte quotas, HTTP/2 Rapid Reset caps, bounded allocation, distributed-lock fencing, and circuit breakers
5
+ triggers:
6
+ - multitenancy isolation
7
+ - multi tenant
8
+ - cross tenant
9
+ - tenant isolation
10
+ - row level security
11
+ - rls
12
+ - bola
13
+ - broken object level authorization
14
+ - idor
15
+ - noisy neighbour
16
+ - rapid reset
17
+ - rate limit
18
+ - per tenant quota
19
+ - circuit breaker
20
+ - distributed lock fencing
21
+ - resource exhaustion
22
+ - denial of service
23
+ discovery_mode: standalone
24
+ data_deps:
25
+ - cve-catalog.json
26
+ - atlas-ttps.json
27
+ - attack-techniques.json
28
+ - framework-control-gaps.json
29
+ - cwe-catalog.json
30
+ - rfc-references.json
31
+ atlas_refs: []
32
+ attack_refs:
33
+ - T1078
34
+ - T1499
35
+ - T1499.001
36
+ - T1530
37
+ framework_gaps:
38
+ - NIST-800-53-AC-3
39
+ - NIS2-Art21-network-security
40
+ - UK-CAF-B4
41
+ - AU-ISM-1556
42
+ cwe_refs:
43
+ - CWE-639
44
+ - CWE-770
45
+ - CWE-863
46
+ - CWE-668
47
+ - CWE-400
48
+ last_threat_review: "2026-06-02"
49
+ ---
50
+
51
+ # Application Multitenancy Isolation + Availability/DoS Resilience
52
+
53
+ ## Threat Context (mid-2026)
54
+
55
+ Shared multitenant infrastructure has two linked failure classes. Isolation: if the tenant identifier is trusted from a client-controlled header/parameter/claim, or the tenant filter lives in per-query application discipline rather than the data layer, a single authenticated user of one tenant reads or writes another tenant's data — broken object-level authorization (CWE-639), the most common and highest-impact SaaS vulnerability class. Cache, pub/sub, and queue keys leak the same way when not tenant-namespaced. Availability: asymmetric denial of service — HTTP/2 Rapid Reset (CVE-2023-44487), unbounded per-request allocation — and the noisy-neighbour pattern (no per-tenant quota) deny service to all tenants; autoscaling pays the attacker's bill without stopping the attack.
56
+
57
+ ## Framework Lag Declaration
58
+
59
+ Organisational controls treat "we have an authorization layer" as tenant isolation and "the cloud autoscales" as DoS resilience. NIST 800-53 AC-3 (access enforcement) is satisfied by an authorization layer existing and does not require tenant scoping be structurally enforced at the data layer rather than per-query discipline. SC-6 (resource availability) is named but rarely operationalised as per-tenant quotas, Rapid Reset caps, or circuit breakers. SOC 2 CC6 logical access is met with an auth layer. A clean "we have authorization and the cloud autoscales" audit is therefore NON-EVIDENCE for multitenancy isolation or DoS resilience; it confirms an auth layer and elastic infra, not data-layer RLS under a non-bypass role, cross-tenant namespacing, per-tenant quotas, or breakers.
60
+
61
+ ## TTP Mapping
62
+
63
+ The multitenancy failures map to MITRE ATT&CK: **T1078 (Valid Accounts)** for cross-tenant access from a legitimate account via a client-trusted tenant id, an unscoped query, or an RLS-bypassing request role; **T1530 (Data from Cloud Storage / shared store)** for cross-tenant leakage through un-namespaced cache/queue keys; **T1499 (Endpoint DoS)** for the noisy-neighbour, distributed-lock, and circuit-breaker gaps; and **T1499.001 (OS Exhaustion Flood)** for HTTP/2 Rapid Reset and unbounded per-request allocation. The weakness classes are CWE-639 (authorization bypass through user-controlled key), CWE-863 (incorrect authorization), CWE-668 (exposure to wrong control sphere — shared keys), CWE-770 (allocation without limits), and CWE-400 (uncontrolled resource consumption).
64
+
65
+ ## Exploit Availability Matrix
66
+
67
+ These are application-posture gaps exploited from a single authenticated account or client, so the exploit is the absent control. Cross-tenant access via a client-trusted tenant id requires only changing a header — trivially scriptable and the staple of SaaS bug-bounty reports. HTTP/2 Rapid Reset has public tooling and the CVE-2023-44487 catalog entry; it produced record-breaking DDoS. Unbounded allocation and the noisy-neighbour DoS require only a crafted or high-volume request. The real-world priority is set by whether one authenticated user can reach all tenants' data, or one client can deny service to all tenants — both maximum-blast-radius outcomes on shared infrastructure.
68
+
69
+ ## Analysis Procedure
70
+
71
+ 1. Determine the effective tenant id derivation and confirm it binds to the authenticated principal, not a client-supplied field. 2. Confirm tenant scoping is enforced at the data layer (row-level security) and that the request connection runs under a role SUBJECT to RLS (not a BYPASSRLS/owner role). 3. Confirm cache/pub-sub/queue keys include the tenant id. 4. Confirm HTTP/2 client-initiated stream resets are capped per connection (Rapid Reset). 5. Confirm per-tenant/per-IP rate + byte quotas and bounded per-request allocation (result-set, body, connections, fan-out). 6. Confirm distributed locks carry a TTL + fencing token and critical dependencies have circuit breakers. Run the `multitenancy-isolation` playbook to execute these as detect indicators with false-positive checks, then score by whether one account reaches all data or one client denies all service.
72
+
73
+ ## Output Format
74
+
75
+ Report per surface, marking each isolation and availability control enforced / missing / inconclusive (visibility gap). For every missing control, state whether a single authenticated user could read another tenant's data or a single client could deny service to all tenants. Distinguish a control enforced at a lower layer (data-layer RLS, CDN/WAF quotas) from an absent one, and a dedicated single-tenant deployment (cross-tenant indicators not applicable) from a shared one. Provide the prioritised remediation (bind tenant to principal + data-layer RLS under a non-bypass role, namespace shared keys, cap Rapid Reset + per-tenant quotas, bound allocation, fence locks + circuit-break) and the negative validation tests (cross-tenant read blocked, unscoped query blocked, Rapid Reset capped) plus a functional test that two tenants get fair, isolated service.
76
+
77
+ ## Compliance Theater Check
78
+
79
+ The recurring theater is "we have an authorization layer, so tenants are isolated," "row-level security is enabled," and "the cloud autoscales, so we are DoS-resilient." An auth layer is not data-layer isolation; RLS is bypassed by a superuser/owner/BYPASSRLS request connection; autoscaling pays the attacker's bill without stopping an asymmetric DoS. The distinguishing test: probe whether a query can run without a tenant predicate, whether the request connection bypasses RLS, whether the tenant id is client-trusted, and whether Rapid Reset / unbounded allocation is capped. If a cross-tenant read or an asymmetric DoS succeeds, the auth layer and autoscaling did not isolate or protect, and the assurance is paper.
80
+
81
+ ## Defensive Countermeasure Mapping
82
+
83
+ Map findings to MITRE D3FEND: principal-bound tenant id + data-layer RLS under a non-bypass role realise Authorization Event Thresholding and Mandatory Access Control (countering T1078 cross-tenant access); tenant-namespaced shared keys realise Resource Access Pattern isolation (countering T1530 leakage); per-tenant quotas + HTTP/2 Rapid Reset caps + bounded allocation realise Resource Consumption Limiting (countering T1499/T1499.001); distributed-lock fencing and circuit breakers realise System Availability and Failure-Domain isolation. Pair data-layer RLS with an automated test asserting no query runs without a tenant filter. The residual risk after these controls is compromise of a legitimately-scoped tenant account, an identity-control concern, accepted at the CISO level.