Official implementation for the paper "Uncovering Vulnerabilities of LLM-Assisted Cyber Threat Intelligence"
Anonymous repository. Will be migrated to a permanent GitHub repo with DOI via Zenodo upon acceptance.
This repository provides full reproduction code for our large-scale empirical study of LLM failure modes in Cyber Threat Intelligence (CTI) reasoning. We identify three domain-specific vulnerability categories:
| Category | Description |
|---|---|
| Spurious Correlation | LLMs over-attribute based on co-occurrence rather than causal evidence (5 subtypes) |
| Contradictory Knowledge | Conflicting CTI sources destabilize model reasoning (6 subtypes) |
| Constrained Generalization | LLMs fail on emerging/zero-day threats and novel distributions (4 subtypes) |
llm-cti/
├── src/
│ ├── data/
│ │ ├── dataset_loader.py # Load & unify CTIBench, SevenLLM, SWE-Bench, CyberTeam
│ │ ├── realworld_collector.py # Collect from NVD, CISA, MISP, VirusTotal, OTX
│ │ ├── preprocessor.py # Normalize & unify benchmark instances into CTI scenarios
│ │ └── benchmark_stats.py # Dataset statistics (Table 9)
│ ├── models/
│ │ ├── model_registry.py # Registry of all evaluated LLMs (Table 2)
│ │ ├── general_llms.py # GPT-5, Claude Sonnet 4, Gemini 2.5, etc.
│ │ ├── cyber_llms.py # FoundationSec, Cyber-Zero, ZySec, etc.
│ │ └── prompt_templates.py # Evaluation prompt structure (Appendix B.6)
│ ├── evaluation/
│ │ ├── cti_evaluator.py # Main evaluator across all 4 CTI stages
│ │ ├── metrics.py # F1, Accuracy, BLEU, AUC, NDCG
│ │ ├── contextualization.py # Stage 1 task evaluations
│ │ ├── attribution.py # Stage 2 task evaluations
│ │ ├── prediction.py # Stage 3 task evaluations
│ │ └── mitigation.py # Stage 4 task evaluations
│ ├── categorization/
│ │ ├── stratified_sampler.py # Algorithm 1: Stratified failure sampling (RQ1)
│ │ ├── failure_mode_taxonomy.py # Algorithm 2: Autoregressive failure mode determination (RQ2)
│ │ ├── human_in_loop.py # Algorithm 3: Multi-agent + human-in-loop categorization (RQ3)
│ │ └── vulnerability_types.py # Definitions & detection logic for all 15 subtypes
│ ├── mitigation/
│ │ ├── causal_intervention.py # C³ counterfactual consistency check (§5.1)
│ │ ├── spurious_correlation.py # Mitigations for types 1.1–1.5
│ │ ├── contradictory_knowledge.py # Mitigations for types 2.1–2.6
│ │ ├── constrained_generalization.py # Mitigations for types 3.1–3.4
│ │ └── retrieval_filters.py # Retrieval-time filtering strategies
│ └── utils/
│ ├── logger.py # Logging utilities
│ ├── cache.py # API call caching
│ ├── ioc_normalizer.py # IOC canonicalization
│ └── entity_resolver.py # Alias resolution for threat actors/malware
├── configs/
│ ├── models.yaml # Model API configs
│ ├── evaluation.yaml # Evaluation settings
│ └── mitigation.yaml # Mitigation strategy configs
├── scripts/
│ ├── run_evaluation.sh # Full evaluation pipeline
│ ├── run_categorization.sh # Failure categorization pipeline
│ ├── run_mitigation.sh # Mitigation experiments
│ └── run_ablation.sh # Ablation study
├── tests/
│ ├── test_metrics.py
│ ├── test_categorization.py
│ └── test_mitigation.py
├── notebooks/
│ ├── 01_dataset_exploration.ipynb
│ ├── 02_evaluation_results.ipynb
│ ├── 03_vulnerability_analysis.ipynb
│ └── 04_mitigation_results.ipynb
├── results/ # Output directory for experiment results
├── requirements.txt
├── setup.py
└── README.md
git clone https://github.com/anonymous/llm-cti
cd llm-cti
pip install -e .
Or install dependencies directly:
pip install -r requirements.txt
Set the following environment variables for the models you plan to use:
export OPENAI_API_KEY="your-openai-key"
export ANTHROPIC_API_KEY="your-anthropic-key"
export GOOGLE_API_KEY="your-google-key"
export XAI_API_KEY="your-xai-key" # For Grok
export NVD_API_KEY="your-nvd-key" # Optional, increases rate limit
export VT_API_KEY="your-virustotal-key" # For VirusTotal enrichment
export OTX_API_KEY="your-otx-key" # For AlienVault OTX
# Download and preprocess all benchmarks
python -m src.data.dataset_loader --output_dir data/benchmarks
# Collect real-world threat data from NVD, CISA, MISP, OTX
python -m src.data.realworld_collector --output_dir data/realworld
# Preprocess and unify into CTI scenarios
python -m src.data.preprocessor \
--benchmark_dir data/benchmarks \
--realworld_dir data/realworld \
--output_dir data/processed
# Evaluate all models on all CTI tasks
bash scripts/run_evaluation.sh
# Or run a single model
python -m src.evaluation.cti_evaluator \
--model gpt-5 \
--data_dir data/processed \
--output_dir results/evaluation \
--stages contextualization attribution prediction mitigation
bash scripts/run_categorization.sh
# Or run each step separately:
# Step 1: Stratified failure sampling
python -m src.categorization.stratified_sampler \
--eval_results results/evaluation \
--output_dir results/failures
# Step 2: Failure mode determination (iterative)
python -m src.categorization.failure_mode_taxonomy \
--failures results/failures \
--output_dir results/taxonomy
# Step 3: Multi-agent + human-in-loop categorization
python -m src.categorization.human_in_loop \
--taxonomy results/taxonomy \
--output_dir results/categorized
bash scripts/run_mitigation.sh
# Causal intervention (C³) across all tasks
python -m src.mitigation.causal_intervention \
--eval_results results/evaluation \
--output_dir results/mitigation/causal
# Fine-grained mitigations per vulnerability subtype
python -m src.mitigation.spurious_correlation --subtype all
python -m src.mitigation.contradictory_knowledge --subtype all
python -m src.mitigation.constrained_generalization --subtype all
bash scripts/run_ablation.sh
| Abbreviation | Model |
|---|---|
| G5 | GPT-5 |
| Go4 | GPT-o4 mini |
| CLD | Claude Sonnet 4 |
| GEM | Gemini 2.5 |
| LL70 | Llama-3.1-70B-Instruct |
| MIX | Mixtral-8x7B-Instruct-v0.1 |
| QWN | Qwen2.5-14B-Instruct |
| GRK | Grok-2 |
| Abbreviation | Model |
|---|---|
| FSC | Foundation-Sec-8B |
| CB0 | Cyber-Zero |
| ZYS | ZySec-AI SecurityLLM |
| LLY | Lily-Cybersecurity-7B-v0.2 |
| CBS | CyberBase-13B |
| SPT | SecGPT (Clouditera) |
| DHT | DeepHat-V1-7B |
| Stage | Tasks | Primary Metrics |
|---|---|---|
| ❶ Contextualization | Affected Systems, Attack Infrastructure, Vulnerability Linking, Malware Family Mapping, IOC Normalization, Threat Report Alignment, Event Timeline, Graph Population, Source Reliability | F1, Acc, BLEU, AUC |
| ❷ Attribution | Threat Actor Linking, TTP Extraction, Campaign Attribution, Infrastructure Reuse, Language/Style Profiling, False Flag Detection, Evidence Weighting, Relation Graph | F1, Acc, BLEU |
| ❸ Prediction | Exploit Likelihood, Impact Forecast, Target Sector Prediction, Campaign Escalation | AUC, BLEU, Acc |
| ❹ Mitigation | Patch Recommendation, YARA Rule Generation, Response Summarization, Mitigation-TTP Mapping, Defensive Playbook, Countermeasure Ranking, Incident Ticket | F1, BLEU, Acc, NDCG |
Spurious Correlation (SC)
├── 1.1 Co-mention bias from raw threat incidents
├── 1.2 Exploitation bias from deliberately reused IoCs
├── 1.3 Confounding factors (explicit/implicit entity correlation)
├── 1.4 Skewed source representation
└── 1.5 Hierarchical metadata from attack chains
Contradictory Knowledge (CK)
├── 2.1 Temporal contradiction (outdated vs. recent evidence)
├── 2.2 Conflicting reports of attack contexts/dependencies
├── 2.3 Semantic conflict (naming/taxonomy divergence)
├── 2.4 Divergent data structures across platforms
├── 2.5 Misaligned knowledge and security standards
└── 2.6 Counteracting CTI generation and LLM alignment
Constrained Generalization (CG)
├── 3.1 Distributional bias
├── 3.2 Unseen patterns from emerging threats
├── 3.3 Overfitted reasoning
└── 3.4 Environmental unawareness
python scripts/reproduce_table2.py --output results/table2.csv
python scripts/reproduce_figure2.py --output results/figure2.pdf
python scripts/reproduce_table6.py --output results/table6.csv
python scripts/reproduce_table7.py --output results/table7.csv
This project is licensed under the MIT License — see LICENSE for details.
3 commits
Python
90.3%
Shell
6.0%
Jupyter Notebook
3.6%
Official implementation for the paper "Uncovering Vulnerabilities of LLM-Assisted Cyber Threat Intelligence"
Anonymous repository. Will be migrated to a permanent GitHub repo with DOI via Zenodo upon acceptance.
This repository provides full reproduction code for our large-scale empirical study of LLM failure modes in Cyber Threat Intelligence (CTI) reasoning. We identify three domain-specific vulnerability categories:
| Category | Description |
|---|---|
| Spurious Correlation | LLMs over-attribute based on co-occurrence rather than causal evidence (5 subtypes) |
| Contradictory Knowledge | Conflicting CTI sources destabilize model reasoning (6 subtypes) |
| Constrained Generalization | LLMs fail on emerging/zero-day threats and novel distributions (4 subtypes) |
llm-cti/
├── src/
│ ├── data/
│ │ ├── dataset_loader.py # Load & unify CTIBench, SevenLLM, SWE-Bench, CyberTeam
│ │ ├── realworld_collector.py # Collect from NVD, CISA, MISP, VirusTotal, OTX
│ │ ├── preprocessor.py # Normalize & unify benchmark instances into CTI scenarios
│ │ └── benchmark_stats.py # Dataset statistics (Table 9)
│ ├── models/
│ │ ├── model_registry.py # Registry of all evaluated LLMs (Table 2)
│ │ ├── general_llms.py # GPT-5, Claude Sonnet 4, Gemini 2.5, etc.
│ │ ├── cyber_llms.py # FoundationSec, Cyber-Zero, ZySec, etc.
│ │ └── prompt_templates.py # Evaluation prompt structure (Appendix B.6)
│ ├── evaluation/
│ │ ├── cti_evaluator.py # Main evaluator across all 4 CTI stages
│ │ ├── metrics.py # F1, Accuracy, BLEU, AUC, NDCG
│ │ ├── contextualization.py # Stage 1 task evaluations
│ │ ├── attribution.py # Stage 2 task evaluations
│ │ ├── prediction.py # Stage 3 task evaluations
│ │ └── mitigation.py # Stage 4 task evaluations
│ ├── categorization/
│ │ ├── stratified_sampler.py # Algorithm 1: Stratified failure sampling (RQ1)
│ │ ├── failure_mode_taxonomy.py # Algorithm 2: Autoregressive failure mode determination (RQ2)
│ │ ├── human_in_loop.py # Algorithm 3: Multi-agent + human-in-loop categorization (RQ3)
│ │ └── vulnerability_types.py # Definitions & detection logic for all 15 subtypes
│ ├── mitigation/
│ │ ├── causal_intervention.py # C³ counterfactual consistency check (§5.1)
│ │ ├── spurious_correlation.py # Mitigations for types 1.1–1.5
│ │ ├── contradictory_knowledge.py # Mitigations for types 2.1–2.6
│ │ ├── constrained_generalization.py # Mitigations for types 3.1–3.4
│ │ └── retrieval_filters.py # Retrieval-time filtering strategies
│ └── utils/
│ ├── logger.py # Logging utilities
│ ├── cache.py # API call caching
│ ├── ioc_normalizer.py # IOC canonicalization
│ └── entity_resolver.py # Alias resolution for threat actors/malware
├── configs/
│ ├── models.yaml # Model API configs
│ ├── evaluation.yaml # Evaluation settings
│ └── mitigation.yaml # Mitigation strategy configs
├── scripts/
│ ├── run_evaluation.sh # Full evaluation pipeline
│ ├── run_categorization.sh # Failure categorization pipeline
│ ├── run_mitigation.sh # Mitigation experiments
│ └── run_ablation.sh # Ablation study
├── tests/
│ ├── test_metrics.py
│ ├── test_categorization.py
│ └── test_mitigation.py
├── notebooks/
│ ├── 01_dataset_exploration.ipynb
│ ├── 02_evaluation_results.ipynb
│ ├── 03_vulnerability_analysis.ipynb
│ └── 04_mitigation_results.ipynb
├── results/ # Output directory for experiment results
├── requirements.txt
├── setup.py
└── README.md
git clone https://github.com/anonymous/llm-cti
cd llm-cti
pip install -e .
Or install dependencies directly:
pip install -r requirements.txt
Set the following environment variables for the models you plan to use:
export OPENAI_API_KEY="your-openai-key"
export ANTHROPIC_API_KEY="your-anthropic-key"
export GOOGLE_API_KEY="your-google-key"
export XAI_API_KEY="your-xai-key" # For Grok
export NVD_API_KEY="your-nvd-key" # Optional, increases rate limit
export VT_API_KEY="your-virustotal-key" # For VirusTotal enrichment
export OTX_API_KEY="your-otx-key" # For AlienVault OTX
# Download and preprocess all benchmarks
python -m src.data.dataset_loader --output_dir data/benchmarks
# Collect real-world threat data from NVD, CISA, MISP, OTX
python -m src.data.realworld_collector --output_dir data/realworld
# Preprocess and unify into CTI scenarios
python -m src.data.preprocessor \
--benchmark_dir data/benchmarks \
--realworld_dir data/realworld \
--output_dir data/processed
# Evaluate all models on all CTI tasks
bash scripts/run_evaluation.sh
# Or run a single model
python -m src.evaluation.cti_evaluator \
--model gpt-5 \
--data_dir data/processed \
--output_dir results/evaluation \
--stages contextualization attribution prediction mitigation
bash scripts/run_categorization.sh
# Or run each step separately:
# Step 1: Stratified failure sampling
python -m src.categorization.stratified_sampler \
--eval_results results/evaluation \
--output_dir results/failures
# Step 2: Failure mode determination (iterative)
python -m src.categorization.failure_mode_taxonomy \
--failures results/failures \
--output_dir results/taxonomy
# Step 3: Multi-agent + human-in-loop categorization
python -m src.categorization.human_in_loop \
--taxonomy results/taxonomy \
--output_dir results/categorized
bash scripts/run_mitigation.sh
# Causal intervention (C³) across all tasks
python -m src.mitigation.causal_intervention \
--eval_results results/evaluation \
--output_dir results/mitigation/causal
# Fine-grained mitigations per vulnerability subtype
python -m src.mitigation.spurious_correlation --subtype all
python -m src.mitigation.contradictory_knowledge --subtype all
python -m src.mitigation.constrained_generalization --subtype all
bash scripts/run_ablation.sh
| Abbreviation | Model |
|---|---|
| G5 | GPT-5 |
| Go4 | GPT-o4 mini |
| CLD | Claude Sonnet 4 |
| GEM | Gemini 2.5 |
| LL70 | Llama-3.1-70B-Instruct |
| MIX | Mixtral-8x7B-Instruct-v0.1 |
| QWN | Qwen2.5-14B-Instruct |
| GRK | Grok-2 |
| Abbreviation | Model |
|---|---|
| FSC | Foundation-Sec-8B |
| CB0 | Cyber-Zero |
| ZYS | ZySec-AI SecurityLLM |
| LLY | Lily-Cybersecurity-7B-v0.2 |
| CBS | CyberBase-13B |
| SPT | SecGPT (Clouditera) |
| DHT | DeepHat-V1-7B |
| Stage | Tasks | Primary Metrics |
|---|---|---|
| ❶ Contextualization | Affected Systems, Attack Infrastructure, Vulnerability Linking, Malware Family Mapping, IOC Normalization, Threat Report Alignment, Event Timeline, Graph Population, Source Reliability | F1, Acc, BLEU, AUC |
| ❷ Attribution | Threat Actor Linking, TTP Extraction, Campaign Attribution, Infrastructure Reuse, Language/Style Profiling, False Flag Detection, Evidence Weighting, Relation Graph | F1, Acc, BLEU |
| ❸ Prediction | Exploit Likelihood, Impact Forecast, Target Sector Prediction, Campaign Escalation | AUC, BLEU, Acc |
| ❹ Mitigation | Patch Recommendation, YARA Rule Generation, Response Summarization, Mitigation-TTP Mapping, Defensive Playbook, Countermeasure Ranking, Incident Ticket | F1, BLEU, Acc, NDCG |
Spurious Correlation (SC)
├── 1.1 Co-mention bias from raw threat incidents
├── 1.2 Exploitation bias from deliberately reused IoCs
├── 1.3 Confounding factors (explicit/implicit entity correlation)
├── 1.4 Skewed source representation
└── 1.5 Hierarchical metadata from attack chains
Contradictory Knowledge (CK)
├── 2.1 Temporal contradiction (outdated vs. recent evidence)
├── 2.2 Conflicting reports of attack contexts/dependencies
├── 2.3 Semantic conflict (naming/taxonomy divergence)
├── 2.4 Divergent data structures across platforms
├── 2.5 Misaligned knowledge and security standards
└── 2.6 Counteracting CTI generation and LLM alignment
Constrained Generalization (CG)
├── 3.1 Distributional bias
├── 3.2 Unseen patterns from emerging threats
├── 3.3 Overfitted reasoning
└── 3.4 Environmental unawareness
python scripts/reproduce_table2.py --output results/table2.csv
python scripts/reproduce_figure2.py --output results/figure2.pdf
python scripts/reproduce_table6.py --output results/table6.csv
python scripts/reproduce_table7.py --output results/table7.csv
This project is licensed under the MIT License — see LICENSE for details.
3 commits
Python
90.3%
Shell
6.0%
Jupyter Notebook
3.6%