mirror of
https://github.com/mukul975/Anthropic-Cybersecurity-Skills.git
synced 2026-08-03 01:10:18 +03:00
Deterministic audit against vendored MITRE/NIST oracles (ATT&CK v19.1, ATLAS 2026.07, NIST CSF 2.0, D3FEND v1.4.0) found and fixed: - 27 wrong-framework leaks on 12 AI-security skills: ATLAS AML.* IDs were under `mitre_attack` (-> `atlas_techniques`) and AI-RMF GOVERN/MEASURE IDs under `nist_csf` (-> `nist_ai_rmf`). - RS.AN-01 -> RS.AN-03 on 37 forensics/incident-analysis skills (CSF 1.1 ID retired in CSF 2.0; RS.AN-03 is the incident-analysis successor). - PR.DS-06 -> PR.DS-01 on the SLSA/Sigstore provenance skill (CSF 1.1 ID absorbed into PR.DS-01 in CSF 2.0; body prose updated too). - AML.T0104 -> AML.T0010 on 3 software-supply-chain skills (T0104 is "Publish Poisoned AI Agent Tool" -- wrong topic; T0010 "AI Supply Chain Compromise" is correct). CSF/ATLAS replacements verified against NIST CSWP.29, the official CSF 1.1->2.0 transition workbook, and mitre-atlas/atlas-data. Framework-ID gate: 0 defects. Schema: 817/817 pass.
174 lines
6.1 KiB
Markdown
174 lines
6.1 KiB
Markdown
---
|
|
name: analyzing-supply-chain-malware-artifacts
|
|
description: Investigate supply chain attack artifacts including trojanized software
|
|
updates, compromised build pipelines, and sideloaded dependencies to identify intrusion
|
|
vectors and scope of compromise.
|
|
domain: cybersecurity
|
|
subdomain: malware-analysis
|
|
tags:
|
|
- supply-chain
|
|
- malware-analysis
|
|
- trojanized-software
|
|
- solarwinds
|
|
- 3cx
|
|
- dependency-confusion
|
|
- software-integrity
|
|
version: '1.0'
|
|
author: mahipal
|
|
license: Apache-2.0
|
|
atlas_techniques:
|
|
- AML.T0010
|
|
nist_ai_rmf:
|
|
- GOVERN-5.2
|
|
- MAP-1.6
|
|
- MANAGE-2.2
|
|
d3fend_techniques:
|
|
- Platform Hardening
|
|
- Hardware Component Inventory
|
|
- Restore Object
|
|
- Electromagnetic Radiation Hardening
|
|
- RF Shielding
|
|
nist_csf:
|
|
- DE.AE-02
|
|
- RS.AN-03
|
|
- ID.RA-01
|
|
- DE.CM-01
|
|
mitre_attack:
|
|
- T1195.002
|
|
- T1195.001
|
|
- T1554
|
|
- T1553.002
|
|
- T1027
|
|
---
|
|
# Analyzing Supply Chain Malware Artifacts
|
|
|
|
## Overview
|
|
|
|
Supply chain attacks compromise legitimate software distribution channels to deliver malware through trusted update mechanisms. Notable examples include SolarWinds SUNBURST (2020, affecting 18,000+ customers), 3CX SmoothOperator (2023, a cascading supply chain attack originating from Trading Technologies), and numerous npm/PyPI package poisoning campaigns. Analysis involves comparing trojanized binaries against legitimate versions, identifying injected code in build artifacts, examining code signing anomalies, and tracing the infection chain from initial compromise through payload delivery. As of 2025, supply chain attacks account for 30% of all breaches, a 100% increase from prior years.
|
|
|
|
|
|
## When to Use
|
|
|
|
- When investigating security incidents that require analyzing supply chain malware artifacts
|
|
- When building detection rules or threat hunting queries for this domain
|
|
- When SOC analysts need structured procedures for this analysis type
|
|
- When validating security monitoring coverage for related attack techniques
|
|
|
|
## Prerequisites
|
|
|
|
- Python 3.9+ with `pefile`, `ssdeep`, `hashlib`
|
|
- Binary diff tools (BinDiff, Diaphora)
|
|
- Code signing verification tools (sigcheck, codesign)
|
|
- Software composition analysis (SCA) tools
|
|
- Access to legitimate software versions for comparison
|
|
- Package repository monitoring (npm, PyPI, NuGet)
|
|
|
|
## Workflow
|
|
|
|
### Step 1: Binary Comparison Analysis
|
|
|
|
```python
|
|
#!/usr/bin/env python3
|
|
"""Compare trojanized binary against legitimate version."""
|
|
import hashlib
|
|
import pefile
|
|
import sys
|
|
import json
|
|
|
|
|
|
def compare_pe_files(legitimate_path, suspect_path):
|
|
"""Compare PE file structures between legitimate and suspect versions."""
|
|
legit_pe = pefile.PE(legitimate_path)
|
|
suspect_pe = pefile.PE(suspect_path)
|
|
|
|
report = {"differences": [], "suspicious_sections": [], "import_changes": []}
|
|
|
|
# Compare sections
|
|
legit_sections = {s.Name.rstrip(b'\x00').decode(): {
|
|
"size": s.SizeOfRawData,
|
|
"entropy": s.get_entropy(),
|
|
"characteristics": s.Characteristics,
|
|
} for s in legit_pe.sections}
|
|
|
|
suspect_sections = {s.Name.rstrip(b'\x00').decode(): {
|
|
"size": s.SizeOfRawData,
|
|
"entropy": s.get_entropy(),
|
|
"characteristics": s.Characteristics,
|
|
} for s in suspect_pe.sections}
|
|
|
|
# Find new or modified sections
|
|
for name, props in suspect_sections.items():
|
|
if name not in legit_sections:
|
|
report["suspicious_sections"].append({
|
|
"name": name, "reason": "New section not in legitimate version",
|
|
"size": props["size"], "entropy": round(props["entropy"], 2),
|
|
})
|
|
elif abs(props["size"] - legit_sections[name]["size"]) > 1024:
|
|
report["suspicious_sections"].append({
|
|
"name": name, "reason": "Section size significantly changed",
|
|
"legit_size": legit_sections[name]["size"],
|
|
"suspect_size": props["size"],
|
|
})
|
|
|
|
# Compare imports
|
|
legit_imports = set()
|
|
if hasattr(legit_pe, 'DIRECTORY_ENTRY_IMPORT'):
|
|
for entry in legit_pe.DIRECTORY_ENTRY_IMPORT:
|
|
for imp in entry.imports:
|
|
if imp.name:
|
|
legit_imports.add(f"{entry.dll.decode()}!{imp.name.decode()}")
|
|
|
|
suspect_imports = set()
|
|
if hasattr(suspect_pe, 'DIRECTORY_ENTRY_IMPORT'):
|
|
for entry in suspect_pe.DIRECTORY_ENTRY_IMPORT:
|
|
for imp in entry.imports:
|
|
if imp.name:
|
|
suspect_imports.add(f"{entry.dll.decode()}!{imp.name.decode()}")
|
|
|
|
new_imports = suspect_imports - legit_imports
|
|
if new_imports:
|
|
report["import_changes"] = list(new_imports)
|
|
|
|
# Check code signing
|
|
report["legit_signed"] = bool(legit_pe.OPTIONAL_HEADER.DATA_DIRECTORY[4].Size)
|
|
report["suspect_signed"] = bool(suspect_pe.OPTIONAL_HEADER.DATA_DIRECTORY[4].Size)
|
|
|
|
return report
|
|
|
|
|
|
def hash_file(filepath):
|
|
"""Calculate multiple hashes for a file."""
|
|
hashes = {}
|
|
with open(filepath, 'rb') as f:
|
|
data = f.read()
|
|
for algo in ['md5', 'sha1', 'sha256']:
|
|
h = hashlib.new(algo)
|
|
h.update(data)
|
|
hashes[algo] = h.hexdigest()
|
|
return hashes
|
|
|
|
|
|
if __name__ == "__main__":
|
|
if len(sys.argv) < 3:
|
|
print(f"Usage: {sys.argv[0]} <legitimate_binary> <suspect_binary>")
|
|
sys.exit(1)
|
|
report = compare_pe_files(sys.argv[1], sys.argv[2])
|
|
print(json.dumps(report, indent=2))
|
|
```
|
|
|
|
## Validation Criteria
|
|
|
|
- Trojanized components identified through binary diffing
|
|
- Injected code isolated and analyzed separately
|
|
- Code signing anomalies documented
|
|
- Infection timeline reconstructed from build artifacts
|
|
- Downstream impact scope assessed across affected systems
|
|
- IOCs extracted for detection and blocking
|
|
|
|
## References
|
|
|
|
- [ReversingLabs - 3CX Supply Chain Analysis](https://www.reversinglabs.com/blog/what-went-wrong-with-the-3cx-software-supply-chain-attack-and-how-it-could-have-been-prevented)
|
|
- [Fortinet - SolarWinds Supply Chain Attack](https://www.fortinet.com/resources/cyberglossary/solarwinds-cyber-attack)
|
|
- [Picus - 3CX SmoothOperator Analysis](https://www.picussecurity.com/resource/blog/smoothoperator-analysis-of-3cxdesktopapp-supply-chain-attack)
|
|
- [MITRE ATT&CK T1195 - Supply Chain Compromise](https://attack.mitre.org/techniques/T1195/)
|