Reading vendor advisories

A security advisory tells you what was fixed. It rarely tells you what was broken. The gap between those two things, read carefully against the commit history, is often the most informative document a vendor publishes.


Vendors publish security advisories when they fix vulnerabilities. The purpose of an advisory is to communicate to users that they should update, and to give security teams enough information to assess risk. What advisories are not primarily designed to do is teach you about the vulnerability — though many do, unintentionally, if you know how to read them.

The skill of reading vendor advisories is distinct from the skill of writing them. An advisory reader wants to understand not just what was fixed but what was broken — the nature of the vulnerability, the conditions required to exploit it, the code path involved. Vendors vary enormously in how much of this they disclose. Some advisories are detailed enough to reconstruct the vulnerability. Others give you a CVE number, a CVSS score, and a version range. The latter are a starting point, not an ending point.

The CVE entry as a signpost

The CVE entry is the minimum viable disclosure: an identifier, a brief description, and a version range. The description is written to be accurate without being a tutorial. "Buffer overflow in the X parsing function" tells you the type of issue and the location. It does not tell you which buffer, what input, what the preconditions are, or what the impact is beyond the CVSS score's characterisation.

Use the CVE entry as a signpost pointing you to three things: the affected component, the version range, and the NVD references section. The references are where the useful information lives — vendor advisories, bug tracker entries, commit links, researcher disclosures. The CVE entry itself is the table of contents. The references are the document.

Cross-referencing with commits

When a vendor's code is public — as is the case for most open-source projects and an increasing number of commercial ones that publish changelogs with commit hashes — the fix commit is the most informative document in the disclosure chain. The commit shows exactly what changed: which function, which file, which lines were modified or added, and the commit message, which sometimes describes the issue in more detail than the advisory does.

Reading the fix commit tells you what the fixed code looks like. Reading the code immediately before the fix tells you what the vulnerable code looked like. The diff between them, read against your understanding of the component, tells you what the vulnerability was — often more precisely than the advisory. It also tells you whether the fix is complete: whether it addresses all code paths that exhibit the same pattern, or whether it fixes one instance while leaving related code unchanged.

Using version ranges for original research

When a vulnerability is disclosed in version X and the fix is in version Y, versions X through Y-1 are confirmed affected. Versions before X may or may not be affected — the feature may not have existed, or a different code path may have been in use. Reading through the version history for the affected component, in either direction from the vulnerable version, often reveals when the vulnerable code was introduced and whether analogous code exists in other components.

This is pre-reading for original research: the version range tells you where to look, and what you are looking for, in adjacent code that has not yet been scrutinised in the same way. Variants of fixed vulnerabilities in the same codebase are a productive research area precisely because the fix addresses the specific identified instance but cannot, by construction, address instances the fixer did not know about.

A vendor advisory is a PING returned: confirmation that something was there and has been addressed. Reading it carefully tells you the shape of the space around it — the adjacent code, the earlier versions, the related patterns. That space is where the next question lives.