STIX 2.1 is a structured way to model threat intelligence. Each piece of intelligence becomes a STIX object, and you connect those objects using relationships to explain how adversaries operate and how evidence fits together.

If you’re new to STIX, don’t worry—you don’t need to read the 50+ page spec to get started. This post gives you a practical, visual way to think about STIX so you can start building your first threat intelligence models today.


Examples of what is possible

Before we break down the parts, here’s what a real STIX “story” looks like when you connect threat intelligence properly. By the end of this post, you’ll be able to build graphs like these.

Mandiant: APT1

Source.

FireEye: Poison Ivy

Source.


The 5 object families (in plain English)

Everything in STIX 2.1 is made from just five families of objects. Once you understand these, you can model anything in cyber threat intel.

1. SDOs — STIX Domain Objects (the what and who)

SDOs describe concepts in threat intelligence — things you’d talk about in a report.

Examples:

Object Type Example Meaning
threat-actor APT29 A known adversary
malware Cobalt Strike A malware/tool
campaign SolarWinds breach Linked activity over time
infrastructure Phishing server Resources used by an actor
vulnerability CVE-2024-12345 A weakness being exploited

Use SDOs to describe entities and behaviors in your analysis.

2. SCOs — STIX Cyber-observable Objects (the evidence)

SCOs are digital fingerprints collected from logs, sensors, and telemetry.

Examples:

Object Type Example Meaning
ipv4-addr 185.199.110.153 An IP observed
domain-name evil-update.biz Suspicious domain
file SHA256 hash File on disk
url http://bad.site/payload.exe Malicious link

Think of SCOs as raw evidence. They don’t tell you who or why — only what was seen.

3. SROs — STIX Relationship Objects (the connections)

SROs are what turn isolated objects into intelligence by describing how things relate.

They connect SDOs to SDOs, SDOs to SCOs, and sometimes SCOs to SCOs.

Examples:

Source Object (from) Relationship Type Target Object (to) Meaning
threat-actor uses malware APT29 uses Cobalt Strike
campaign attributed-to threat-actor Operation Aurora linked to APT17
malware communicates-with ipv4-addr Malware beaconing to 45.77.89.10
indicator indicates malware Hash detected → suggests malware infection
threat-actor targets identity Actor targets a bank or company
tool drops file Tool leaves behind a payload
vulnerability exploited-by malware Log4Shell exploited by botnet
infrastructure hosts domain-name C2 server hosts malicious domain
file (SCO) drops file (SCO) A file extracts another file

4. SMOs — STIX Meta Objects (the supporting layer)

SMOs don’t describe threats — they describe the data itself (like who created it, how it’s shared, or how it’s structured).

Examples:

SMO Type Purpose
marking-definition Add TLP (sharing rules)
extension-definition Add custom fields
language-content Translate content

If you need to mark, extend, or annotate objects — SMOs are how.

5. SBO — STIX Bundle Objects (the container)

Once all objects and relationships are assembled, they are grouped into a Bundle — a STIX container designed for sharing, storing, and exchanging threat intelligence.

A STIX Bundle:

  • Has no meaning on its own — it’s just a transport wrapper
  • Contains all SDOs, SCOs, SROs, and SMOs linked together
  • Can be visualized or parsed by TI platforms (like OpenCTI, MISP, ATT&CK Navigator, etc.)

That’s exactly what you saw earlier with the APT1 graph — it’s simply a Bundle rendered as a graph.


Building a STIX intelligence model step by step (real-world example)

Let’s walk through a simple but realistic threat intelligence scenario and model it using STIX the right way.

Scenario: During an investigation, you detect a new malware sample communicating with a suspicious IP. Further research links it to a known threat actor.

Step 1: Start with what you discovered (SCO)

The first thing you usually find in an investigation is technical evidence. That means SCOs.

Object Type Example Value Why it’s an SCO
file SHA256 hash of a malware sample Observable fact
ipv4-addr 45.77.23.10 Observable fact
url hxxp://update-check[.]biz/payload.exe Observable fact

At this point, you’re just collecting evidence, not making judgments.

Step 2: Identify what it is (SDO)

Next, you identify this as malware. Now it becomes intelligence, so you create an SDO.

Object Type Example Why
malware “FrostByte” You’ve classified the behavior
indicator pattern for hash/IP To help detect it again

Now your STIX model begins to explain meaning, not just record artifacts.

Step 3: Add relationships (SRO)

Now link what you know using relationships (SROs).

Relationship type Source → Target Meaning
communicates-with malware → ipv4-addr Malware calls home to this IP
downloads malware → url Malware retrieved from URL
based-on indicator → file Detection comes from malware hash

This is where raw data becomes connected intelligence.

Relationship types come from STIX guidance

The STIX spec recommends common relationships so producers use consistent language. For example, the Attack Pattern SDO can use relationships like:

Source (SDO) Relationship type Target (SDO)
attack-pattern delivers malware
attack-pattern targets vulnerability

These are guidelines — you can still create your own relationship types if needed. When in doubt, use a generic relationship type:

Generic type Use case
related-to When unsure of exact relationship
duplicate-of Same object appears twice
derived-from One object was created from another

Embedded relationships vs SROs

Some relationships are built inside objects using properties like _ref or _refs. These are called embedded relationships.

Example: Every SDO has a created_by_ref, which points to an Identity SDO. You don’t need a separate SRO for that — it’s built into the object.

Type of link Example STIX field When used
Embedded relationship created_by_ref Always applies, defined by the spec
SRO relationship uses, targets, etc. Analyst-defined connections

Rule of thumb:

  • Use embedded relationships when defined by the spec.
  • Use SROs to express analyst insights.

Sighting relationships (special SRO)

Sighting objects express that someone actually saw something malicious.

Property Meaning
sighting_of_ref What was seen (e.g. malware, threat-actor)
where_sighted_refs Who saw it (e.g. company, sensor source)
observed_data_refs Evidence behind the sighting
first_seen / last_seen When it was seen

Sightings are what turn theory into field intelligence.

Step 4: Enrich context (more SDOs)

You dig deeper and discover this malware is being used by a known threat actor in phishing campaigns.

Object Type Example Purpose
threat-actor “ArcticFox” Attribution
campaign “Winter Wolf” TTP grouping
infrastructure VPS server hosting malware Attack staging

Now your model explains who, how, and why, not just what.

Step 5: Add metadata (SMOs)

Before sharing, you mark and document your intelligence using SMOs.

SMO Type Example
marking-definition TLP:AMBER

Marking Definition objects are a good example of how embedded relationships work. SDOs contain an object_marking_refs property, which can include a TLP Marking Definition object.

Step 6: Package everything (SBO)

Your final product is a STIX Bundle that includes:

  • SDOs (malware, threat actor, campaign)
  • SCOs (IP, file hash, URL)
  • SROs (relationships)
  • SMOs (TLP markings)

This is now shareable threat intelligence.


Where to go from here

If you’ve made it this far — well done. You now understand:

  • The five STIX object families
  • The difference between evidence (SCO) and intelligence (SDO)
  • How to connect objects with relationships (SRO)
  • How to add metadata and control sharing with SMOs
  • How to package intel inside a Bundle (SBO)

This is enough to read and understand any STIX dataset you come across — and more importantly, you now have the mental model to start producing your own STIX intelligence.

But this is just the foundation. In the next posts, we’ll go deeper into the parts that matter in real workflows:

  • Generate STIX with Python
  • Store and query STIX using memory, local storage, and databases
  • Extend STIX cleanly with custom objects and fields
  • Build real-world intel models using reusable templates and patterns

Stixify

Your automated threat intelligence analyst. Extract machine readable STIX 2.1 data ready for use with your security stack.

Stixify. Your automated threat intelligence analyst.

Discuss this post

Head on over to the dogesec community to discuss this post.

dogesec community

Posted by:

David Greenwood

David Greenwood, Do Only Good Everyday



Never miss an update


Sign up to receive new articles in your inbox as they published.

Your subscription could not be saved. Please try again.
Your subscription has been successful.