情报格式与标准:STIX/TAXII、MISP、IODEF 与共享机制
各位同学,咱们今天聊聊情报的“通用语言”。
做威胁狩猎,最头疼的是什么?不是找不到威胁,而是找到了,不知道怎么描述,或者描述出来别人看不懂。你想想看,你发现一个 IOC,用 Excel 记下来,发给同行,对方还得猜你这 IP 是 C2 还是扫描器。这效率太低了。
所以,业界搞了一套标准。说白了,就是让机器和人都能看懂的情报“普通话”。我个人习惯,不管项目大小,先看对方用的是什么标准。这决定了后续的自动化程度。
STIX/TAXII:情报界的“TCP/IP”
STIX 和 TAXII 经常一起出现。STIX 是描述情报的语言,TAXII 是传输情报的协议。我经常跟团队说,STIX 定义了“说什么”,TAXII 定义了“怎么说”。
STIX(结构化威胁信息表达式)
STIX 2.1 是目前的主流版本。它把威胁情报抽象成几个核心对象(Domain Objects):
- Indicator:你发现的 IOC,比如 IP、域名、Hash。
- Attack Pattern:攻击者的手法,比如“钓鱼邮件”、“SQL注入”。
- Campaign:一系列有组织的攻击活动。
- Threat Actor:谁干的,比如 APT29、 Lazarus。
- Relationship:对象之间的关系,比如“这个 Indicator 属于这个 Attack Pattern”。
核心要点:STIX 最牛的地方在于关系(Relationship)。它不只是告诉你一个 IP 是恶意的,还告诉你这个 IP 跟哪个团伙、哪个攻击手法有关。这才是情报的“灵魂”。
举个例子,一段简化的 STIX 2.1 JSON 长这样:
{
"type": "indicator",
"spec_version": "2.1",
"id": "indicator--8e2e2d2b-17d4-4cbf-938f-98ee46b3cd3f",
"created": "2024-01-15T09:00:00.000Z",
"modified": "2024-01-15T09:00:00.000Z",
"name": "恶意IP地址",
"pattern": "[ipv4-addr:value = '192.168.1.100']",
"pattern_type": "stix",
"valid_from": "2024-01-15T09:00:00.000Z"
}
嗯,这里要注意。STIX 的 pattern 字段用的是 STIX Patterning Language,不是简单的字符串。它支持复杂的逻辑组合,比如“这个 IP 在过去 24 小时内访问过这个域名”。
TAXII(可信自动化情报信息交换)
TAXII 是传输 STIX 情报的协议。它定义了两种服务模式:
- Collection:你订阅一个情报源,TAXII 服务器会主动推送情报给你。
- Channel:类似消息队列,你可以发布情报,也可以订阅别人的情报。
我的经验:在实际部署中,我建议用 TAXII 2.x 版本。它基于 HTTPS + JSON,比 1.x 的 XML 版本好解析得多。我曾经在一个项目中,因为用了 TAXII 1.x,解析 XML 的代码比处理情报本身还复杂,后来果断升级了。
MISP:实战中的“情报瑞士军刀”
如果说 STIX/TAXII 是标准,那 MISP 就是最流行的实现。MISP 是一个开源平台,它自己有一套数据模型,但可以导入导出 STIX 格式。
MISP 的核心概念是 Event 和 Attribute:
- Event:一个安全事件,比如“针对财务部的钓鱼攻击”。
- Attribute:事件中的具体 IOC,比如“钓鱼邮件发件人”、“附件 Hash”、“C2 域名”。
MISP 的格式比 STIX 更“接地气”。它支持很多细分的类型,比如:
| 类型 | 说明 | 示例 |
|---|---|---|
| ip-dst | 目标 IP | 10.0.0.1 |
| domain | 域名 | evil.com |
| md5 | 文件 MD5 值 | d41d8cd98f00b204e9800998ecf8427e |
| email-src | 发件人邮箱 | attacker@evil.com |
| url | 恶意 URL | http://evil.com/payload.exe |
避坑指南:我曾经遇到一个团队,把所有 IOC 都塞进 MISP 的“comment”字段里,导致无法自动化处理。记住,MISP 的 Attribute 类型是给机器看的,一定要选对类型。比如 IP 就用 ip-dst,别用 text。
MISP 还有一个强大的功能叫 Galaxy,可以给事件打标签。比如你可以给一个事件打上“APT29”、“T1566.001(钓鱼附件)”这样的标签。这其实就是 STIX 里 Attack Pattern 和 Threat Actor 的本地化实现。
IODEF:老牌标准,但依然能打
IODEF(事件对象描述交换格式)是 IETF 的标准,比 STIX 出现得早。它基于 XML,主要用于描述安全事件本身,而不是威胁情报。
它的核心结构是 IODEF-Document,里面包含 Incident 对象:
- IncidentID:事件唯一标识。
- Impact:事件造成的影响,比如“数据泄露”、“服务中断”。
- Contact:事件相关联系人。
- EventData:事件的具体数据,包括 Flow(网络流)、Expectation(期望的响应动作)。
说实话,IODEF 在现在的威胁狩猎场景中用得不如 STIX 和 MISP 多。但在一些老牌 CERT(计算机应急响应团队)和 ISP 之间,它依然是标准。为什么?因为它对事件的描述非常结构化,特别适合做事件上报和统计。
我的看法:如果你跟政府机构或大型 ISP 对接,大概率会遇到 IODEF。别慌,它虽然 XML 看着烦,但结构清晰。我建议用现成的库(比如 Python 的 iodef2)来解析,别自己手写 XML 解析器,容易踩坑。
情报共享机制:从“单打独斗”到“协同作战”
标准有了,怎么共享?我把它分成三种模式:
- PULL 模式(拉取):你定期去情报源拉数据。比如每天凌晨从 MISP 服务器拉取最新的 Event。优点是控制权在你,缺点是实时性差。
- PUSH 模式(推送):情报源主动推给你。TAXII 的 Collection 就是典型。优点是实时性好,缺点是你得开端口接收,有安全风险。
- 混合模式:既有 PUSH 也有 PULL。比如 MISP 的同步机制,你可以订阅别人的 Event,别人更新了,MISP 会自动同步给你。同时你也可以手动拉取。
在实际项目中,我推荐用 MISP 的同步机制。它支持加密传输,而且可以设置信任等级。比如你可以只同步“高可信度”的情报,避免被垃圾情报淹没。
一个小技巧:在搭建情报共享平台时,一定要考虑“去重”和“置信度”。我见过一个案例,因为没做去重,同一个 IOC 被 10 个源推送了 10 次,导致 SIEM 告警爆炸。后来我们加了一个规则:同一个 IOC,如果超过 3 个源都报告了,才认为是可信的。
最后,我想强调一点。标准只是工具,不是目的。你选择 STIX、MISP 还是 IODEF,取决于你的场景:
- 如果你要做自动化威胁狩猎,STIX/TAXII 是首选。
- 如果你要搭建团队内部的情报库,MISP 最合适。
- 如果你要跟政府 CERT 对接,IODEF 可能绕不开。
嗯,今天就聊这么多。记住,情报的价值在于共享,共享的前提是标准。没有标准,你手里的 IOC 就是一堆数字,有了标准,它们才是能杀敌的武器。