An Artifact Isn't
The Same As A Behavior.
Indicators of compromise and indicators of attack answer different questions: what was left behind, versus what is being done. Indicator types, confidence and sharing conventions, the IOC lifecycle, and why an IOC-only detection program ages out fast. For the models this pairs with, see Attack Lifecycle & Adversary Models (Pyramid of Pain, Diamond Model) and Threat Intel Cycles (CTI Lifecycle).
IOC vs IOA
Two different questions about the same intrusion, and two very different shelf lives.
What Each One Actually Answers
IOC — Indicator of Compromise A static artifact left behind by something that already happened ├── A file hash, an IP, a domain, a registry key, a filename └── Answers "did this specific known-bad thing touch my environment" // cheap to check against, but trivial for an attacker to change: recompile the binary, rotate the IP IOA — Indicator of Attack A behavior or sequence of actions that indicates intent, independent of the specific tool used ├── A process spawning a shell, credential dumping behavior, a discovery command sequence └── Answers "is something happening right now that looks like an attack" // harder to build detection for, but survives an attacker changing their tools entirely Why both matter IOC gives you fast, cheap, high-confidence matches against things already known to be bad IOA gives you resilience against variants and unknowns the IOC list has never seen // this split is exactly what the Pyramid of Pain is describing: the higher up the pyramid, the more it hurts the attacker to change
IOC Types
Ranked roughly by how fast each type decays once an attacker knows it's been burned.
File Hash
IP Address
Domain
URL / URI Path
Filename / File Path
Registry Key / Value
IOA Patterns
Behavioral shapes that hold up even when every IOC associated with the campaign changes overnight.
Process Lineage Anomalies
Discovery Command Sequences
Credential Access Behavior
Living-Off-The-Land Patterns
Confidence & Sharing
An indicator without a confidence rating and a handling label isn't ready to act on. Full breakdown lives on its own page.
Admiralty Code & TLP
IOC Lifecycle
An indicator's usefulness is time-bound. Treating a feed as permanent is how blocklists turn into noise.
Collection Through Expiration
1. Collection Pulled from a feed, an incident, a sandbox run, or a partner share // provenance matters: record where every indicator came from, not just what it is 2. Validation Confirm the indicator is actually malicious and not a shared/CDN resource, sinkholed domain, or research artifact before it ever reaches a blocklist 3. Enrichment Add context: campaign, malware family, first/last seen, related indicators └── An IOC actioned without enrichment is how legitimate infrastructure gets blocked by mistake 4. Actioning Push to detection (SIEM correlation, EDR watchlist) or prevention (firewall, proxy, DNS sinkhole) 5. Aging Out Retire the indicator once it's stale // a hash for malware that's been recompiled, or an IP an attacker has abandoned, is dead weight that only adds false-positive risk from that point on
Common Pitfalls
The mistakes that make an indicator program noisy or blind, not the indicators themselves.