The Mistake: A development team conducts a comprehensive STRIDE analysis before launching their IoT smart camera product. They document 45 threats, implement mitigations for the top 15, and consider threat modeling “complete.” Two years later, the product is compromised via a vulnerability that didn’t exist at launch.
What Went Wrong:
Original Threat Model (2022):
- System: Smart camera with RTSP streaming over local network
- Assumption: “Device will only be used on home networks behind NAT firewall”
- Threat: “Internet exposure” scored as LOW (DREAD 3.0) because “users won’t port-forward”
Reality (2024):
- New feature added: Cloud recording service
- Required change: Camera now accepts inbound connections from cloud service
- Result: Cameras are now internet-accessible via cloud relay
- Threat model was never updated
Vulnerability: Cloud relay had authentication bypass bug (CVE-2024-XXXX). Attackers scanned for exposed cloud relay endpoints, bypassed auth, accessed camera feeds for 50,000+ devices.
Root Cause: The original threat model’s assumption (“local network only”) became invalid when cloud features were added, but no one updated the threat model.
The Correct Approach: Living Threat Models
Threat modeling is not a one-time activity. It must evolve with the system.
Triggers for Threat Model Updates:
| New Feature |
Re-run STRIDE for new components |
Cloud integration added → analyze cloud API threats |
| Architecture Change |
Re-evaluate trust boundaries |
Switched from local processing to cloud AI → new data flows |
| Dependency Update |
Check for new CVEs |
OpenSSL update patches Heartbleed → remove “encryption broken” threat |
| New Attack Discovered (in wild) |
Add to threat model |
Zero-day found in similar product → check if we’re vulnerable |
| Regulatory Change |
Add compliance threats |
GDPR enacted → add “unlawful data processing” to LINDDUN analysis |
| Deployment Context Change |
Re-score DREAD |
Device now used in hospitals → increase impact scores for availability threats |
| Yearly Review |
Full STRIDE re-run |
Annual security review → identify assumption drift |
Threat Model Versioning Example:
v1.0 (2022-01-15): Initial product launch - 45 threats identified - 15 mitigated, 12 accepted risk, 18 deferred
v1.1 (2022-06-20): Mobile app added - 8 new mobile-specific threats (app reverse engineering, credential storage) - 6 mitigated, 2 accepted
v2.0 (2023-03-10): Cloud recording feature - 15 new cloud threats (API authentication, data residency, service availability) - Re-scored existing “internet exposure” threat: 3.0 → 8.5 (now CRITICAL) - 12 mitigated, 3 accepted
v2.1 (2023-11-05): Log4Shell vulnerability discovered (CVE-2021-44228) - Checked: Camera uses Log4j in cloud service - Added “Log4Shell exploitation” threat (DREAD 9.5) - Patched within 48 hours, removed from threat model
v3.0 (2024-01-15): Annual review - 3 previously-accepted risks re-evaluated (now higher priority due to deployment scale increase) - 2 mitigations found inadequate (firmware signature check bypassed by researcher) - 5 threats removed (deprecated features no longer in product)
Threat Model Maintenance Checklist:
Metrics to Track:
| Threat model version |
Updated per checklist |
v3.2 (last updated 45 days ago) |
| Open threats (unmitigated) |
<10 CRITICAL, <30 HIGH |
2 CRITICAL, 18 HIGH |
| Average threat age |
<90 days |
62 days (healthy) |
| Mitigated threats |
>80% of CRITICAL/HIGH |
95% CRITICAL, 75% HIGH |
| Threat model coverage |
100% of components |
92% (new Zigbee module not yet analyzed) |
Key Takeaway: A threat model is a living document, not a one-time deliverable. Systems evolve, attacks evolve, and threat models must evolve with them. Schedule regular reviews and trigger updates on every significant change. A 2-year-old threat model is essentially fiction.