A weakness that could be exploited
A vulnerability is a weakness in a system that a threatThreatSecurityA specific security threatView reference → can exploit to cause harm. The weakness sits dormant until something acts on it, which is why the security field keeps the word separate from "threat" (the thing that might exploit it) and "riskRiskComplianceA risk to the product or businessView reference →" (the weighted likelihood and impact of that happening). A vulnerability is the gap in the wall. Whether anyone walks through it is a different question.
For most of computing's history, vulnerabilities had no shared names. The same flaw might be called three different things by three vendors, so defenders could not tell whether two advisories described one problem or two. MITRE's David Mann and Steven Christey proposed a fix in a 1999 white paper at Purdue University, and the Common Vulnerabilities and Exposures list launched publicly that September with 321 entries. A CVE identifier gives each publicly known flaw one canonical name, which is the quiet infrastructure behind every patch advisory you have ever read.
Naming was the first layer; scoring and classification followed. The Common Vulnerability Scoring System (CVSS), with v2 arriving in 2007 under FIRST's stewardship, rates severity on a 0 to 10 scale from attack vector, complexity, and impact. The Common Weakness Enumeration (CWE) sits one level up, cataloguing the types of flaw (SQL injection, buffer overflow, improper authentication) so that a specific CVE can be tagged with the class of mistake that produced it.
Disclosure was the harder, more political evolution. In 2000 the researcher known as Rain Forest Puppy published the RFPolicy, which gave vendors a private window to fix a flaw before the researcher reserved the right to publish anyway. Vendors preferred coordinated disclosure, which asks researchers to wait until a fix ships. The tension between those two stances, full versus coordinated, still defines disclosure ethics today.
A penetration testPenetration TestSecurityA penetration testView reference → of a billing service finds that a user ID in a URL can be changed to read another customer's invoicesInvoiceSales & RevenueAn invoice for billingView reference →: an insecure direct object reference, classed as CWE-639. The finding scores CVSS 8.1, high, because it needsNeedUserA user need, pain, desire, or constraintView reference → only a logged-in account and exposes other customers' data. The team opens an internal ticket the moment the report lands and starts the patch window clock.
The fix is a one-line authorisation check, but the rollout takes nine days because the affected endpoint is shared by a mobile client that needs a coordinated releaseReleaseProduct SpecificationA shipped version of the productView reference →. During those nine days the vulnerability is real, scored, and known, and the team adds rate-limiting as a stopgap so any exploitation attempt is throttled and logged. Once the patch ships, the weakness closes; the CWE class stays in the team's regression testsRegression TestQuality AssuranceA regression testView reference → so the same shape of mistake gets caught next time.
In the Unified Product Graph, a vulnerability anchors the security region's weakness layer through four edges that map its whole lifecycle. A VulnerabilityaffectsServicecross-domain edge locates the flaw in the product, so its blast radius is queryable. A vulnerability_affects_serviceVulnerabilitydiscovered byPenetration Testcross-domain edge records how it surfaced, and vulnerability_discovered_by_penetration_testThreat ModelsurfacesVulnerabilityhierarchy captures the design-time path where modelling exposed it before any attacker did. An threat_model_surfaces_vulnerabilityIncidentexploitsVulnerabilitycross-domain edge connects the weakness to any breach that used it, which means a single query can answer the question every post-mortem asks: was this flaw known, and for how long, before it was used against us.incident_exploits_vulnerability
Type-specific fields on BaseNode
cve_idstringCVE identifier from the National Vulnerability Database. @example "CVE-2024-1234"
cvss_scorenumberCVSS numeric score (0.0–10.0). Computed from the CVSS vector. Distinct from the categorical `severity`. @example 9.8 (critical), 6.5 (medium), 3.7 (low)
severitystringCategorical severity derived from CVSS. `critical` = 9.0–10.0. `high` = 7.0–8.9. `medium` = 4.0–6.9. `low` = 0.1–3.9. `informational` = 0.0. Score alone is insufficient for triage; severity drives filtering and prioritisation. @example "critical" for a remotely exploitable, no-auth-required vulnerability
cvss_versionstringCVSS scoring version. v3.1 and v4.0 differ significantly for the same vulnerability. @example "v4.0" for vulnerabilities scored after the v4.0 release in 2023
affected_componentstringAffected component, library, or system. @example "lodash", "openssl", "login service"
affected_packagestringAffected package with version. More precise than `affected_component`. @example "lodash@4.17.20", "openssl@1.1.1q"
exploit_maturitystringExploit maturity. Primary prioritisation factor after severity. `no_known_exploit` = theoretical. `proof_of_concept` = exploit code exists, not weaponised. `functional_exploit` = working exploit available. `active_exploitation` = active in the wild. @example "active_exploitation" demands immediate response regardless of severity score
fix_availablebooleanPatch availability. Common triage question after severity. @example false for a zero-day with no available patch
disclosed_atstringISO date publicly disclosed. Time since disclosure matters for SLA. @example "2024-03-15"
discovered_atstringISO date discovered in this system. @example "2026-04-01"
remediated_atstringISO date resolved or accepted. Closes the remediation timeline. @example "2026-04-10"
idstringrequiredUnique identifier (UUID)
typeNodeTyperequiredDiscriminator for the entity type
titlestringrequiredDisplay name
descriptionstringOptional detailed description
statusstringLifecycle status
tagsstring[]Freeform tags for filtering
6 phases — initial: open
4 edge types connected to this entity.
threat_model_surfaces_vulnerabilityincident_exploits_vulnerabilityvulnerability_affects_servicevulnerability_discovered_by_penetration_test