Mapped every skill to NIST CSF 2.0 subcategory IDs (GV/ID/PR/DE/RS/RC functions)
based on subdomain and content analysis. Restores 11 skills corrupted during
prior rebase, re-enriching with ATLAS, D3FEND, NIST AI RMF, and CSF 2.0 fields.
All 754 skills now carry structured mappings for all 5 security frameworks:
- MITRE ATT&CK (in tags)
- MITRE ATLAS v5.5 (atlas_techniques)
- MITRE D3FEND v1.3 (d3fend_techniques)
- NIST AI RMF 1.0 (nist_ai_rmf)
- NIST CSF 2.0 (nist_csf)
Indicator lifecycle management tracks IOCs from initial discovery through validation, enrichment, deployment, monitoring, and eventual retirement. This skill covers implementing systematic processes f
cybersecurity
threat-intelligence
threat-intelligence
cti
ioc
mitre-attack
stix
indicator-lifecycle
ioc-management
1.0
mahipal
Apache-2.0
ID.RA-01
ID.RA-05
DE.CM-01
DE.AE-02
Performing Indicator Lifecycle Management
Overview
Indicator lifecycle management tracks IOCs from initial discovery through validation, enrichment, deployment, monitoring, and eventual retirement. This skill covers implementing systematic processes for IOC quality assessment, aging policies, confidence scoring decay, false positive tracking, hit-rate monitoring, and automated expiration to maintain a high-quality, actionable indicator database that minimizes analyst fatigue and maximizes detection efficacy.
When to Use
When conducting security assessments that involve performing indicator lifecycle management
When following incident response procedures for related security events
When performing scheduled security testing or auditing activities
When validating security controls through hands-on testing
Prerequisites
Python 3.9+ with pymisp, requests, stix2 libraries
MISP or OpenCTI instance for indicator storage
SIEM with IOC watchlist capabilities (Splunk, Elastic)
Understanding of IOC types, confidence scoring, and TLP classifications
Key Concepts
Indicator Lifecycle Phases
Discovery: IOC first identified from threat intelligence, malware analysis, or incident response
Validation: IOC verified against enrichment sources (VirusTotal, Shodan)
Enrichment: Additional context added (WHOIS, passive DNS, threat actor attribution)
Deployment: IOC pushed to detection systems (SIEM, IDS, firewall)
Monitoring: Track hit rates, false positive rates, detection efficacy
Review: Periodic assessment of IOC relevance and accuracy
Retirement: IOC expired or removed based on aging policy
Confidence Decay
Indicator confidence decreases over time as adversaries rotate infrastructure. A time-based decay function reduces confidence scores automatically, ensuring old indicators do not generate excessive alerts. Typical half-life: IP addresses (30 days), domains (90 days), file hashes (365 days).
Quality Metrics
Hit Rate: Percentage of deployed IOCs generating true positive alerts
False Positive Rate: Percentage of IOC alerts that are benign
Coverage: Percentage of known threat techniques with IOC coverage
Freshness: Average age of active indicators in the database
Workflow
Step 1: Implement IOC Lifecycle State Machine
fromdatetimeimportdatetime,timedeltafromenumimportEnumclassIOCState(Enum):DISCOVERED="discovered"VALIDATED="validated"ENRICHED="enriched"DEPLOYED="deployed"MONITORING="monitoring"UNDER_REVIEW="under_review"RETIRED="retired"classIOCLifecycle:def__init__(self,ioc_type,value,source,initial_confidence=50):self.ioc_type=ioc_typeself.value=valueself.source=sourceself.confidence=initial_confidenceself.state=IOCState.DISCOVEREDself.created=datetime.utcnow()self.last_updated=datetime.utcnow()self.last_seen=Noneself.hit_count=0self.false_positive_count=0self.history=[{"state":"discovered","timestamp":self.created.isoformat()}]deftransition(self,new_state:IOCState,reason=""):self.state=new_stateself.last_updated=datetime.utcnow()self.history.append({"state":new_state.value,"timestamp":self.last_updated.isoformat(),"reason":reason,})defapply_decay(self):"""Apply confidence decay based on IOC type half-life."""half_lives={"ip":30,"domain":90,"hash":365,"url":60}half_life=half_lives.get(self.ioc_type,90)age_days=(datetime.utcnow()-self.created).daysdecay_factor=0.5**(age_days/half_life)self.confidence=max(0,int(self.confidence*decay_factor))defrecord_hit(self,is_true_positive=True):self.hit_count+=1self.last_seen=datetime.utcnow()ifnotis_true_positive:self.false_positive_count+=1ifself.false_positive_count>3:self.transition(IOCState.UNDER_REVIEW,"Excessive false positives")defshould_retire(self):max_ages={"ip":90,"domain":180,"hash":730,"url":120}max_age=max_ages.get(self.ioc_type,180)age_days=(datetime.utcnow()-self.created).daysreturnage_days>max_ageandself.hit_count==0
Validation Criteria
IOC lifecycle state machine transitions correctly between phases
Confidence decay reduces scores based on IOC type half-life
Hit rate and false positive tracking functional
Aging policy automatically flags indicators for review/retirement
Quality metrics dashboard shows IOC database health