什么是STIX?
STIX【1】,Structured Threat Information Expression,结构化的威胁信息表达,是一种用于交换网络空间威胁情报的语言和序列化格式。STIX是开放源代码和免费的。
为什么你应该关心STIX
贡献和获取网络空间威胁情报变得更容易。借助STIX,可疑、攻陷和溯源的所有方面的内容都可以使用对象和描述性关系来清晰地表达。STIX信息可以直观地表示给分析人员,或者存储为JSON格式以便快速机器可读。STIX的开放性允许与现有工具和产品集成,或者用于特定分析师或网络需求。
STIX 对象
STIX对象将每条信息与要填充的特定属性进行分类。通过关系连接多个对象可以简化或复杂地表示网络空间威胁情报。以下是可以通过STIX进行表达的列表。
STIX2 定义了十二个SDO(STIX字段对象)
攻击模式,TTP(攻击方法)的一种,用于描述威胁主体尝试攻击目标的方法。
攻击活动,一组敌对的行为,描述一系列针对特定目标的恶意行为或一段时间内发动的攻击。
应对措施,用于阻止或响应攻击的措施。
身份,个人、组织或团体,以及个人、组织或团体的类别。
攻击指标,包含可用于检测可疑或恶意网络行为的模式。
入侵集合,一个拥有共同属性的敌对行为和资源的分组集合,被认为是由单个威胁主体策划的。
恶意软件,TTP(攻击方法)的一种类型,也称为恶意代码和恶意软件,用于攻陷受害者数据或系统的机密性、完整性或可用性。
可观察数据,表达在系统或网络上观察到的信息(例如,IP地址)。
报告,专注在一个或多个主题的威胁情报集合,例如,威胁主体、恶意软件或攻击技术的描述,包括上下文内容详细信息。
威胁主体,被认为恶意操作的个人、团体或组织。
工具,被威胁主体用于实施攻击的软件。
脆弱性,软件中的一个错误,可以被黑客直接利用来访问系统或网络。
STIX定义了两个SRO(STIX关系对象)
关系,用于连接两个SDO(STIX字段对象),来描述他们之间是如何与对方进行关联。
瞄准,表示网络威胁情报元素(如攻击指标、恶意软件)被看到的情况。
STIX 2.0的结构
STIX 2的对象用JSON表示,以下是STIX 2.0 的攻击活动对象基于JSON的示例:
{
"type": "campaign",
"id": "campaign--8e2e2d2b-17d4-4cbf-938f-98ee46b3cd3f",
"created": "2016-04-06T20:03:00.000Z",
"name": "Green Group Attacks Against Finance",
"description": "Campaign by Green Group against targets in the financial services sector."
}
STIX 关系示例
STIX 2.0 示例概览
以下示例演示了如何将STIX 2.0 概念用于常见用例【2】。它们可用于将多个概念连接在一起,并提供有关STIX对象和属性的更多详细信息
识别威胁主体简介
商业威胁情报提供者和资源充足的政府机构通常将恶意行为溯源到特定威胁主体或威胁主体集团【3】。
场景
在这种场景下,对一个名为“Disco 团队”的威胁主体集团使用STIX威胁主体和身份对象进行建模。Disco 团队主要使用西班牙语来运营,他们以窃取信用卡信息来获取经济利益而闻名,他们公开使用电子邮件别名“disco-team@stealthemail.com”,或者称为“Equipo del Discoteca”
数据模型
正如你所期望的那样,威胁主体识别是使用威胁主体的SDO(STIX字段对象)来表示的。可以在该对象中获取与威胁主体相关的信息,例如目标和动机。其他基本信息不是威胁主体特定的,如联系人信息,最好使用身份SDO来表示。身份对象也可以用于STIX中的威胁主体以外的其他信息。他们可以对组织、政府机构和信息来源等内容进行建模。
需要注意的是,在这种场景下,Disco 团队小组是作为一个威胁主体,而不是入侵集合。他们可能会支持入侵集合,但是这些信息是未知的。一个入侵集合最适合描述包含多个攻击活动和目的的整个攻击集合。在这种情况下,Disco 团队是一个有目的的威胁主体。
name
(名称)和labels
(属性)标签是威胁主体SDO所需的唯一必需属性。labels
字段对于描述Disco 团队是什么类型的威胁主体是至关重要的。因为Disco 团队被认为是大型的、有组织的、利益驱动的窃取财务信息的犯罪团伙,所以,他们最好被标签为crime-syndicate
(犯罪集团)。
威胁主体SDO还可以为构建更完整的威胁主体简介的可选属性进行建模。例如,aliases
(别名)字段包含此威胁主体被称为其他名称的列表。威胁主体也可能有一个或多个roles
(角色),以更多地描述他们的工作。例如,威胁主体可以赞助或指挥攻击,可以编写恶意软件或者运作恶意的基础设施。在Disco 团队案例中,他们以代理人的身份进行活动运作、发动攻击,进而窃取财务信息。
像大多数威胁主体一样,Disco团队在他们的攻击中有一个特定的目标。因此,goals
(目标)列表描述了威胁主体想要做什么。在这种情况下,Disco 团队的唯一目标就是窃取信用卡凭证。威胁主体也具有不同程度的专业知识。因此,攻击者的sophistication
级别(如果知道)可以描述攻击者的技能和知识。由于先进的攻击方法和熟练的工具或恶意代码,Disco 团队被标记为expert
(专家级)。他们组织的recource_level
字段表明他们与小规模的个人或团队相比,规模更庞大、资金更充裕。最后,威胁主体通常有一个或多个攻击背后的动机。primary_motivation
字段描述了发动攻击的主要原因。一些威胁主体可能会寻求恶名或者支配地位,而另一些威胁主体则是为了报复或者个人满足感。对于Disco 团队来说,获取财务信息的动机被归入personal-gain
动机。
威胁主体的基本身份信息可以使用身份SDO进行建模。对于Disco 团队,他们是一类organization
(组织),通过identity_class
字段进行获取。这是由于这种威胁主体更正式、更有组织性,而不是个人黑客或非正式的黑客群体。获取的另一个属性contact_information
(如果已知身份),表示任何邮件地址或电话号码。对于Disco 团队而言,已经提供了一个邮件地址。
既然Disco 团队的信息是在威胁主体和身份SDO中进行表示,则通过关系SRO将这两个对象连接在一起。在本例中,source_ref
威胁主体id
是attribute-to
到target_ref
身份id
。
下面的关系图说明了威胁主体和身份的SDO和关系SRO:
实现
JSON
{
"type": "bundle",
"id": "bundle--c9567f73-3803-415c-b06e-2b0622830e5d",
"spec_version": "2.0",
"objects": [
{
"type": "threat-actor",
"id": "threat-actor--dfaa8d77-07e2-4e28-b2c8-92e9f7b04428",
"created": "2014-11-19T23:39:03.893348Z",
"modified": "2014-11-19T23:39:03.893348Z",
"name": "Disco Team Threat Actor Group",
"description": "This organized threat actor group operates to create profit from all types of crime.",
"labels": [
"crime-syndicate"
],
"aliases": [
"Equipo del Discoteca"
],
"roles": [
"agent"
],
"goals": [
"Steal Credit Card information"
],
"sophistication": "expert",
"resource_level": "organization",
"primary_motivation": "personal-gain"
},
{
"type": "identity",
"id": "identity--733c5838-34d9-4fbf-949c-62aba761184c",
"created": "2016-08-23T18:05:49.307000Z",
"modified": "2016-08-23T18:05:49.307000Z",
"name": "Disco Team",
"description": "Disco Team is the name of an organized threat actor crime-syndicate.",
"identity_class": "organization",
"contact_information": "disco-team@stealthemail.com"
},
{
"type": "relationship",
"id": "relationship--966c5838-34d9-4fbf-949c-62aba7611837",
"created": "2016-08-23T18:05:49.307000Z",
"modified": "2016-08-23T18:05:49.307000Z",
"relationship_type": "attributed-to",
"source_ref": "threat-actor--dfaa8d77-07e2-4e28-b2c8-92e9f7b04428",
"target_ref": "identity--733c5838-34d9-4fbf-949c-62aba761184c"
}
]
}
Python 生产者
import stix2
threat_actor = stix2.ThreatActor(
id="threat-actor--dfaa8d77-07e2-4e28-b2c8-92e9f7b04428",
created="2014-11-19T23:39:03.893Z",
modified="2014-11-19T23:39:03.893Z",
name="Disco Team Threat Actor Group",
description="This organized threat actor group operates to create profit from all types of crime.",
labels=["crime-syndicate"],
aliases=["Equipo del Discoteca"],
roles=["agent"],
goals=["Steal Credit Card Information"],
sophistication="expert",
resource_level="organization",
primary_motivation="personal-gain"
)
identity = stix2.Identity(
id="identity--733c5838-34d9-4fbf-949c-62aba761184c",
created="2016-08-23T18:05:49.307Z",
modified="2016-08-23T18:05:49.307Z",
name="Disco Team",
description="Disco Team is the name of an organized threat actor crime-syndicate.",
identity_class="organisation",
contact_information="disco-team@stealthemail.com"
)
relationship = stix2.Relationship(threat_actor, 'attributed-to', identity)
bundle = stix2.Bundle(objects=[threat_actor, identity, relationship])
Python 消费者
import stix2
for obj in bundle.objects:
if obj == threat_actor:
print("------------------")
print("== THREAT ACTOR ==")
print("------------------")
print("ID: " + obj.id)
print("Created: " + str(obj.created))
print("Modified: " + str(obj.modified))
print("Name: " + obj.name)
print("Description: " + obj.description)
print("Labels: " + obj.labels[0])
print("Aliases: " + obj.aliases[0])
print("Goals: " + obj.goals[0])
print("Sophistication: " + obj.sophistication)
print("Resource Level: " + obj.resource_level)
print("Primary Motivation: " + obj.primary_motivation)
elif obj == identity:
print("------------------")
print("== IDENTITY ==")
print("------------------")
print("ID: " + obj.id)
print("Created: " + str(obj.created))
print("Modified: " + str(obj.modified))
print("Name: " + obj.name)
print("Description: " + obj.description)
print("Identity Class: " + obj.identity_class)
print("Contact Information: " + obj.contact_information)
elif obj == relationship:
print("------------------")
print("== RELATIONSHIP ==")
print("------------------")
print("ID: " + obj.id)
print("Created: " + str(obj.created))
print("Modified: " + str(obj.modified))
print("Relationship Type: " + obj.relationship_type)
print("Source Ref: " + obj.source_ref)
print("Target Ref: " + obj.target_ref)
定义攻击活动 VS. 威胁主体 VS. 入侵集合
网络攻击经常被威胁主体使用,作为针对特定目标的协同攻击活动的一部分。这些攻击活动通常有一个目标或对象。有时,这些攻击活动是由来自国家级别的、犯罪集团级别的或其他邪恶组织级别的威胁主体策划的,并且包含相似的属性、行为和性质,以便在很长一段时间内实现多个目标,整个攻击包被称为入侵集合【4】。
场景
该场景表示一种怀疑由国家“Franistan”资助的高级持续威胁(APT),攻击目标是BPP(Branistan人民党),BPP是国家Branistan的执政党之一。该入侵集合包括一系列针对BPP网站的复杂攻击活动和攻击模式。其中一项攻击活动的目的是将错误的信息插入到BPP的网页中;另一项攻击活动是针对BPP网络服务器的DDOS攻击。
数据模型
首先,使用身份SDO来对Franistan和BPP相关信息进行建模。正如其它STIX示例中提到的(如,识别威胁主体简介),该对象专门用于表示关于Franistan和BPP的共同可识别信息。场景中的身份对象最适合用来帮助使用SRO(STIX 关系对象)建立与其它对象之间的关系。例如,Franistan被归属为一个威胁主体,而BPP是入侵集合和多个攻击活动的目标。
接下来,该例子中的高级持续威胁的细节内容在入侵集合SDO中表示。这个被标记name
为APT BPP的入侵集合对象包含入侵集合尝试实现的任何动机和目标。goals
(目标)属性列表中的APT BPP的一些对象是影响Branistan选举和扰乱BPP。因此,他们的动机是相似的,他们的primary_motivation
是意识形态,他们的secondary_motivations
是控制权。另外,由于他们被高度怀疑是由Franistan提供资金和资源的资助,他们的resource_level
是government
(政府),他们的动机和和资源级别的值来自于公开词汇攻击动机和攻击资源级别。
与许多入侵集合一样,可能有多个威胁主体(见威胁主体SDO)和攻击活动。在这种场景下,有一个威胁主体简称为假BPP,其目标也是影响Branistan选举。其动机和resource_level
也同入侵集合SDO相同,因为该威胁主体已经与此APT关联,所以这是有意义的。假BPP被怀疑由Franistan提供资金资助,这意味着该威胁主体的labels
标签是nation-state
。其它相关信息可以在roles
(角色)和sophistication
(复杂度)属性中找到。在该案例中,假BPP是针对Branistan攻击的主导者,因此,其roles
(角色)字段将会标记为director
。由于他们被认为是资金充裕的先进国家级威胁主体,能够发动APT级别的攻击,假BPP的sophistication
(复杂度)级别被认为是战略级。roles
(角色)和sophistication
(复杂度)的值可以在STIX 2.0规范的开放词汇列表中的威胁主体角色和威胁主体复杂度中找到。
作为入侵集合的一部分,一些不同的攻击活动已经与威胁主体联系在一起。这些详细信息可在2个攻击活动SDO中获取。第一个攻击活动称之为Operation Bran Flakes,是由假BPP策划的,目的是黑进BPP网站www.bpp.bn,并在网页中注入虚假信息。第二个报告的攻击活动,名为Operation Raisin Bran,在第一个攻击活动之后发生,尝试对BPP网站实施洪泛攻击,以拒绝合法用户访问该网站。
除了在攻击活动对象中对攻击细节进行建模以外,攻击模式SDO还使用CAPEC来对特定攻击进行分类。在这类对象中,你可以在external_references
属性下找到对CAPEC ID的引用。例如,尝试插入虚假信息的第一个攻击活动归入external_id
CAPEC-148 或“内容欺骗”中。与拒绝服务活动相关的第二个攻击模式SDO引用为external_id
CAPEC-488或“HTTP洪泛攻击”。
现在我们已经介绍了本示例中的所有STIX字段对象,我们可以检查其中的关系或SRO(STIX关系对象)。在这种场景下,威胁主体、入侵集合和攻击活动使用攻击模式,因此创建多个SRO来表示这些关系。在所有这些关系中,source_ref
会引用威胁主体、入侵集合或攻击活动的ID,target_ref
将指向本实例中提到的任一攻击模式ID。relationship_type
属性将会简单标记为uses
。
下一个共同关系涉及到BPP的身份SDO。在该案例中,攻击活动、入侵集合和威胁主体都指向这个身份,所以target_ref
字段将包括以relationship_type
为目标的BPP的身份ID。除了这些关系外,威胁主体假BPP还与其他身份对象之间存在关系。由于假BPP与国家Franistan相关联,因此该威胁主体SDO与Franistan身份SDO通过attributed-to
的relationship_type
相关联。另外,在前面提到的另一种攻击中,假BPP试图接管真BPP的网站,并在网站发布冒充真BPP的内容,所以需要另一种关系来表示假BPP impersonates
(冒充)真BPP。
最后,还有更多关系将攻击活动、入侵集合和威胁主体联系在一起,两个攻击活动通过两个独立的attributed-to
关系关联到了入侵集合和攻击主体SDO。另外,由于入侵集合表示该攻击主体主导了整个攻击包,入侵集合SDO也通过attributed-to
关系关联到了威胁主体。
以下图表有助于在该场景中对SDO之间的关系进行可视化。下面的第一张图用来表示入侵集合、威胁主体和攻击活动对象之间的关联。
第二张图对身份对象、入侵集合、威胁主体和攻击活动SDO之间的关联关系进行建模。
最后,第三张图捕获了攻击模式SDO和入侵集合、威胁主体和攻击活动对象的关系。
实现
JSON
{
"spec_version": "2.0",
"type": "bundle",
"id": "bundle--81810123-b298-40f6-a4e7-186efcd07670",
"objects": [
{
"type": "identity",
"id": "identity--8c6af861-7b20-41ef-9b59-6344fd872a8f",
"created": "2016-08-08T15:50:10.983Z",
"modified": "2016-08-08T15:50:10.983Z",
"name": "Franistan Intelligence",
"identity_class": "organisation"
},
{
"type": "identity",
"id": "identity--ddfe7140-2ba4-48e4-b19a-df069432103b",
"created": "2016-08-08T15:50:10.983Z",
"modified": "2016-08-08T15:50:10.983Z",
"external_references": [
{
"source_name": "website",
"url": "http://www.bpp.bn"
}
],
"name": "Branistan Peoples Party",
"identity_class": "organisation"
},
{
"type": "threat-actor",
"id": "threat-actor--56f3f0db-b5d5-431c-ae56-c18f02caf500",
"created": "2016-08-08T15:50:10.983Z",
"modified": "2016-08-08T15:50:10.983Z",
"labels": [
"nation-state"
],
"roles": [
"director"
],
"goals": [
"Influence the election in Branistan"
],
"resource_level": "government",
"primary_motivation": "ideology",
"secondary_motivations": [
"dominance"
],
"name": "Fake BPP (Branistan Peoples Party)",
"sophistication": "strategic"
},
{
"type": "campaign",
"id": "campaign--e5268b6e-4931-42f1-b379-87f48eb41b1e",
"created": "2016-08-08T15:50:10.983Z",
"modified": "2016-08-08T15:50:10.983Z",
"name": "Operation Bran Flakes",
"description": "A concerted effort to insert false information into the BPP's web pages",
"aliases": [
"OBF"
],
"first_seen": "2016-01-08T12:50:40.123Z",
"objective": "Hack www.bpp.bn"
},
{
"type": "campaign",
"id": "campaign--1d8897a7-fdc2-4e59-afc9-becbe04df727",
"created": "2016-08-08T15:50:10.983Z",
"modified": "2016-08-08T15:50:10.983Z",
"name": "Operation Raisin Bran",
"description": "A DDOS campaign to flood BPP web servers",
"aliases": [
"ORB"
],
"first_seen": "2016-02-07T19:45:32.126Z",
"objective": "Flood www.bpp.bn"
},
{
"type": "intrusion-set",
"id": "intrusion-set--ed69450a-f067-4b51-9ba2-c4616b9a6713",
"created": "2016-08-08T15:50:10.983Z",
"modified": "2016-08-08T15:50:10.983Z",
"name": "APT BPP",
"description": "An advanced persistent threat that seeks to disrupt Branistan's election with multiple attacks",
"first_seen": "2016-01-08T12:50:40.123Z",
"resource_level": "government",
"primary_motivation": "ideology",
"goals": [
"Influence the Branistan election",
"Disrupt the BPP"
],
"secondary_motivations": [
"dominance"
],
"aliases": [
"Bran-teaser"
]
},
{
"type": "attack-pattern",
"id": "attack-pattern--19da6e1c-71ab-4c2f-886d-d620d09d3b5a",
"created": "2016-08-08T15:50:10.983Z",
"modified": "2017-01-30T21:15:04.127Z",
"external_references": [
{
"external_id": "CAPEC-148",
"source_name": "capec"
}
],
"name": "Content Spoofing"
},
{
"type": "attack-pattern",
"id": "attack-pattern--f6050ea6-a9a3-4524-93ed-c27858d6cb3c",
"created": "2016-08-08T15:50:10.983Z",
"modified": "2017-01-30T21:15:04.127Z",
"external_references": [
{
"external_id": "CAPEC-488",
"source_name": "capec"
}
],
"name": "HTTP Flood"
},
{
"type": "relationship",
"id": "relationship--3dcf59c3-30e3-4aa5-9c05-2cbffcee5922",
"created": "2016-08-08T15:50:10.983Z",
"modified": "2016-08-08T15:50:10.983Z",
"relationship_type": "attributed-to",
"source_ref": "campaign--e5268b6e-4931-42f1-b379-87f48eb41b1e",
"target_ref": "threat-actor--56f3f0db-b5d5-431c-ae56-c18f02caf500"
},
{
"type": "relationship",
"id": "relationship--45cd8846-fec5-4e64-8271-3d807dc4ea3b",
"created": "2016-08-08T15:50:10.983Z",
"modified": "2016-08-08T15:50:10.983Z",
"relationship_type": "attributed-to",
"source_ref": "campaign--1d8897a7-fdc2-4e59-afc9-becbe04df727",
"target_ref": "threat-actor--56f3f0db-b5d5-431c-ae56-c18f02caf500"
},
{
"type": "relationship",
"id": "relationship--9b35d9a0-87ae-4800-88fc-f1fc63246c18",
"created": "2016-08-08T15:50:10.983Z",
"modified": "2016-08-08T15:50:10.983Z",
"relationship_type": "attributed-to",
"source_ref": "campaign--e5268b6e-4931-42f1-b379-87f48eb41b1e",
"target_ref": "intrusion-set--ed69450a-f067-4b51-9ba2-c4616b9a6713"
},
{
"type": "relationship",
"id": "relationship--50896dfd-d12f-4376-8b47-26ca4155ed52",
"created": "2016-08-08T15:50:10.983Z",
"modified": "2016-08-08T15:50:10.983Z",
"relationship_type": "attributed-to",
"source_ref": "campaign--1d8897a7-fdc2-4e59-afc9-becbe04df727",
"target_ref": "intrusion-set--ed69450a-f067-4b51-9ba2-c4616b9a6713"
},
{
"type": "relationship",
"id": "relationship--8bd69586-33a6-4dab-99b1-e5728cc3dcd8",
"created": "2016-08-08T15:50:10.983Z",
"modified": "2016-08-08T15:50:10.983Z",
"relationship_type": "attributed-to",
"source_ref": "intrusion-set--ed69450a-f067-4b51-9ba2-c4616b9a6713",
"target_ref": "threat-actor--56f3f0db-b5d5-431c-ae56-c18f02caf500"
},
{
"type": "relationship",
"id": "relationship--11290b55-63e2-40f7-be78-7c32a8c08e68",
"created": "2016-08-08T15:50:10.983Z",
"modified": "2016-08-08T15:50:10.983Z",
"relationship_type": "targets",
"source_ref": "intrusion-set--ed69450a-f067-4b51-9ba2-c4616b9a6713",
"target_ref": "identity--ddfe7140-2ba4-48e4-b19a-df069432103b"
},
{
"type": "relationship",
"id": "relationship--af2a647c-c215-4dc1-af29-19b4aab94f96",
"created": "2016-08-08T15:50:10.983Z",
"modified": "2016-08-08T15:50:10