A specific threat actor or attack vector
A threat is any circumstance or event with the potential to harm a system, the people who depend on it, or the data it holds. The word does real work only when it stays distinct from two words it is constantly confused with. A threat is the possible bad thing. A vulnerabilityVulnerabilitySecurityA known vulnerabilityView reference → is the weakness that lets it happen. RiskRiskComplianceA risk to the product or businessView reference → is the combination of the two, weighted by how likely and how damaging the outcomeOutcomeStrategyA desired business or user outcomeView reference → would be. Blur those three and security planning turns into a list of fears with no structure.
The modern engineering meaning of "threat" was sharpened when Microsoft tried to make security a design-time activity rather than an after-the-fact patch. On 1 April 1999, Loren Kohnfelder and Praerit Garg circulated an internal Microsoft memo, "The Threats to Our Products," which introduced STRIDE: Spoofing, Tampering, Repudiation, Information disclosure, Denial of service, and Elevation of privilege. STRIDE gave teams six named categories to interrogate a design against, so a threat became something you could enumerate at the whiteboard.
The vocabulary was later formalised through the public sector. The NIST glossary defines a threat as a circumstance or event with the potential to adversely affect operations and assets "through a system via unauthorized access, destruction, disclosure, modification of information, or denial of service." That definition deliberately separates the threat from the weakness it might exploit, which is held in the parallel vulnerability definition.
Adam Shostack carried the discipline into the mainstream with Threat Modeling: Designing for Security (2014), reframing the practice around four questions: what are we building, what can go wrong, what are we going to do about it, and did we do a good jobJobUserJob To Be Done: what the user is trying to accomplishView reference →. STRIDE turns twenty-five with its category set largely intact, which is rare for a security artefact.
A team ships a document-sharing API. During a STRIDE pass on the design, someone raises Spoofing: an attacker who guesses or replays a bearer token could impersonate a paying customer. That is a threat. It is not yet a vulnerability, because the team has not confirmed the tokens are actually guessable. They check, and find tokens are signed and short-lived, so the realistic weakness is narrower: a token leaked in a server log could be replayed inside its ten-minute window.
Now there is a concrete threat (token replay), a concrete vulnerability (tokens written to logs), and a risk the team can rank against everything else on the board. They add a detective control (alert on a token used from two distant IP addresses inside the window) and a preventive one (redact tokens at the logging layer). The threat drove the analysis; the controls answer it.
In the Unified Product Graph, a threat sits in the security region and connects through three canonical edges. A Threat ModelidentifiesThreathierarchy edge ties each threat back to the modelling exercise that surfaced it, so threats are never free-floating fears; they have provenance. A threat_model_identifies_threatThreattargetsServicecross-domain edge points the threat at the part of the product it endangers, which makes blast radius queryable. A threat_targets_serviceSecurity ControlmitigatesThreatcross-domain edge closes the loop by linking the defence to the danger it answers. That structure turns the classic threat-vulnerability-risk distinction into something a tool can walk: a threat with no mitigating control is visibly open, and a control with no threat behind it is a defence in search of a justification.security_control_mitigates_threat
Type-specific fields on BaseNode
categorystringAttack or threat scenario. @example "injection", "misconfiguration", "social engineering", "supply chain"
likelihoodobjectLikelihood (1 = theoretical, 5 = actively exploited). @example value 5 for a known, exploitable, commonly targeted pattern
impactobjectImpact (1 = minimal, 5 = catastrophic). @example value 5 for threats that expose PII or cause complete service compromise
stride_typestringSTRIDE classification. Which security property is violated. `spoofing` = identity. `tampering` = integrity. `repudiation` = non-repudiability. `info_disclosure` = confidentiality. `denial_of_service` = availability. `elevation_of_privilege` = authorisation.
threat_agentstringThreat actor or source. @example "external attacker", "malicious insider", "compromised dependency", "misconfigured service"
mitigation_statusstringMitigation status. @example "accepted" = the risk has been formally acknowledged and no action will be taken
violated_propertystringViolated security property. Maps STRIDE to the CIA+ model. @example "confidentiality" for information disclosure threats
idstringrequiredUnique identifier (UUID)
typeNodeTyperequiredDiscriminator for the entity type
titlestringrequiredDisplay name
descriptionstringOptional detailed description
statusstringLifecycle status
tagsstring[]Freeform tags for filtering
5 phases — initial: identified · template: RISK_ITEM
3 edge types connected to this entity.
threat_model_identifies_threatthreat_targets_servicesecurity_control_mitigates_threat