情报格式与标准: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 解析器,容易踩坑。

情报共享机制:从“单打独斗”到“协同作战”

标准有了,怎么共享?我把它分成三种模式:

  1. PULL 模式(拉取):你定期去情报源拉数据。比如每天凌晨从 MISP 服务器拉取最新的 Event。优点是控制权在你,缺点是实时性差。
  2. PUSH 模式(推送):情报源主动推给你。TAXII 的 Collection 就是典型。优点是实时性好,缺点是你得开端口接收,有安全风险。
  3. 混合模式:既有 PUSH 也有 PULL。比如 MISP 的同步机制,你可以订阅别人的 Event,别人更新了,MISP 会自动同步给你。同时你也可以手动拉取。

在实际项目中,我推荐用 MISP 的同步机制。它支持加密传输,而且可以设置信任等级。比如你可以只同步“高可信度”的情报,避免被垃圾情报淹没。

一个小技巧:在搭建情报共享平台时,一定要考虑“去重”和“置信度”。我见过一个案例,因为没做去重,同一个 IOC 被 10 个源推送了 10 次,导致 SIEM 告警爆炸。后来我们加了一个规则:同一个 IOC,如果超过 3 个源都报告了,才认为是可信的。

最后,我想强调一点。标准只是工具,不是目的。你选择 STIX、MISP 还是 IODEF,取决于你的场景:

  • 如果你要做自动化威胁狩猎,STIX/TAXII 是首选。
  • 如果你要搭建团队内部的情报库,MISP 最合适。
  • 如果你要跟政府 CERT 对接,IODEF 可能绕不开。

嗯,今天就聊这么多。记住,情报的价值在于共享,共享的前提是标准。没有标准,你手里的 IOC 就是一堆数字,有了标准,它们才是能杀敌的武器。