Skip to content

fix(atlas): reconcile MITRE ATLAS framework data v4.0 -> v5.6.0 (#187) - #211

Merged
emmanuelgjr merged 1 commit into
mainfrom
fix/atlas-stale-id-remap-187
Jun 9, 2026
Merged

fix(atlas): reconcile MITRE ATLAS framework data v4.0 -> v5.6.0 (#187)#211
emmanuelgjr merged 1 commit into
mainfrom
fix/atlas-stale-id-remap-187

Conversation

@emmanuelgjr

Copy link
Copy Markdown
Owner

What & why

Re-triaging #187 (the 6 removed ATLAS IDs) revealed the problem is much larger: data/frameworks/mitre-atlas.json was seeded from ATLAS v4.0 (per its changelog), and ATLAS has since done its major "ML"→"AI" rename + technique renumber. Of the 50 entries:

  • ✅ 16 correct · 🟡 ~9 cosmetic (ML→AI wording)
  • 6 removed upstream (the [framework-update] MITRE ATLAS — content change detected #187 trigger)
  • 🔴 ~17 silently wrong — the ID still exists but now points at a different technique (e.g. repo T0048="Discover ML Model Family" but upstream T0048=External Harms; T0057="LLM Plugin Compromise" but upstream=LLM Data Leakage; T0021="Data Leakage" but upstream=Establish Accounts). The validator/diff never flagged these because the ID strings are valid.

Fixing only the 6 would have left ~17 entries pointing at the wrong technique while looking fixed.

What this PR does

Reconciles every entry by intent against current ATLAS (v5.6.0, mitre-atlas/atlas-datadist/ATLAS.yaml). Result: 50 → 43 entries, all verified present upstream with authoritative titles (the two prompt-injection sub-techniques keep the clearer Direct/Indirect Prompt Injection labels). Custom GenAI descriptions are preserved (concatenated where entries merge). Regenerated docs/frameworks-registry.js.

Key remaps (maintainer-approved)

Old → New Technique
T0022 T0012 Valid Accounts
T0027 T0024.001 Invert AI Model
T0030 T0024 + T0057 Exfiltration via AI Inference API / LLM Data Leakage
T0032 T0070 RAG Poisoning
T0045 T0048.002 Societal Harm
T0048 T0014 Discover AI Model Family
T0053 T0013 Discover AI Model Ontology
T0035 T0029 Denial of AI Service
T0056 T0057 LLM Data Leakage
T0041 T0056 Extract LLM System Prompt
T0037 T0067 LLM Trusted Output Components Manipulation
T0057 T0011.002 Poisoned AI Agent Tool
T0063 T0071 False RAG Entry Injection
T0068 T0035 AI Artifact Collection
T0002/T0003/T0004 T0006/T0002/T0000 recon IDs shifted
T0055 T0048 External Harms
T0000, T0001 dropped tactic-level umbrellas, covered by T0040/T0044

Also bumped version 4.0 → 5.6.0 and last_synced.

Verification

  • Every final ID confirmed present in current ATLAS (comm against dist/ATLAS.yaml = empty residual).
  • node scripts/validate.js0 errors / 0 warnings / 385 passed.

Deliberately scoped out (separate content-review PRs to follow)

  1. Markdown ATLAS cross-references — these turned out to be a hybrid (some entries already migrated to current ATLAS, some not), so a blind replace would corrupt the already-correct ones. Needs a name-guided pass + sign-off table. Only 2 provably-dead IDs appear there (T0032, T0045).
  2. classifier/splits/*.json labels — ML training/test data (5 dead-ID labels + hybrid).
  3. data/incidents.json / T0039 — generated from upstream genai_incidents; fix belongs upstream.

Closes the data-file portion of #187.

…187)

The ATLAS layer in data/frameworks/mitre-atlas.json was seeded from ATLAS
v4.0 (per its changelog). ATLAS has since done its major "ML"->"AI" rename
plus a significant technique renumber, so ~half of the 50 entries were
broken: 6 cited IDs were removed upstream (the #187 trigger) and ~17 more
still "existed" but now point to entirely different techniques (e.g. repo
T0048="Discover ML Model Family" but upstream T0048=External Harms;
T0057="LLM Plugin Compromise" but upstream T0057=LLM Data Leakage).

Reconciled every entry by intent against current ATLAS (v5.6.0,
mitre-atlas/atlas-data dist/ATLAS.yaml). All 43 resulting IDs are verified
present upstream and titles match the authoritative names (the two
Prompt-Injection sub-techniques keep the clearer "Direct/Indirect Prompt
Injection" labels). Notable decisions (maintainer-approved):

- 6 removed IDs: T0022->T0012 (Valid Accounts), T0027->T0024.001 (Invert
  AI Model), T0030->T0024 + T0057 (Exfiltration via AI Inference API / LLM
  Data Leakage), T0032->T0070 (RAG Poisoning), T0045->T0048.002 (Societal
  Harm); T0039 lives only in the generated incidents feed (fixed upstream).
- Renumbered/merged: T0035->T0029, T0048->T0014, T0053->T0013, T0056->T0057,
  T0021->T0057, T0041->T0056, T0037->T0067, T0002->T0006, T0003->T0002,
  T0004->T0000, T0055->T0048, T0057->T0011.002, T0063->T0071, T0068->T0035.
- Dropped 2 tactic-level umbrellas (T0000 "ML Model Access", T0001 "ML
  Attack Staging") that aren't techniques and are covered by T0040/T0044.

Custom GenAI descriptions preserved (concatenated on merge). Regenerated
docs/frameworks-registry.js. Follow-ups (separate, content-review PRs): the
hybrid markdown ATLAS cross-references, the classifier split labels, and
the upstream genai_incidents T0039.
@github-actions

github-actions Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

🛡️ OWASP GenAI Security Crosswalk

This PR modifies 1 AI-related file(s). The following OWASP GenAI risks may be relevant:

Risk Entry Files Action
ASI01 Agent Goal Hijack docs/frameworks-registry.js View controls
ASI02 Tool Misuse docs/frameworks-registry.js View controls
ASI03 Credential Misuse docs/frameworks-registry.js View controls
ASI04 Supply Chain docs/frameworks-registry.js View controls
ASI05 Code Execution docs/frameworks-registry.js View controls
DSGAI01 Data Leakage docs/frameworks-registry.js View controls
DSGAI04 RAG Poisoning docs/frameworks-registry.js View controls
DSGAI08 Configuration & Deployment docs/frameworks-registry.js View controls
LLM01 Prompt Injection docs/frameworks-registry.js View controls
LLM02 Sensitive Information Disclosure docs/frameworks-registry.js View controls
LLM03 Supply Chain docs/frameworks-registry.js View controls
LLM04 Data & Model Poisoning docs/frameworks-registry.js View controls
LLM06 Excessive Agency docs/frameworks-registry.js View controls
LLM07 System Prompt Leakage docs/frameworks-registry.js View controls
LLM09 Misinformation docs/frameworks-registry.js View controls

🔍 Scanned 2 changed files · Found 15 potential risks · Full crosswalk · Gap analysis

@emmanuelgjr
emmanuelgjr merged commit ecb4ef9 into main Jun 9, 2026
9 checks passed
@emmanuelgjr
emmanuelgjr deleted the fix/atlas-stale-id-remap-187 branch June 9, 2026 04:51
emmanuelgjr added a commit that referenced this pull request Jun 9, 2026
#187) (#212)

Follow-up to the data-file reconciliation (PR #211). The markdown ATLAS
layer was a *hybrid* — most entries already used current ATLAS, but a
handful still carried v4.0 IDs that now point at different techniques.
Reconciled by NAME (the *_MITREATLAS.md detail tables carry technique
names, making intent unambiguous); custom GenAI labels that sit on stable
IDs (T0040/T0015/T0025/T0035) were left as the author's deliberate
mappings.

ID corrections (verified against ATLAS v5.6.0 / atlas-data dist/ATLAS.yaml):
- T0037 -> T0067  (Output Manipulation; T0037 is now "Data from Local System")
- T0063 -> T0071  (Embedding Manipulation; T0063 is now "Discover AI Model Outputs")
- T0041 -> T0056  (System-Prompt Leakage refs; T0041 is now "Physical Environment Access")
- T0032 -> T0070  (RAG/data poisoning; T0032 removed upstream)
- T0045 -> T0048.002 (Disinformation -> Societal Harm; T0045 removed upstream)
- T0010.000 -> T0010 and T0016.000 -> T0016 (sub-technique refs used where the
  parent "AI Supply Chain Compromise" / "Obtain Capabilities" was meant)
- T0021 -> T0057 under LLM02 only (Sensitive Information Disclosure = LLM Data
  Leakage; Agentic's T0021 = "Establish Accounts" is correct and left as-is)
- DSGAI_MITREATLAS detail row "Obtain Capabilities" mislabeled AML.T0012
  (Valid Accounts) -> AML.T0016

29 mapping files + regenerated entries/backlinks/data bundle. validate.js
0/0/385; markdownlint clean. frameworks-registry.js intentionally untouched
(owned by #211). Remaining: classifier split labels + upstream T0039.
emmanuelgjr added a commit that referenced this pull request Jun 10, 2026
…nts (#187) (#214)

Final two tails of #187:

1. classifier/splits relabel (calibration.json, test.json, split_meta.json)
   The splits were frozen at commit 10f2372, before the ATLAS v4.0->current
   reconciliation (PRs #211/#212), leaving 25 ATLAS rows (2 calibration,
   23 test) pointing at IDs that are stale in current ground truth. Each
   stale control_id was remapped by positional alignment of its entry's
   MITRE ATLAS mapping list between the freeze commit and HEAD - i.e. the
   maintainer's own curation history decides the successor, not fresh
   judgment (verified consistent with the #211/#212 decision tables, e.g.
   T0037->T0067, T0063->T0071, T0045->T0060, T0022->T0021, T0068->T0053).
   control_name refreshed from current entries on all 117 ATLAS rows;
   hashes recomputed per the documented {entry_id}::{framework}::
   {control_id} format. Split membership, counts, severity/tier/scope/
   notes (eval-query inputs), and all non-ATLAS rows are unchanged.
   Provenance recorded in split_meta.json under "relabels".

   Invariants verified: calibration/test hash-disjoint (no leakage), no
   duplicate ATLAS rows, every ATLAS row present in current data/entries
   ground truth AND in current upstream dist/ATLAS.yaml (117/117).

2. Incidents sync (data/incidents.json, docs/incidents.js)
   Pulled upstream genai_incidents (emmanuelgjr/genai_incidents#26), which
   removed the phantom AML.T0039 - an ID that never existed in any ATLAS
   release - from the corpus. 12 of our 125 curated incidents carried it;
   all already cite AML.T0048 (External Harms), so no signal lost.

validate.js: 0 errors / 0 warnings / 385 passed.

Closes #187.
emmanuelgjr added a commit that referenced this pull request Jun 10, 2026
…ion (#215)

Counts drifted after the ATLAS v4.0->current reconciliation (#211: 50->43
ATLAS entries) and the incidents-feed work:

- controls 1,514 -> 1,507 (README badge + 5 text spots, CITATION.cff,
  banner.svg, og-image.svg)
- incidents 114 -> 125 (banner.svg, og-image.svg)
- mapping files 67 -> 70 (banner.svg engine box + stat card, og-image.svg)
- mappings 3,210 -> 3,351 (banner.svg)

All figures verified against the data layer (data/frameworks/*.json,
data/entries/*.json, data/incidents.json, source md dirs). Historical
records (CHANGELOG, EVAL_REPORT, web-app timeline) left as-is.

validate.js PASSED; markdownlint clean.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant