What is Go's vulnerability database at vuln.go.dev, and what does a GO-2024-1234 entry add over a CVE record?
answer
- Go has its own advisory database
- Ids look like GO-YYYY-NNNN
- It records more than a version range
- Packages, and functions inside them
- Aliases point back to CVE ids
basics
~20 sGo's vulnerability database at vuln.go.dev is a curated feed of advisories for Go modules and the standard library. Each GO-YYYY-NNNN entry names the affected module, its packages and the exported symbols inside them, the fixed version, and any CVE alias.
solid answer
~50 sThe Go vulnerability database is published at `vuln.go.dev` and browsable at `pkg.go.dev/vuln`; it is curated by the Go security team from public advisory feeds, direct reports by module maintainers, and the Go project's own release announcements. Every entry gets an id of the form `GO-YYYY-NNNN`. What it adds over a plain CVE record is Go-specific precision: the exact module path, the affected version ranges in Go module semantics with the version that fixed it, the affected packages, and the list of **exported symbols** in each package that carry the bug. Standard-library issues appear under the pseudo-module `stdlib`. That symbol list is what makes reachability analysis possible at all - tooling can ask whether your code calls one of those functions, not merely whether you require the module. Entries also list aliases, so a CVE handed to you maps onto a GO id.
go deeper
Be ready to say where Go advisories live, what a GO-YYYY-NNNN id is, and that an entry names the affected module, packages and functions plus the version that fixed it.
Explain the extra fields and why they exist: symbol lists are what let tooling ask whether your code calls the bug rather than whether you merely depend on it. Know that stdlib is a pseudo-module.
An interviewer expects you to know the sourcing consequences - entries exist without CVE aliases, so a CVE-only ingestion pipeline under-reports Go issues. Be able to go from a CVE id to the affected symbols.
Own the choice of which advisory source your organisation treats as authoritative for Go services, and be able to defend consuming the Go database directly rather than a generic CVE mirror that lacks module and symbol precision.
## The database Go keeps its own vulnerability database, served at `https://vuln.go.dev` and rendered for humans at `pkg.go.dev/vuln`. It is curated by the Go security team rather than scraped, and it is deliberately scoped to the Go ecosystem: modules identified by module path, plus the Go standard library and toolchain. Every record has an identifier shaped `GO-YYYY-NNNN` - the year it was published and a sequence number, for example `GO-2024-1234`. Records are served in the OSV JSON schema (the same interchange format used by other open-source advisory databases) with Go-specific extensions. ## Where entries come from Three streams feed it: 1. **Public advisory feeds** - CVE records and GitHub security advisories that name a Go module. 2. **Direct reports** - maintainers of Go modules, and reporters using the Go project's security reporting process, can get an entry created without a CVE ever existing. 3. **The Go project itself** - every security fix in a Go release produces an entry against the standard library or the toolchain. The practical consequence of stream 2 is that **a CVE-only workflow has blind spots in Go**: there are `GO-` entries with no CVE alias at all. ## What a single entry carries - **Affected module path** - `example.com/lib`, or the pseudo-module `stdlib` for standard-library issues, or `toolchain` for issues in the programs shipped with a Go release such as the `go` command. - **Version ranges** - which versions introduced the problem and which version fixed it, expressed as Go module versions, so it lines up directly with what your `go.mod` requires. - **Affected packages** - a module can hold many packages, and usually only one is affected. - **Affected symbols** - within each package, the exported functions, methods and types whose methods carry the vulnerability. This is the field that has no counterpart in a CVE record. - **Summary, details and references** - prose, plus links to the fix commit or issue. - **Aliases** - the `CVE-...` and `GHSA-...` ids for the same issue, when they exist. ## Why the symbol list matters A classic manifest scanner answers one question: *is a version I depend on in the affected range?* That question is cheap and it over-reports badly, because a large module can have one vulnerable parser and fifty innocent packages, and you may import none of the fifty-one directly. Because Go entries name symbols, tooling can answer a much sharper question: *does any path through my program reach one of those functions?* That is the whole basis of Go's reachability analysis, and it is why a Go-native scan of a service typically produces a handful of findings where a manifest scan produces dozens. ## GO ids versus CVE ids Think of the GO id as the primary key for Go and the CVE id as one alias among several. Two rules of thumb: - **Every direction works through aliases.** If someone hands you `CVE-2024-XXXXX` and asks whether your service is affected, look it up by alias and you land on the GO entry, which tells you the module and the symbols. - **Do not assume a CVE exists.** Filtering your process on "has a CVE" quietly drops real Go advisories. ## What the entry does not decide for you The entry states facts: affected module, versions, symbols, fix. It does not tell you how urgent this is in your environment, whether the vulnerable path is exposed to untrusted input, or what your team's deadline for fixing it should be. Those are judgment calls layered on top of the record, and the record is only the input to them. ## Standard library coverage The `stdlib` pseudo-module is worth internalising early, because it behaves differently from every other row in a report. There is no dependency to upgrade - the affected "versions" are Go releases, and the fixed version is a Go release. You resolve those entries by building with a newer toolchain, not by touching `go.mod`'s require list.
- If someone hands you a CVE id, how do you find out whether your Go service is affected?Look the CVE up as an alias in the Go vulnerability database. The matching `GO-YYYY-NNNN` entry gives you the module path, the affected and fixed module versions, and the specific exported symbols, which is exactly what you need to check your `go.mod` and then ask whether your code calls those functions.
- Can a Go advisory exist without a CVE?Yes. Module maintainers and reporters can get an entry published in the Go database directly, and no CVE is ever requested for some of them. A process that only ingests CVE feeds will silently miss those, which is one reason to consume the Go database itself rather than a CVE mirror.
- What does the module path stdlib mean in an entry?It is a pseudo-module standing for the Go standard library. The affected and fixed "versions" are Go releases rather than module versions, so the entry is about the toolchain that compiled your program, not about anything your `go.mod` requires.
saying these in an interview costs you the question
- Thinks GO ids are just renamed CVE ids
- Assumes every Go advisory has a CVE alias
- Says the database covers only third-party modules
- Cannot name anything an entry adds over a CVE record
- Believes the entry assigns your remediation deadline