@blamejs/exceptd-skills 0.13.117 → 0.13.119

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.
@@ -1100,7 +1100,9 @@
1100
1100
  "CVE-2026-9082",
1101
1101
  "MAL-2025-AI-FOUND-FFMPEG-BIGSLEEP",
1102
1102
  "CVE-2024-12450",
1103
- "CVE-2025-69286"
1103
+ "CVE-2025-69286",
1104
+ "CVE-2026-22218",
1105
+ "CVE-2026-22219"
1104
1106
  ],
1105
1107
  "description_full": "Adversaries may attempt to exploit a weakness in an Internet-facing host or system to initially access a network. The weakness in the system can be a software bug, a temporary glitch, or a misconfiguration. Exploited applications are often websites/web servers, but can also include databases (like SQL), standard services (like SMB or SSH), network device administration and management protocols (like SNMP and Smart Install), and any other system with Internet-accessible open sockets.(Citation: NVD CVE-2016-6662)(Citation: CIS Multiple SMB Vulnerabilities)(Citation: US-CERT TA18-106A Network Infrastructure Devices 2018)(Citation: Cisco Blog Legacy Device Attacks)(Citation: NVD CVE-2014-7169) On ESXi infrastructure, adversaries may exploit exposed OpenSLP services; they may alternatively exploit exposed VMware vCenter servers.(Citation: Recorded Future ESXiArgs Ransomware 2023)(Citation: Ars Technica VMWare Code Execution Vulnerability 2021) Depending on the flaw being exploited, this may also involve [Exploitation for Stealth](https://attack.mitre.org/techniques/T1211) or [Exploitation for Client Execution](https://attack.mitre.org/techniques/T1203). If an application is hosted on cloud-based infrastructure and/or is containerized, then exploiting it may lead to compromise of the underlying instance or container. This can allow an adversary a path to access the cloud or container APIs (e.g., via the [Cloud Instance Metadata API](https://attack.mitre.org/techniques/T1552/005)), exploit container host access via [Escape to Host](https://attack.mitre.org/techniques/T1611), or take advantage of weak identity and access management policies. Adversaries may also exploit edge network infrastructure and related appliances, specifically targeting devices that do not support robust host-based defenses.(Citation: Mandiant Fortinet Zero Day)(Citation: Wired Russia Cyberwar) For websites and databases, the OWASP top 10 and CWE top 25 highlight the most common web-based vulnerabilities.(Citation: OWASP Top 10)(Citation: CWE top 25)",
1106
1108
  "platforms": [
@@ -1323,7 +1325,8 @@
1323
1325
  ],
1324
1326
  "cve_refs": [
1325
1327
  "CVE-2026-41950",
1326
- "CVE-2024-12450"
1328
+ "CVE-2024-12450",
1329
+ "CVE-2026-22218"
1327
1330
  ]
1328
1331
  },
1329
1332
  "T1485": {
@@ -1582,7 +1585,8 @@
1582
1585
  "CVE-2025-68664",
1583
1586
  "MAL-2025-PYPI-COLORAMA-SOLANA-STEALER",
1584
1587
  "MAL-2026-RUBYGEMS-BUFFERZONECORP-SLEEPER",
1585
- "CVE-2024-12450"
1588
+ "CVE-2024-12450",
1589
+ "CVE-2026-22219"
1586
1590
  ],
1587
1591
  "description_full": "Adversaries may search compromised systems to find and obtain insecurely stored credentials. These credentials can be stored and/or misplaced in many locations on a system, including plaintext files (e.g. [Shell History](https://attack.mitre.org/techniques/T1552/003)), operating system or application-specific repositories (e.g. [Credentials in Registry](https://attack.mitre.org/techniques/T1552/002)), or other specialized files/artifacts (e.g. [Private Keys](https://attack.mitre.org/techniques/T1552/004)).(Citation: Brining MimiKatz to Unix)",
1588
1592
  "platforms": [
@@ -39336,5 +39336,210 @@
39336
39336
  "_auto_imported": false,
39337
39337
  "_intake_method": "manual-verified-curation",
39338
39338
  "_kev_short_description": "RAGFlow generates API keys and share tokens with a predictable serializer keyed by tenant_id over a UUIDv1, so the tokens are mutually derivable and a shared link yields account takeover (CWE-340); fixed in 0.22.0."
39339
+ },
39340
+ "CVE-2026-22218": {
39341
+ "name": "Chainlit /project/element Arbitrary File Read",
39342
+ "type": "Path Traversal",
39343
+ "cvss_score": 7.1,
39344
+ "cvss_vector": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N",
39345
+ "cvss_note": "VulnCheck (CNA) CVSS v4.0 base 7.1 (HIGH); NVD CVSS v3.1 base 6.5. Chainlit's /project/element update flow accepts a custom Element with a user-controlled path value and copies the file at that path into the requesting user's session without validating it stays within the document store (CWE-22 path traversal), so an authenticated client reads arbitrary files on the server host.",
39346
+ "cisa_kev": false,
39347
+ "poc_available": true,
39348
+ "poc_description": "Documented in the disclosing advisory (https://github.com/advisories/GHSA-r399-636x-v7f6 cluster): an authenticated client submits a custom Element whose path field points outside the document store and reads the file's contents from its session.",
39349
+ "ai_discovered": false,
39350
+ "ai_discovery_source": "human_researcher",
39351
+ "ai_discovery_notes": "Disclosed via VulnCheck (CNA) and enriched by NVD. The abused surface is Chainlit, a widely used open-source framework for building conversational-AI / LLM apps.",
39352
+ "ai_assisted_weaponization": false,
39353
+ "ai_assisted_notes": "No AI-assisted weaponization; the flaw is missing path validation on a caller-supplied file path in an LLM app framework's element-update API.",
39354
+ "active_exploitation": "none",
39355
+ "active_exploitation_notes": "VulnCheck/NVD advisory disclosure with a coordinated fix; no confirmed in-the-wild exploitation reported as of curation, and the CVE is not in CISA KEV (verified against the live catalog).",
39356
+ "affected": "Chainlit before 2.9.4.",
39357
+ "affected_versions": [
39358
+ "Chainlit < 2.9.4"
39359
+ ],
39360
+ "vector": "Chainlit's /project/element update flow accepts a custom Element with a user-controlled `path` value and copies the file at that path into the requesting user's session without confirming the path stays within the document store, so an authenticated client supplies a traversal path and reads arbitrary files on the server host (CWE-22).",
39361
+ "complexity": "low",
39362
+ "complexity_notes": "VulnCheck v4.0 AV:N / AC:L / PR:L - an authenticated client supplies a crafted element path.",
39363
+ "patch_available": true,
39364
+ "patch_required_reboot": false,
39365
+ "live_patch_available": false,
39366
+ "live_patch_tools": [],
39367
+ "live_patch_notes": "Remediation is upgrading to 2.9.4 or later (released 2025-12-24); redeploy, no host reboot.",
39368
+ "vendor_update_paths": [
39369
+ "Upgrade Chainlit to 2.9.4 or later. Canonicalize and validate every caller-supplied file path (including encoding transforms) against an allowlisted base directory before reading, and do not expose the app to untrusted users."
39370
+ ],
39371
+ "framework_control_gaps": {
39372
+ "NIST-800-53-SI-10": "No input validation is applied to the caller-supplied element path before the server reads it (CWE-22).",
39373
+ "NIST-800-53-AC-3": "Access enforcement does not confine the read to the document store - an authenticated user reads arbitrary host files.",
39374
+ "ISO-27001-2022-A.8.28": "Secure coding does not require canonicalization + allowlisting of file paths in the LLM app framework's element API.",
39375
+ "NIS2-Art21-network-security": "Article 21 measures do not model an LLM app framework's file-bearing API as a path-traversal surface.",
39376
+ "DORA-Art-9": "ICT protection measures do not model arbitrary file read in an AI app as an ICT-risk event.",
39377
+ "UK-CAF-B4": "System security objective has no objective for path canonicalization on AI app-framework file APIs.",
39378
+ "AU-ISM-1546": "Patch-application control does not single out LLM app frameworks.",
39379
+ "ALL-AI-PIPELINE-INTEGRITY": "No framework treats an LLM app framework's path-bearing input as an integrity boundary requiring canonicalization."
39380
+ },
39381
+ "atlas_refs": [
39382
+ "AML.T0049"
39383
+ ],
39384
+ "attack_refs": [
39385
+ "T1190",
39386
+ "T1213"
39387
+ ],
39388
+ "rwep_score": 19,
39389
+ "rwep_factors": {
39390
+ "cisa_kev": 0,
39391
+ "poc_available": 20,
39392
+ "ai_factor": 0,
39393
+ "active_exploitation": 0,
39394
+ "blast_radius": 14,
39395
+ "patch_available": -15,
39396
+ "live_patch_available": 0,
39397
+ "reboot_required": 0
39398
+ },
39399
+ "rwep_notes": "Moderate (RWEP 19, \"patch within 30 days\" band per lib/scoring.js). Not KEV (verified), no confirmed in-the-wild exploitation, patched at 2.9.4 (Hard Rule #3): poc_available=20 + blast_radius=14 (authenticated arbitrary file read in a widely used LLM app framework - host secrets/config readable), minus patch_available 15.",
39400
+ "epss_score": 0.00044,
39401
+ "epss_date": "2026-05-26",
39402
+ "epss_note": "FIRST EPSS 0.00044 (14th percentile) as of 2026-05-26.",
39403
+ "epss_source": "https://api.first.org/data/v1/epss?cve=CVE-2026-22218",
39404
+ "cwe_refs": [
39405
+ "CWE-22"
39406
+ ],
39407
+ "iocs": {
39408
+ "behavioral": [
39409
+ "Chainlit /project/element requests whose element path references files outside the document store (../ traversal or absolute host paths).",
39410
+ "Chainlit sessions receiving file contents (e.g. /etc/passwd, app config, secrets) not uploaded by the requesting user.",
39411
+ "Chainlit < 2.9.4 reachable by authenticated-but-untrusted users - the exposed precondition."
39412
+ ],
39413
+ "_ioc_source_note": "Behavioral signatures anchored to VulnCheck / NVD CVE-2026-22218 (CWE-22) and the Chainlit 2.9.4 advisory."
39414
+ },
39415
+ "source_verified": "2026-05-26",
39416
+ "verification_sources": [
39417
+ "https://nvd.nist.gov/vuln/detail/CVE-2026-22218",
39418
+ "https://github.com/advisories/GHSA-r399-636x-v7f6"
39419
+ ],
39420
+ "vendor_advisories": [
39421
+ {
39422
+ "vendor": "VulnCheck",
39423
+ "advisory_id": "CVE-2026-22218",
39424
+ "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-22218",
39425
+ "severity": "high",
39426
+ "published_date": "2026-01-20"
39427
+ },
39428
+ {
39429
+ "vendor": "NVD",
39430
+ "advisory_id": "CVE-2026-22218",
39431
+ "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-22218",
39432
+ "severity": "medium",
39433
+ "published_date": "2026-01-20"
39434
+ }
39435
+ ],
39436
+ "last_updated": "2026-05-26",
39437
+ "discovery_attribution_note": "Manually curated from NVD CVE-2026-22218 (CWE-22) + VulnCheck (CNA, CVSS v4.0 7.1). Chainlit LLM-app-framework arbitrary file read; reuses the AI-runtime-API path-traversal validation control NEW-CTRL-094 (shared with the AnythingLLM upload path-traversal and the Ollama path-traversal class).",
39438
+ "_auto_imported": false,
39439
+ "_intake_method": "manual-verified-curation",
39440
+ "_kev_short_description": "Chainlit /project/element copies a caller-supplied file path into the user's session without validation, letting an authenticated client read arbitrary host files (CWE-22); fixed in 2.9.4."
39441
+ },
39442
+ "CVE-2026-22219": {
39443
+ "name": "Chainlit /project/element SQLAlchemy-Backend Server-Side Request Forgery",
39444
+ "type": "Server-Side Request Forgery",
39445
+ "cvss_score": 8.3,
39446
+ "cvss_vector": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N/SC:H/SI:N/SA:N",
39447
+ "cvss_note": "VulnCheck (CNA) CVSS v4.0 base 8.3 (HIGH); NVD CVSS v3.1 base 7.7 (scope-changed, S:C). When Chainlit is configured with the SQLAlchemy data-layer backend, its /project/element update flow accepts a custom Element with a user-controlled `url` value and the server issues an outbound GET to it, storing the response - so an authenticated client reaches internal services or cloud metadata via the Chainlit server (CWE-918 SSRF).",
39448
+ "cisa_kev": false,
39449
+ "poc_available": true,
39450
+ "poc_description": "Documented in the disclosing advisory (https://github.com/advisories/GHSA-r399-636x-v7f6): an authenticated client sets a custom Element's url field to an internal address and the server fetches and stores the response.",
39451
+ "ai_discovered": false,
39452
+ "ai_discovery_source": "human_researcher",
39453
+ "ai_discovery_notes": "Disclosed via VulnCheck (CNA) and enriched by NVD. The abused surface is Chainlit, a widely used open-source framework for building conversational-AI / LLM apps.",
39454
+ "ai_assisted_weaponization": false,
39455
+ "ai_assisted_notes": "No AI-assisted weaponization; the flaw is an unvalidated server-side fetch (SSRF) in an LLM app framework's element-update API.",
39456
+ "active_exploitation": "none",
39457
+ "active_exploitation_notes": "VulnCheck/NVD advisory disclosure with a coordinated fix; no confirmed in-the-wild exploitation reported as of curation, and the CVE is not in CISA KEV (verified against the live catalog).",
39458
+ "affected": "Chainlit before 2.9.4 when configured with the SQLAlchemy data-layer backend.",
39459
+ "affected_versions": [
39460
+ "Chainlit < 2.9.4 (SQLAlchemy data layer)"
39461
+ ],
39462
+ "vector": "When Chainlit uses the SQLAlchemy data-layer backend, its /project/element update flow accepts a custom Element with a user-controlled `url` value and the server issues an outbound GET request to that URL and stores the response, without validating the destination - so an authenticated client reaches internal services or cloud-metadata endpoints via the server (CWE-918).",
39463
+ "complexity": "low",
39464
+ "complexity_notes": "VulnCheck v4.0 AV:N / AC:L / PR:L, scope-changed (SC:H) - an authenticated client supplies a crafted element url.",
39465
+ "patch_available": true,
39466
+ "patch_required_reboot": false,
39467
+ "live_patch_available": false,
39468
+ "live_patch_tools": [],
39469
+ "live_patch_notes": "Remediation is upgrading to 2.9.4 or later (released 2025-12-24); redeploy, no host reboot.",
39470
+ "vendor_update_paths": [
39471
+ "Upgrade Chainlit to 2.9.4 or later. Validate and allowlist every URL the element-update flow fetches: reject private, link-local, and cloud-metadata (169.254.169.254) addresses, reject non-HTTP schemes, and resolve+pin the host to prevent DNS-rebinding."
39472
+ ],
39473
+ "framework_control_gaps": {
39474
+ "NIST-800-53-SC-7": "Boundary protection does not treat the LLM app framework's element-url fetch as an egress that can reach internal services.",
39475
+ "NIST-800-53-SI-10": "No input validation is applied to the user-supplied element url before the server fetches it (CWE-918).",
39476
+ "NIST-800-53-AC-3": "Access enforcement does not stop an authenticated user from directing the server to fetch internal resources.",
39477
+ "ISO-27001-2022-A.8.22": "Segregation of networks does not prevent the LLM app framework from reaching internal services on behalf of a caller.",
39478
+ "NIS2-Art21-network-security": "Article 21 network-security measures do not model an LLM app framework's server-side fetch as an SSRF pivot.",
39479
+ "DORA-Art-9": "ICT protection measures do not model an AI app framework's server-side fetch as an ICT-risk egress.",
39480
+ "UK-CAF-B4": "System security objective has no objective for destination validation on AI-app-framework server-side fetches.",
39481
+ "AU-ISM-1546": "Patch-application control does not single out LLM app frameworks.",
39482
+ "ALL-AI-PIPELINE-INTEGRITY": "No framework treats an LLM app framework's server-side fetch as an egress that must validate and allowlist destinations."
39483
+ },
39484
+ "atlas_refs": [
39485
+ "AML.T0049"
39486
+ ],
39487
+ "attack_refs": [
39488
+ "T1190",
39489
+ "T1552"
39490
+ ],
39491
+ "rwep_score": 23,
39492
+ "rwep_factors": {
39493
+ "cisa_kev": 0,
39494
+ "poc_available": 20,
39495
+ "ai_factor": 0,
39496
+ "active_exploitation": 0,
39497
+ "blast_radius": 18,
39498
+ "patch_available": -15,
39499
+ "live_patch_available": 0,
39500
+ "reboot_required": 0
39501
+ },
39502
+ "rwep_notes": "Moderate-high (RWEP 23, \"patch within 30 days\" band per lib/scoring.js). Not KEV (verified), no confirmed in-the-wild exploitation, patched at 2.9.4 (Hard Rule #3): poc_available=20 + blast_radius=18 (scope-changed SSRF that stores the fetched response - reaches internal services / cloud metadata in a widely used LLM app framework), minus patch_available 15.",
39503
+ "epss_score": 0.00052,
39504
+ "epss_date": "2026-05-26",
39505
+ "epss_note": "FIRST EPSS 0.00052 (16th percentile) as of 2026-05-26.",
39506
+ "epss_source": "https://api.first.org/data/v1/epss?cve=CVE-2026-22219",
39507
+ "cwe_refs": [
39508
+ "CWE-918"
39509
+ ],
39510
+ "iocs": {
39511
+ "behavioral": [
39512
+ "Chainlit /project/element requests whose element url targets internal/link-local addresses or 169.254.169.254 (cloud metadata).",
39513
+ "Outbound GET requests from the Chainlit server to internal hosts triggered by element updates, with responses stored in the SQLAlchemy data layer.",
39514
+ "Chainlit < 2.9.4 with the SQLAlchemy data-layer backend reachable by authenticated-but-untrusted users - the exposed precondition."
39515
+ ],
39516
+ "_ioc_source_note": "Behavioral signatures anchored to VulnCheck / NVD CVE-2026-22219 (CWE-918) and the Chainlit 2.9.4 advisory."
39517
+ },
39518
+ "source_verified": "2026-05-26",
39519
+ "verification_sources": [
39520
+ "https://nvd.nist.gov/vuln/detail/CVE-2026-22219",
39521
+ "https://github.com/advisories/GHSA-r399-636x-v7f6"
39522
+ ],
39523
+ "vendor_advisories": [
39524
+ {
39525
+ "vendor": "VulnCheck",
39526
+ "advisory_id": "CVE-2026-22219",
39527
+ "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-22219",
39528
+ "severity": "high",
39529
+ "published_date": "2026-01-20"
39530
+ },
39531
+ {
39532
+ "vendor": "NVD",
39533
+ "advisory_id": "CVE-2026-22219",
39534
+ "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-22219",
39535
+ "severity": "high",
39536
+ "published_date": "2026-01-20"
39537
+ }
39538
+ ],
39539
+ "last_updated": "2026-05-26",
39540
+ "discovery_attribution_note": "Manually curated from NVD CVE-2026-22219 (CWE-918) + VulnCheck (CNA, CVSS v4.0 8.3). Chainlit LLM-app-framework server-side request forgery; reuses the AI-data-pipeline import SSRF control NEW-CTRL-105 (shared with the Dify RemoteFileUploadApi, RAGFlow web_crawl, and Label Studio data-pipeline SSRFs).",
39541
+ "_auto_imported": false,
39542
+ "_intake_method": "manual-verified-curation",
39543
+ "_kev_short_description": "Chainlit /project/element (SQLAlchemy backend) fetches a caller-supplied url server-side and stores the response, letting an authenticated client reach internal services (CWE-918 SSRF); fixed in 2.9.4."
39339
39544
  }
39340
39545
  }
@@ -113,7 +113,8 @@
113
113
  "CVE-2025-67818",
114
114
  "CVE-2025-8110",
115
115
  "CVE-2026-25592",
116
- "CVE-2026-34926"
116
+ "CVE-2026-34926",
117
+ "CVE-2026-22218"
117
118
  ],
118
119
  "framework_controls_partially_addressing": [
119
120
  "NIST-800-53-AC-3",
@@ -1887,7 +1888,8 @@
1887
1888
  "CVE-2025-25297",
1888
1889
  "CVE-2025-56520",
1889
1890
  "CVE-2025-61884",
1890
- "CVE-2024-12450"
1891
+ "CVE-2024-12450",
1892
+ "CVE-2026-22219"
1891
1893
  ],
1892
1894
  "framework_controls_partially_addressing": [
1893
1895
  "NIST-800-53-SC-7",
@@ -118,7 +118,9 @@
118
118
  "CVE-2026-41950",
119
119
  "CVE-2026-45829",
120
120
  "CVE-2024-12450",
121
- "CVE-2025-69286"
121
+ "CVE-2025-69286",
122
+ "CVE-2026-22218",
123
+ "CVE-2026-22219"
122
124
  ],
123
125
  "atlas_refs": [
124
126
  "AML.T0018",
@@ -1259,7 +1261,8 @@
1259
1261
  "CVE-2024-21626",
1260
1262
  "CVE-2025-23266",
1261
1263
  "CVE-2025-25297",
1262
- "CVE-2025-56520"
1264
+ "CVE-2025-56520",
1265
+ "CVE-2026-22219"
1263
1266
  ],
1264
1267
  "atlas_refs": [],
1265
1268
  "attack_refs": [
@@ -1311,7 +1314,8 @@
1311
1314
  "CVE-2026-30623",
1312
1315
  "CVE-2026-31229",
1313
1316
  "CVE-2026-31230",
1314
- "CVE-2026-33017"
1317
+ "CVE-2026-33017",
1318
+ "CVE-2026-22218"
1315
1319
  ],
1316
1320
  "atlas_refs": [
1317
1321
  "AML.T0051",
@@ -2311,7 +2315,8 @@
2311
2315
  "CVE-2025-56520",
2312
2316
  "CVE-2026-34159",
2313
2317
  "CVE-2026-42897",
2314
- "CVE-2024-12450"
2318
+ "CVE-2024-12450",
2319
+ "CVE-2026-22219"
2315
2320
  ],
2316
2321
  "atlas_refs": [
2317
2322
  "AML.T0096",
@@ -2426,7 +2431,9 @@
2426
2431
  "CVE-2026-42208",
2427
2432
  "CVE-2026-45829",
2428
2433
  "CVE-2026-9082",
2429
- "CVE-2024-12450"
2434
+ "CVE-2024-12450",
2435
+ "CVE-2026-22218",
2436
+ "CVE-2026-22219"
2430
2437
  ],
2431
2438
  "atlas_refs": [
2432
2439
  "AML.T0053"
@@ -5208,7 +5215,9 @@
5208
5215
  "CVE-2026-46333",
5209
5216
  "CVE-2026-9082",
5210
5217
  "CVE-2024-12450",
5211
- "CVE-2025-69286"
5218
+ "CVE-2025-69286",
5219
+ "CVE-2026-22218",
5220
+ "CVE-2026-22219"
5212
5221
  ],
5213
5222
  "atlas_refs": [],
5214
5223
  "attack_refs": [
@@ -5258,7 +5267,9 @@
5258
5267
  "CVE-2026-41947",
5259
5268
  "CVE-2026-41950",
5260
5269
  "CVE-2026-7482",
5261
- "CVE-2025-69286"
5270
+ "CVE-2025-69286",
5271
+ "CVE-2026-22218",
5272
+ "CVE-2026-22219"
5262
5273
  ],
5263
5274
  "atlas_refs": [
5264
5275
  "AML.T0051"
@@ -5799,7 +5810,9 @@
5799
5810
  "CVE-2026-46333",
5800
5811
  "CVE-2026-9082",
5801
5812
  "MAL-2026-SHAI-HULUD-OSS",
5802
- "CVE-2024-12450"
5813
+ "CVE-2024-12450",
5814
+ "CVE-2026-22218",
5815
+ "CVE-2026-22219"
5803
5816
  ],
5804
5817
  "atlas_refs": [],
5805
5818
  "attack_refs": [
@@ -5924,7 +5937,9 @@
5924
5937
  "CVE-2026-46333",
5925
5938
  "CVE-2026-9082",
5926
5939
  "CVE-2024-12450",
5927
- "CVE-2025-69286"
5940
+ "CVE-2025-69286",
5941
+ "CVE-2026-22218",
5942
+ "CVE-2026-22219"
5928
5943
  ],
5929
5944
  "atlas_refs": [],
5930
5945
  "attack_refs": [
@@ -6346,7 +6361,9 @@
6346
6361
  "CVE-2025-25297",
6347
6362
  "CVE-2025-56520",
6348
6363
  "CVE-2026-20182",
6349
- "CVE-2024-12450"
6364
+ "CVE-2024-12450",
6365
+ "CVE-2026-22218",
6366
+ "CVE-2026-22219"
6350
6367
  ],
6351
6368
  "atlas_refs": [],
6352
6369
  "attack_refs": [
@@ -6640,8 +6640,8 @@
6640
6640
  "new_control_requirements": [
6641
6641
  {
6642
6642
  "id": "NEW-CTRL-073",
6643
- "name": "RESEARCHER-HANDLE-GITHUB-RELEASE-TRACKER",
6644
- "description": "When a researcher handle is named in any catalog entry's discovery_attribution_note or poc_description, their public GitHub releases must be polled by the threat-intake pipeline. The handle becomes a known signal source after a single catalog-grade drop and warrants prioritized surfacing of subsequent drops.",
6643
+ "name": "RESEARCHER-HANDLE-ACTIVITY-TRACKER",
6644
+ "description": "When a researcher handle is named in any catalog entry's discovery_attribution_note or poc_description, their public code-platform activity (GitHub events or a GitLab activity feed) must be polled by the threat-intake pipeline. The handle becomes a known signal source after a single catalog-grade drop and warrants prioritized surfacing of subsequent drops.",
6645
6645
  "evidence": "CVE-2020-17103-REREGRESSION-2026, BUG-2026-NIGHTMARE-ECLIPSE-YELLOWKEY, BUG-2026-NIGHTMARE-ECLIPSE-GREENPLASMA, BUG-2026-NIGHTMARE-ECLIPSE-UNDEFEND all share the Nightmare-Eclipse / Chaotic Eclipse handle whose prior drop (BlueHammer / CVE-2026-33825) is already in the catalog. The 12-feed intake polled the right RSS sources but had no handle-tracker, so four catalog-grade drops accumulated unobserved over 5 weeks.",
6646
6646
  "gap_closes": [
6647
6647
  "NIST-800-53-SI-5",
@@ -6699,7 +6699,7 @@
6699
6699
  "new_control_requirements": [
6700
6700
  {
6701
6701
  "id": "NEW-CTRL-073",
6702
- "name": "RESEARCHER-HANDLE-GITHUB-RELEASE-TRACKER",
6702
+ "name": "RESEARCHER-HANDLE-ACTIVITY-TRACKER",
6703
6703
  "description": "Same handle-tracker control as MiniPlasma — Nightmare-Eclipse drop.",
6704
6704
  "evidence": "Same researcher; same intake-pipeline gap.",
6705
6705
  "gap_closes": [
@@ -6740,7 +6740,7 @@
6740
6740
  "new_control_requirements": [
6741
6741
  {
6742
6742
  "id": "NEW-CTRL-073",
6743
- "name": "RESEARCHER-HANDLE-GITHUB-RELEASE-TRACKER",
6743
+ "name": "RESEARCHER-HANDLE-ACTIVITY-TRACKER",
6744
6744
  "description": "Same handle-tracker control — Nightmare-Eclipse drop.",
6745
6745
  "evidence": "Same researcher; same intake-pipeline gap.",
6746
6746
  "gap_closes": [
@@ -6792,7 +6792,7 @@
6792
6792
  },
6793
6793
  {
6794
6794
  "id": "NEW-CTRL-073",
6795
- "name": "RESEARCHER-HANDLE-GITHUB-RELEASE-TRACKER",
6795
+ "name": "RESEARCHER-HANDLE-ACTIVITY-TRACKER",
6796
6796
  "description": "Same handle-tracker control — Nightmare-Eclipse April-cluster drop.",
6797
6797
  "evidence": "Same researcher; same intake-pipeline gap.",
6798
6798
  "gap_closes": [
@@ -17136,5 +17136,105 @@
17136
17136
  ],
17137
17137
  "_auto_imported": false,
17138
17138
  "_intake_method": "manual-verified-curation"
17139
+ },
17140
+ "CVE-2026-22218": {
17141
+ "name": "Chainlit /project/element Arbitrary File Read",
17142
+ "lesson_date": "2026-05-26",
17143
+ "attack_vector": {
17144
+ "description": "Chainlit's /project/element update flow copies a file at a caller-supplied path into the user's session without validating it stays within the document store, so an authenticated client reads arbitrary host files.",
17145
+ "privileges_required": "low (an authenticated client)",
17146
+ "complexity": "low",
17147
+ "ai_factor": "The abused surface is Chainlit, an open-source LLM-app framework. The lesson: an LLM app framework's file/path-bearing inputs must be canonicalized and validated against an allowlisted base before any filesystem read, and the app must not be exposed to untrusted users."
17148
+ },
17149
+ "framework_coverage": {
17150
+ "NIST-800-53-SI-10": {
17151
+ "covered": true,
17152
+ "adequate": false,
17153
+ "gap": "No input validation is applied to the caller-supplied element path before the server reads it."
17154
+ },
17155
+ "NIST-800-53-AC-3": {
17156
+ "covered": true,
17157
+ "adequate": false,
17158
+ "gap": "The read is not confined to the document store - an authenticated user reads arbitrary host files."
17159
+ },
17160
+ "ALL-AI-PIPELINE-INTEGRITY": {
17161
+ "covered": false,
17162
+ "adequate": false,
17163
+ "gap": "No framework treats an LLM app framework's path-bearing input as an integrity boundary requiring canonicalization."
17164
+ }
17165
+ },
17166
+ "compliance_exposure_score": {
17167
+ "percent_audit_passing_orgs_still_exposed": 77,
17168
+ "basis": "LLM app frameworks accept file/element references from clients and read them on trusted-network assumptions; path canonicalization is rarely audited.",
17169
+ "theater_pattern": "ai_app_path_traversal_file_read"
17170
+ },
17171
+ "ai_discovered_zeroday": false,
17172
+ "ai_discovery_source": "human_researcher",
17173
+ "ai_assist_factor": "none",
17174
+ "new_control_requirements": [
17175
+ {
17176
+ "id": "NEW-CTRL-094",
17177
+ "name": "AI-RUNTIME-API-PATH-TRAVERSAL-VALIDATION",
17178
+ "description": "An AI application's file/path-bearing inputs (upload filenames, model digests, element/document paths, API route parameters) must be canonicalized and validated - including non-ASCII / encoding transforms - against an allowlisted base directory before touching the filesystem, and the app must not be network-exposed to untrusted users. The distinguishing test: submit an element/file reference whose path decodes to ../ traversal or an absolute host path on a staging instance and confirm it is rejected, not read and returned.",
17179
+ "evidence": "https://github.com/advisories/GHSA-r399-636x-v7f6",
17180
+ "gap_closes": [
17181
+ "NIST-800-53-SI-2",
17182
+ "NIST-800-53-SI-10",
17183
+ "ALL-AI-PIPELINE-INTEGRITY"
17184
+ ]
17185
+ }
17186
+ ],
17187
+ "_auto_imported": false,
17188
+ "_intake_method": "manual-verified-curation"
17189
+ },
17190
+ "CVE-2026-22219": {
17191
+ "name": "Chainlit /project/element SQLAlchemy-Backend Server-Side Request Forgery",
17192
+ "lesson_date": "2026-05-26",
17193
+ "attack_vector": {
17194
+ "description": "When Chainlit uses the SQLAlchemy data-layer backend, its /project/element flow fetches a caller-supplied url server-side and stores the response without validating the destination, so an authenticated client reaches internal services or cloud metadata.",
17195
+ "privileges_required": "low (an authenticated client)",
17196
+ "complexity": "low",
17197
+ "ai_factor": "The abused surface is Chainlit, an open-source LLM-app framework. The lesson: an LLM app framework's server-side fetches must validate and allowlist destinations or become an SSRF pivot - the same control that closes the Dify and RAGFlow ingestion SSRFs."
17198
+ },
17199
+ "framework_coverage": {
17200
+ "NIST-800-53-SC-7": {
17201
+ "covered": true,
17202
+ "adequate": false,
17203
+ "gap": "Boundary protection does not treat the framework's element-url fetch as an egress that can reach internal services."
17204
+ },
17205
+ "NIST-800-53-SI-10": {
17206
+ "covered": true,
17207
+ "adequate": false,
17208
+ "gap": "No input validation is applied to the user-supplied element url before the server fetches it."
17209
+ },
17210
+ "ALL-AI-PIPELINE-INTEGRITY": {
17211
+ "covered": false,
17212
+ "adequate": false,
17213
+ "gap": "No framework treats an LLM app framework's server-side fetch as an egress that must validate and allowlist destinations."
17214
+ }
17215
+ },
17216
+ "compliance_exposure_score": {
17217
+ "percent_audit_passing_orgs_still_exposed": 78,
17218
+ "basis": "LLM app frameworks fetch caller-supplied URLs from element/data-layer flows on trusted-network assumptions; the fetch destination is not validated.",
17219
+ "theater_pattern": "ai_data_pipeline_ssrf_trust"
17220
+ },
17221
+ "ai_discovered_zeroday": false,
17222
+ "ai_discovery_source": "human_researcher",
17223
+ "ai_assist_factor": "none",
17224
+ "new_control_requirements": [
17225
+ {
17226
+ "id": "NEW-CTRL-105",
17227
+ "name": "AI-DATA-PIPELINE-IMPORT-SSRF-PROTECTION",
17228
+ "description": "An AI data-pipeline / app platform that fetches from caller-supplied URLs or endpoints (data import, element urls, cloud-storage endpoint configuration, webhook/annotation sources, ingestion crawlers) must validate and allowlist the destination before issuing the request: reject private, link-local, and cloud-metadata addresses (169.254.169.254), reject file:// and non-HTTP schemes, and resolve+pin the host to prevent DNS-rebinding. Restrict who can configure server-side fetches. The distinguishing test: configure the fetched URL to an internal or cloud-metadata address on a staging instance and confirm the server refuses the fetch - a platform that issues the request and returns/stores the response is exploitable for SSRF / internal pivot, regardless of authentication posture.",
17229
+ "evidence": "https://github.com/advisories/GHSA-r399-636x-v7f6",
17230
+ "gap_closes": [
17231
+ "NIST-800-53-SC-7",
17232
+ "NIST-800-53-SI-10",
17233
+ "ALL-AI-PIPELINE-INTEGRITY"
17234
+ ]
17235
+ }
17236
+ ],
17237
+ "_auto_imported": false,
17238
+ "_intake_method": "manual-verified-curation"
17139
17239
  }
17140
17240
  }
@@ -169,10 +169,11 @@ const FEEDS = [
169
169
  description: 'The Hacker News RSS — canonical tech-press venue for PoC drops + zero-day weaponization writeups. Anchored MiniPlasma 2026-05-14 writeup which the 12-feed set missed. CVE-ID extraction same as bleepingcomputer-security. v0.13.17.',
170
170
  },
171
171
  {
172
- name: 'nightmare-eclipse-github',
173
- url: 'https://api.github.com/users/Nightmare-Eclipse/events/public',
174
- kind: 'github-events',
175
- description: 'GitHub public-events feed for the Nightmare-Eclipse / Chaotic Eclipse researcher handle. Anchored the BlueHammer (CVE-2026-33825) + MiniPlasma cluster — the handle is the canonical signal source for unpatched Windows LPE / BitLocker / Defender drops since April 2026. NEW-CTRL-073 handle-tracker class; additional handles registered as their drops land in the catalog. v0.13.17.',
172
+ name: 'nightmare-eclipse-gitlab',
173
+ url: 'https://gitlab.com/Nightmare-Eclipse.atom',
174
+ kind: 'gitlab-activity',
175
+ researcher_handle: 'Nightmare-Eclipse',
176
+ description: 'GitLab public-activity Atom feed for the Nightmare-Eclipse / Chaotic Eclipse researcher handle, migrated from GitHub after the account was removed. Anchored the BlueHammer (CVE-2026-33825) + MiniPlasma cluster — the handle is the canonical signal source for unpatched Windows LPE / BitLocker / Defender drops since April 2026. NEW-CTRL-073 handle-tracker class; additional handles registered as their drops land in the catalog.',
176
177
  },
177
178
  ];
178
179
 
@@ -275,6 +276,54 @@ function parseGitHubEvents(body, feed) {
275
276
  return out;
276
277
  }
277
278
 
279
+ /**
280
+ * GitLab public-activity parser — NEW-CTRL-073 researcher-handle tracker.
281
+ *
282
+ * GitLab publishes a public activity Atom feed at
283
+ * https://gitlab.com/<handle>.atom. Each <entry> describes one activity
284
+ * (pushed a tag, created a project/repository, pushed commits). We parse it
285
+ * with the shared Atom tokenizer and classify the entry title into the same
286
+ * event_type vocabulary the GitHub tracker emits, so the handle-drop diff in
287
+ * checkFeed fires identically across both sources. researcher_handle comes
288
+ * from the feed's explicit field (authoritative; the .atom URL also carries
289
+ * the handle as a fallback). This is the migration target after the handle's
290
+ * GitHub account was removed — the .atom feed needs no API token and the
291
+ * existing parseRssAtom tokenizer already handles its XML.
292
+ */
293
+ function parseGitLabActivity(body, feed) {
294
+ const errors = [];
295
+ const entries = parseRssAtom(body, errors);
296
+ const handle = feed.researcher_handle
297
+ || (feed.url.match(/gitlab\.com\/([^/.]+)\.atom/) || [])[1]
298
+ || null;
299
+ return entries.map((it) => {
300
+ const t = `${it.title || ''}`;
301
+ let event_type = 'ActivityEvent';
302
+ if (/pushed (?:new )?tag|created tag|released/i.test(t)) event_type = 'ReleaseEvent';
303
+ else if (/created (?:repository|project)|imported project/i.test(t)) event_type = 'PublicEvent';
304
+ else if (/pushed (?:new commits|to)/i.test(t)) event_type = 'PushEvent';
305
+ else if (/created branch/i.test(t)) event_type = 'CreateEvent';
306
+ // Project path: GitLab activity titles read "<handle> pushed to project
307
+ // <ns>/<repo>"; the entry link path is the secondary source.
308
+ let repo_name = '';
309
+ const titleM = t.match(/project\s+(\S+\/\S+)/i);
310
+ if (titleM) repo_name = titleM[1];
311
+ else {
312
+ const linkM = (it.link || '').match(/gitlab\.com\/([^?#]+?)(?:\/-\/|$)/);
313
+ if (linkM) repo_name = linkM[1];
314
+ }
315
+ return {
316
+ title: it.title || '',
317
+ link: it.link || feed.url,
318
+ published: it.published || '',
319
+ body: it.body || it.title || '',
320
+ researcher_handle: handle,
321
+ event_type,
322
+ repo_name,
323
+ };
324
+ });
325
+ }
326
+
278
327
  /**
279
328
  * Fetch a feed body. In fixture / cache modes, read from disk.
280
329
  */
@@ -316,6 +365,9 @@ async function checkFeed(feed, ctx) {
316
365
  } else if (feed.kind === 'github-events') {
317
366
  items = parseGitHubEvents(res.body, feed);
318
367
  items = items.map((it) => ({ ...it, cve_ids: extractCveIds(`${it.title} ${it.body} ${it.link}`) }));
368
+ } else if (feed.kind === 'gitlab-activity') {
369
+ items = parseGitLabActivity(res.body, feed);
370
+ items = items.map((it) => ({ ...it, cve_ids: extractCveIds(`${it.title} ${it.body} ${it.link}`) }));
319
371
  } else {
320
372
  items = parseRssAtom(res.body);
321
373
  items = items.map((it) => ({ ...it, cve_ids: extractCveIds(`${it.title} ${it.body} ${it.link}`) }));
@@ -352,7 +404,7 @@ async function checkFeed(feed, ctx) {
352
404
  // researcher publishes alias name, vendor advisory + CVE assignment
353
405
  // arrive days / weeks later). The diff carries handle + event_type
354
406
  // so downstream triage can prioritise without waiting for an ID.
355
- if (feed.kind === 'github-events' && it.cve_ids.length === 0 && (it.event_type === 'ReleaseEvent' || it.event_type === 'PublicEvent')) {
407
+ if ((feed.kind === 'github-events' || feed.kind === 'gitlab-activity') && it.cve_ids.length === 0 && (it.event_type === 'ReleaseEvent' || it.event_type === 'PublicEvent')) {
356
408
  diffs.push({
357
409
  id: `HANDLE:${it.researcher_handle || feed.name}:${it.repo_name || 'unknown'}@${(it.published || '').slice(0, 10)}`,
358
410
  source: feed.name,
@@ -463,6 +515,7 @@ module.exports = {
463
515
  FEEDS,
464
516
  extractCveIds,
465
517
  parseRssAtom,
518
+ parseGitLabActivity,
466
519
  parseCsafIndex,
467
520
  parseGitHubEvents,
468
521
  };