CoolFace
Datasetpublic

ctokx/tram-attack-multilabel-clean

TRAM ATT&CK Multi-Label (cleaned, with leak-free splits) Sentence-level multi-label mapping of cyber threat intelligence prose to MITRE ATT&CK technique IDs. Derived from MITRE CTID's TRAM corpus, deduplicated and republished with two split schemes so that leakage can be measured rather than assumed. Everything here is regenerated by python scripts/01_build_dataset.py. No row was edited by hand. Why this exists The upstream corpus contains 19,178 sentences drawn… See the full description on the dataset page: https://huggingface.co/datasets/ctokx/tram-attack-multilabel-clean.

sourceHugging Faceapache-2.0updated 2mo agoView on Hugging Face
0likes50downloads
Dataset Card

TRAM ATT&CK Multi-Label (cleaned, with leak-free splits)

Sentence-level multi-label mapping of cyber threat intelligence prose to MITRE ATT&CK technique IDs. Derived from MITRE CTID's TRAM corpus, deduplicated and republished with two split schemes so that leakage can be measured rather than assumed.

Everything here is regenerated by python scripts/01_build_dataset.py. No row was edited by hand.

Why this exists

The upstream corpus contains 19,178 sentences drawn from only 151 source reports. Threat reports repeat phrasing heavily, both within a report and across reports covering the same campaign, so the sentence-level random split that most work uses puts near-identical prose on both sides of the evaluation.

This release ships both splits and expects you to report both:

ConfigConstructionUse it for
documentNo source report appears in more than one splitReporting. The honest number.
randomNaive sentence-level shuffleComparison against prior work that split this way

Construction

StepEffect
Raw sentences19,178
Strip scraped title: … url: … headers7 rows became empty and were dropped
Deduplicate (case/punctuation-insensitive)415 duplicate groups, 714 rows removed
of which appeared in more than one document370
Merge labels across duplicates12 labels recovered that a naive drop would have lost
Drop techniques in <3 documentsT1557.001 only (1 document), 7 label instances
Final18,437 sentences · 4,024 labelled (21.8%) · 49 techniques · 151 documents

Deduplication takes the union of labels across duplicates. Two copies of one sentence annotated [T1027] and [T1027, T1140] are one sentence annotated inconsistently; keeping the union recovers the label instead of discarding it with the duplicate row. The surviving row keeps the first document it appeared in, so no sentence can span two documents.

T1557.001 is dropped because it appears in exactly one document. It cannot be placed in train and test, so it is either untrainable or unevaluable. Dropping it and saying so beats reporting F1 = 0.00 for it.

Splits

ConfigSplitSentencesLabelled
documenttrain11,6682,684
documentdev3,134631
documenttest3,635709
randomtrain12,9052,837
randomdev2,765610
randomtest2,767577

The document split is built by group-aware multi-label stratification in two phases. A plain greedy pass fails here: with a 70/15/15 target the train split always shows the largest absolute label deficit, so it absorbs every document containing a rare technique and the test set ends up with none. Phase 1 therefore reserves one document per technique for each split, rarest technique first; phase 2 packs the remainder using deficit normalised by split size.

Consequences, both worth knowing:

  • All 49 techniques appear in all three `document` splits. The naive random split does not manage this. T1072 has zero dev examples, so its threshold cannot be tuned.
  • Coverage seeding costs some size balance. The document split lands at roughly 63/17/20 rather than 70/15/15. Larger dev and test sets make the estimates more stable, so this was accepted rather than corrected.

Fields

json
{
  "sentence":  "The dropper base64-encodes its configuration before writing it to disk.",
  "labels":    ["T1027"],
  "doc_title": "NotPetya Technical Analysis  A Triple Threat ..."
}

labels is empty for 78.2% of rows. These are real negatives and should be kept. A detector that fires on every sentence of a threat report is useless to an analyst.

Known limitations

  • 50 techniques, not the full ATT&CK matrix. The upstream corpus covers the 49 retained here. A technique outside that set will never be predicted.
  • Heavy long tail. T1027 has 678 instances; the rarest retained techniques have roughly 20. Macro-averaged metrics are the meaningful ones.
  • Single-sentence context. Labels were assigned per sentence, so techniques only inferable from surrounding paragraphs are under-represented.
  • 151 documents is not many. Even the document split is one draw from a small pool; treat differences of a point or two as noise.
  • Annotation is not exhaustive. Some unlabelled sentences do describe techniques. Absolute recall is therefore pessimistic.

Licence and provenance

Derived from the TRAM corpus, released by the MITRE Center for Threat-Informed Defense under Apache-2.0; this derivative keeps Apache-2.0. The underlying sentences are fragments of publicly-published vendor threat reports as redistributed by MITRE CTID.

Technique names come from MITRE ATT&CK STIX data, used under the ATT&CK Terms of Use. ATT&CK® is a registered trademark of The MITRE Corporation.

AnnoCTR was deliberately not merged in. It is CC-BY-SA 4.0, and share-alike would relicense this entire dataset and restrict downstream reuse. It remains a good candidate for a separately-licensed evaluation split.

Citation

bibtex
@misc{tram_attack_multilabel_clean,
  title  = {TRAM ATT&CK Multi-Label (cleaned, leak-free splits)},
  author = {Varol Cagdas Tok},
  year   = {2026},
  url    = {https://huggingface.co/datasets/ctokx/tram-attack-multilabel-clean},
  note   = {Derived from MITRE CTID TRAM, Apache-2.0}
}

Please also cite the upstream corpus:

bibtex
@misc{tram,
  title        = {TRAM: Threat Report ATT&CK Mapper},
  author       = {{MITRE Center for Threat-Informed Defense}},
  howpublished = {\url{https://github.com/center-for-threat-informed-defense/tram}}
}