HackerSignal 是一个网络威胁情报(CTI)数据集与基准,它将黑客在地下社区和安全社区中讨论的内容与这些讨论所涉及的漏洞关联起来。它汇总了来自八个来源层的 64 个公开论坛和来源标识符的 7,447,646 篇精确去重文档,涵盖黑客论坛、漏洞利用存档、NVD CVE 描述、安全公告、漏洞赏金报告、修复提交以及 CISA 已知被利用漏洞。在此语料库之上,它定义了 三个带有时间划分的训练/验证/测试集的基准任务:CVE 关联检索、8 类漏洞利用类型分类,以及针对训练之后发布的漏洞的 CVE 不相交时间泛化。
HackerSignal 发表于 NeurIPS 2026 Evaluations & Datasets Track。预印本: arXiv:2605.03158。
| 文档数 | 7,447,646(精确去重) |
| 来源 | 8 个来源层中的 64 个公开论坛 / 来源标识符 |
| 黑客社区层 | 6,966,014 篇帖子(最大的论坛:Gayanku、Antichat、Evolution、AntiOnline、HackForums) |
| 漏洞参考 | 340,536 条 NVD CVE 描述(任务 1 和任务 3 的检索语料库) |
| 其他层 | 漏洞利用存档、漏洞利用问答、安全公告、漏洞赏金披露、修复提交、CISA KEV |
| 语言 | 英语以及大量非英语内容:俄语(antichat,182 万篇帖子)、波斯语(persiantools,28 万篇)等;30.2% 的 CVE 关联论坛帖子以西里尔字母为主 |
| 时间跨度 | 1988–2026 |
| 划分 | 时间划分:每个任务中测试数据均晚于训练数据 |
| 元数据 | Croissant JSON-LD、Datasheet for Datasets、来源发布清单 |
| 许可证 | 数据 CC BY 4.0(LICENSE-DATA),代码 MIT(LICENSE);各来源条款见发布治理 |
| 任务 | 类型 | 训练集 | 验证集 | 测试集 | 语料库 / 总计 | 指标 |
|---|---|---|---|---|---|---|
| 1. CVE 链接检索 (CVE-R) | 检索 | 56,692 | 2,584 | 1,990 | 340,536 | R@1, R@5, R@10, MRR |
| 2. 漏洞利用类型分类 (ETC) | 8 类分类 | 64,413 | 4,735 | 1,735 | 70,883 | Macro-F1, 各类别 F1 |
| 3. 时间泛化 (TG) | CVE 不相交检索 | 56,833 | 2,535 | 1,898 | 340,536 | R@1, R@5, R@10, MRR |
基线阶梯涵盖检索方面的 BM25、四个稠密双编码器(all-MiniLM-L6-v2、all-mpnet-base-v2、BGE-base-en-v1.5、E5-base-v2)以及 BM25 + 稠密混合模型,分类方面涵盖决策树、TF-IDF + 逻辑回归、线性 SVM、RNN、GRU、LSTM、BiLSTM、SecBERT、SecureBERT 和 CySecBERT。分数见下方基线结果以及论文(表 5–7)。
Camera-ready 数值,在一台 Apple M5 Pro(PyTorch 2.14.1,MPS)上从已发布数据端到端重建。以下每个值均由 results/camera_ready/results.csv 生成;每次运行的随机种子、模型版本和数据哈希位于 results/camera_ready/provenance.json。检索使用零样本编码器覆盖全部 340,536 条 NVD 描述,MRR 为 MRR@10。论坛帖子试点对 1,964 条与 CVE 关联的黑客社区帖子中的每个 CVE 字符串进行掩码,并从同一语料库中检索所引用的 CVE。
| 模型 | 任务 1 R@1 | 任务 1 MRR | 任务 3 R@1 | 任务 3 MRR | 论坛帖子试点 MRR |
|---|---|---|---|---|---|
| BM25 | 0.595 | 0.636 | 0.620 | 0.660 | 0.064 |
| all-MiniLM-L6-v2 | 0.655 | 0.709 | 0.670 | 0.722 | 0.073 |
| all-mpnet-base-v2 | 0.626 | 0.682 | 0.647 | 0.703 | 0.065 |
| BGE-base-en-v1.5 | 0.653 | 0.714 | 0.667 | 0.726 | 0.078 |
| E5-base-v2 | 0.649 | 0.710 | 0.663 | 0.721 | 0.072 |
| Hybrid BM25 + mpnet | 0.679 | 0.711 | 0.698 | 0.730 | – |
前两名模型在两个任务上统计上持平(配对自助法,任务 1 ΔMRR 0.003,95% CI [-0.013, 0.019];任务 3 ΔMRR 0.004,95% CI [-0.012, 0.020])。
任务 2(漏洞利用类型分类,1,735 个测试漏洞利用)。Transformer 在 15K 训练子样本上进行微调。
| 模型 | Macro-F1(均值 ± 标准差,3 个种子) | 95% CI |
|---|---|---|
| Decision Tree | 0.702 ± 0.007 | [0.677, 0.727] |
| TF-IDF + LR | 0.772 ± 0.000 | [0.744, 0.795] |
| SVM | 0.799 ± 0.000 | [0.773, 0.822] |
| RNN | 0.436 ± 0.031 | [0.415, 0.455] |
| GRU | 0.858 ± 0.001 | [0.840, 0.874] |
| LSTM | 0.824 ± 0.013 | [0.804, 0.841] |
| BiLSTM | 0.856 ± 0.003 | [0.837, 0.872] |
| SecBERT | 0.852 ± 0.007 | [0.833, 0.870] |
| SecureBERT | 0.892 ± 0.008 | [0.875, 0.907] |
| CySecBERT | 0.898 ± 0.003 | [0.882, 0.913] |
CySecBERT 与 SecureBERT 无显著差异(配对 Δ 0.006,95% CI [-0.003, 0.016])。
测试划分已提交至 data/benchmark_v2/。训练和验证划分以及完整语料库以 JSONL 文件形式位于 Hugging Face Hub:
from datasets import load_dataset
base = "hf://datasets/BenAmpel/HackerSignal/benchmark_v2"
task1 = load_dataset("json", data_files={
"train": f"{base}/task1_cve_linkage/train.jsonl",
"validation": f"{base}/task1_cve_linkage/val.jsonl",
"test": f"{base}/task1_cve_linkage/test.jsonl",
})
corpus = load_dataset("json", data_files=f"{base}/task1_cve_linkage/corpus.jsonl", split="train")
print(task1["test"][0]["text"][:200], "->", task1["test"][0]["cve_id"])
将 task1_cve_linkage 替换为 task2_exploit_type(字段 text、label)或
task3_temporal_generalization(字段 text、cve_id)以用于其他任务。
git clone https://github.com/BenAmpel/hackersignal.git
cd hackersignal
pip install -e ".[sentence-transformers]"
将 Hub 中的训练、验证和语料文件放到 data/benchmark_v2/<task>/ 下,然后运行:
# all three tasks; --task 1|2|3 runs one task, --skip-dense / --skip-neural shorten the run
PYTHONPATH=src python3 -m etg.benchmark.run_baselines_v2 \
--data-dir data/benchmark_v2 \
--output data/benchmark_v2/results.json
神经模型在可用时使用 Apple MPS,否则回退到 CPU。对 34 万篇文档语料进行稠密编码,在较新的 GPU 或 Apple Silicon 机器上,每个模型耗时从几分钟(MiniLM)到几十分钟(base 规模的编码器)不等。
hackersignal/
├── src/etg/
│ ├── collectors/ # data collection scripts, one per source
│ ├── data/ # corpus unification, preprocessing and statistics
│ ├── benchmark/ # split construction and baseline runners
│ ├── eval/ # retrieval metrics
│ └── scraper/ # generic forum crawlers
├── scripts/ # task builders and figure scripts
├── data/
│ ├── benchmark_v2/ # committed test splits and task metadata
│ ├── stats/ # corpus statistics
│ ├── audits/ # manual-audit packets and LLM-judge artifacts
│ └── release/ # source release manifest and validation
└── docs/
├── datasheet.md
└── release_governance.md
src/etg/collectors/ 中的每个收集器都会将一对 {source}_posts.jsonl 和 {source}_cve_index.jsonl 文件写入
data/: