供应链恶意软件制品分析 是做什么的?
概述
供应链攻击通过破坏合法软件分发渠道,利用受信任的更新机制传播恶意软件。著名案例包括SolarWinds SUNBURST(2020年,影响超过18,000名客户)、3CX SmoothOperator(2023年,源自Trading Technologies的级联供应链攻击),以及大量npm/PyPI包投毒事件。分析过程涉及将trojanized二进制文件与合法版本进行对比、识别构建制品中的注入代码、检查代码签名异常,并从初始入侵到载荷投递追溯整个感染链。截至2025年,供应链攻击占所有入侵事件的30%,相比往年增长了100%。
使用场景
- 调查需要分析供应链恶意软件制品的安全事件时
- 为此领域构建检测规则或威胁狩猎查询时
- 当SOC分析师需要该分析类型的结构化流程时
- 验证相关攻击技术的安全监控覆盖率时
前提条件
- Python 3.9+,安装
pefile、ssdeep、hashlib - 二进制比对工具(BinDiff、Diaphora)
- 代码签名验证工具(sigcheck、codesign)
- 软件组成分析(SCA)工具
- 能访问合法软件版本用于比对
- 包仓库监控(npm、PyPI、NuGet)
工作流程
步骤 1:二进制比对分析
#!/usr/bin/env python3
"""将trojanized二进制文件与合法版本进行比对。"""
import hashlib
import pefile
import sys
import json
def compare_pe_files(legitimate_path, suspect_path):
"""比较合法版本与可疑版本的PE文件结构。"""
legit_pe = pefile.PE(legitimate_path)
suspect_pe = pefile.PE(suspect_path)
report = {"differences": [], "suspicious_sections": [], "import_changes": []}
# 比较节区
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}
# 发现新增或修改的节区
for name, props in suspect_sections.items():
if name not in legit_sections:
report["suspicious_sections"].append({
"name": name, "reason": "合法版本中不存在的新节区",
"size": props["size"], "entropy": round(props["entropy"], 2),
})
elif abs(props["size"] - legit_sections[name]["size"]) > 1024:
report["suspicious_sections"].append({
"name": name, "reason": "节区大小显著变化",
"legit_size": legit_sections[name]["size"],
"suspect_size": props["size"],
})
# 比较导入表
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)
# 检查代码签名
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):
"""计算文件的多个哈希值。"""
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"用法: {sys.argv[0]} <合法二进制文件> <可疑二进制文件>")
sys.exit(1)
report = compare_pe_files(sys.argv[1], sys.argv[2])
print(json.dumps(report, indent=2))
验证标准
- 通过二进制比对识别trojanized组件
- 隔离并单独分析注入代码
- 记录代码签名异常
- 根据构建制品重建感染时间线
- 评估受影响系统的下游影响范围
- 提取IOC用于检测和阻断