STIX 2.1 as the Foundation
Why STIX was chosen and how it shapes the architecture
The decision to build the ATT&CK Data Model on STIX 2.1 as a foundation was neither obvious nor simple. This explanation explores why STIX was chosen, what alternatives were considered, and how this foundational choice shapes every aspect of the library's architecture.
The Standards Decision
What is STIX 2.1?
STIX (Structured Threat Information eXpression) 2.1 is an OASIS standard for representing cyber threat information in a structured, machine-readable format. It provides:
- Standardized object types for representing threats, indicators, campaigns, and relationships
- JSON-based format that is both human-readable and machine-parsable
- Relationship modeling through explicit relationship objects
- Extensibility mechanisms for custom properties and object types
- Version management and object lifecycle handling
Why STIX for ATT&CK?
MITRE chose STIX 2.1 as the distribution format for ATT&CK data for several strategic reasons:
Industry Standardization
Rationale: Using an industry standard ensures long-term viability and interoperability.
Benefits:
- ATT&CK data can be consumed by existing STIX-compliant tools
- Organizations can integrate ATT&CK into broader threat intelligence workflows
- No vendor lock-in - data remains in a standard, open format
- Skills transfer between ATT&CK and other STIX-based systems
Rich Relationship Modeling
Rationale: ATT&CK's value comes from relationships between objects (techniques, tactics, groups, etc.).
STIX provides:
- Explicit relationship objects with typed connections
- Bidirectional relationship navigation capabilities
- Complex relationship patterns (many-to-many, hierarchical, etc.)
- Metadata on relationships (confidence, timestamps, descriptions)
Extensibility Without Breaking Standards
Rationale: ATT&CK needs custom properties while remaining standards-compliant.
STIX enables:
- Custom properties with
x_
prefix namespace - Custom object types with standard STIX structure
- Extension points that don't break parsers
- Clear separation between standard and custom elements
Architectural Implications
The choice of STIX 2.1 as the foundation has profound implications for how the ATT&CK Data Model is architected:
Object Identity and References
STIX ID Structure
Every ATT&CK object has a STIX ID with the format {type}--{uuid}
:
// STIX IDs are the primary identifiers
"id": "attack-pattern--0042a9f5-f053-4769-b3ef-9ad018dfa298"
"id": "x-mitre-tactic--78b23412-0651-46d7-a540-170a1ce8bd5a"
"id": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7"
Architectural Impact:
- All object lookups must handle UUID-based identifiers
- Cross-references use STIX IDs, not human-readable names
- Database storage and indexing must accommodate UUID primary keys
ATT&CK IDs as External References
Human-readable ATT&CK IDs (T1055, G0006, etc.) are stored as external references, not primary identifiers:
{
"id": "attack-pattern--0042a9f5-f053-4769-b3ef-9ad018dfa298",
"external_references": [
{
"source_name": "mitre-attack",
"external_id": "T1055",
"url": "https://attack.mitre.org/techniques/T1055"
}
]
}
Architectural Impact:
- ATT&CK ID lookups require searching external references
- Validation must ensure first external reference contains ATT&CK ID
- APIs must provide both STIX ID and ATT&CK ID access patterns
Relationship Architecture
Explicit Relationship Objects
STIX models relationships as separate objects, not embedded references:
// ❌ Not STIX - embedded reference
{
"type": "attack-pattern",
"tactics": ["TA0001", "TA0002"]
}
// ✅ STIX - explicit relationship
{
"type": "relationship",
"relationship_type": "uses",
"source_ref": "attack-pattern--12345...",
"target_ref": "x-mitre-tactic--67890..."
}
Architectural Impact:
- Relationship navigation requires separate relationship processing
- Memory overhead for maintaining relationship indexes
- Complex queries need to traverse multiple object types
- Relationship metadata (descriptions, confidence) naturally supported
Bidirectional Relationship Handling
STIX relationships are directional, but ATT&CK concepts often need bidirectional navigation:
// Forward: technique → tactics
const tactics = technique.getTactics();
// Reverse: tactic → techniques (derived from relationships)
const techniques = tactic.getTechniques();
Architectural Impact:
- Relationship indexes must support both forward and reverse lookups
- Implementation classes abstract bidirectional complexity
- Memory usage includes reverse relationship mappings
Validation Architecture
Schema Compliance Layers
STIX compliance creates multiple validation layers:
- STIX Base Compliance: All objects must be valid STIX objects
- ATT&CK Extensions: ATT&CK-specific properties must be valid
- ATT&CK Business Rules: Domain-specific validation (e.g., ATT&CK ID formats)
// Validation hierarchy
const techniqueSchema = stixDomainObjectSchema // STIX base
.extend(attackBaseObjectSchema.shape) // ATT&CK extensions
.extend(attackPatternSchema.shape) // Technique-specific
.superRefine(attackIdRefinement) // ATT&CK business rules
.superRefine(tacticRefinement); // Cross-object validation
Architectural Impact:
- Complex validation chains with multiple failure points
- Error messages must map from schema violations to user-understandable problems
- Extension points must maintain STIX compliance
Custom Property Naming
STIX requires custom properties to use namespace prefixes:
{
"type": "attack-pattern",
"name": "Process Injection", // Standard STIX
"x_mitre_platforms": ["Windows"], // ATT&CK custom
"x_mitre_is_subtechnique": false, // ATT&CK custom
"x_custom_confidence": 85 // User custom
}
Architectural Impact:
- Naming conventions must be enforced in validation
- TypeScript types must accommodate x_ prefixed properties
- Schema extensions require careful namespace management
Benefits of STIX Foundation
Interoperability Advantages
Ecosystem Integration
Because ATT&CK data is valid STIX, it integrates naturally with:
- Threat Intelligence Platforms (MISP, OpenCTI, ThreatConnect)
- Security Orchestration platforms with STIX support
- Government systems that mandate STIX compliance
- Analyst tools that consume STIX feeds
Toolchain Compatibility
STIX compliance enables:
// ATT&CK data can be processed by generic STIX tools
import { STIXParser } from 'stix-parser';
import { registerDataSource } from '@mitre-attack/attack-data-model';
// Both approaches work with the same data
const genericParser = new STIXParser();
const stixObjects = genericParser.parse(attackBundle);
const attackSource = new DataSource({ source: 'file', file: 'attack.json' });
const attackModel = loadDataModel(await registerDataSource(attackSource));
Long-term Sustainability
Standards Evolution
STIX provides a migration path for future evolution:
- STIX 2.2+: Upgrading STIX versions brings new capabilities
- Backward compatibility: STIX versioning preserves older data
- Community development: STIX improvements benefit ATT&CK automatically
Vendor Independence
STIX ensures no single vendor controls the data format:
- Open standard: OASIS governance prevents vendor lock-in
- Multiple implementations: Many parsers and tools available
- Specification stability: Changes go through formal standardization process
Costs of STIX Foundation
Complexity Overhead
Learning Curve
STIX introduces concepts that may be unfamiliar:
- UUID-based identifiers instead of human-readable names
- Relationship objects instead of embedded references
- External references for human-readable identifiers
- Custom property conventions for extensions
Implementation Complexity
STIX compliance requires more sophisticated implementation:
// Simple approach - direct property access
const tacticName = technique.tactic; // ❌ Not how STIX works
// STIX approach - relationship traversal
const tactics = technique.getTactics(); // ✅ Follows STIX patterns
const tacticNames = tactics.map(t => t.name);
Performance Implications
Memory Overhead
STIX's explicit relationship modeling increases memory usage:
- Separate relationship objects consume additional memory
- Relationship indexes for navigation speed
- UUID storage instead of smaller integer IDs
Processing Complexity
STIX relationship traversal is more complex:
// Direct approach - O(1) property access
const platforms = technique.platforms;
// STIX approach - O(n) relationship lookup
const relationships = bundle.objects.filter(obj =>
obj.type === 'relationship' &&
obj.source_ref === technique.id &&
obj.relationship_type === 'targets'
);
Mitigation: The library pre-processes relationships into indexes to restore O(1) lookup performance.
Alternative Approaches Considered
Custom JSON Format
Approach: Design a custom, ATT&CK-optimized JSON structure.
Advantages:
- Simpler structure tailored to ATT&CK use cases
- Better performance through optimized layout
- No STIX complexity overhead
Disadvantages:
- No interoperability with existing tools
- Requires custom parsers for every integration
- No standards body governance
- Limited extension mechanisms
Why rejected: Isolation from broader threat intelligence ecosystem outweighed performance benefits.
GraphQL Schema
Approach: Use GraphQL to define ATT&CK data structure and relationships.
Advantages:
- Modern API technology with excellent tooling
- Built-in relationship traversal
- Type system with validation
- Query optimization capabilities
Disadvantages:
- Requires GraphQL server infrastructure
- Less suitable for static data distribution
- No existing threat intelligence ecosystem integration
- Over-engineering for data model use case
Why rejected: Added infrastructure requirements without clear benefits over STIX.
Relational Database Schema
Approach: Define ATT&CK as relational database tables with foreign keys.
Advantages:
- Mature technology with extensive tooling
- Excellent query capabilities through SQL
- Strong consistency guarantees
- Well-understood by most developers
Disadvantages:
- Requires database infrastructure for simple data access
- Poor fit for distributed, document-oriented data
- Limited extension mechanisms
- No standard for threat intelligence interchange
Why rejected: Infrastructure requirements too heavy for a data modeling library.
Living with STIX Decisions
Embracing STIX Patterns
Rather than fighting STIX complexity, the library embraces STIX patterns while abstracting complexity:
Implementation Classes Hide Complexity
// STIX relationship traversal is complex...
const tacticRelationships = bundle.objects.filter(obj =>
obj.type === 'relationship' &&
obj.source_ref === technique.id &&
obj.relationship_type === 'uses' &&
bundle.objects.find(target =>
target.id === obj.target_ref &&
target.type === 'x-mitre-tactic'
)
);
// ...but implementation classes make it simple
const tactics = technique.getTactics();
Validation Abstracts STIX Requirements
// Users don't need to understand STIX validation rules...
const isValid = techniqueSchema.safeParse(data).success;
// ...the schema handles STIX compliance automatically
Working with STIX Strengths
The library leverages STIX strengths while mitigating weaknesses:
Relationship Richness
STIX's explicit relationships enable rich metadata:
// Relationship objects can carry additional context
const relationship = bundle.objects.find(obj =>
obj.type === 'relationship' &&
obj.relationship_type === 'uses' &&
obj.source_ref === group.id &&
obj.target_ref === technique.id
);
// Access procedure descriptions from relationship
const procedureDescription = relationship.description;
Extension Mechanisms
STIX custom properties enable organization-specific additions:
// Extend techniques with custom intelligence
const extendedTechniqueSchema = techniqueSchema.extend({
x_org_threat_level: z.enum(['low', 'medium', 'high']),
x_org_last_observed: z.string().datetime()
});
Future Evolution
STIX Standards Development
The library's STIX foundation positions it for future standards evolution:
- STIX 2.2: New relationship types and object properties
- STIX Extensions: Formal extension mechanisms beyond custom properties
- Performance Improvements: Standards-level optimizations for large datasets
ATT&CK Specification Evolution
STIX provides a stable foundation as ATT&CK specifications evolve:
- New Object Types: STIX patterns accommodate new ATT&CK concepts
- Relationship Types: New relationship semantics fit STIX relationship model
- Version Management: STIX versioning handles ATT&CK specification updates