Documentation
¶
Overview ¶
Package report contains functionality for parsing and linting YAML reports in reports/.
Index ¶
- Constants
- Variables
- func GoID(filename string) string
- func IsYAMLReport(fname string) bool
- func ModulesForEntry(entry osv.Entry) []string
- func NewLinter(prefix string) *linter
- func ParseFilepath(path string) (folder, filename string, issueID int, err error)
- func ReadOSV(filename string) (entry osv.Entry, err error)
- func RemoveNewlines(s string) string
- func UnmarshalFromFile(path string, v any) (err error)
- func Vendor(modulePath string) string
- type CVEMeta
- type Client
- func (c *Client) AliasHasReport(alias string) bool
- func (c *Client) HasReport(githubID int) (found bool)
- func (c *Client) List() []*Report
- func (c *Client) Report(filename string) (r *Report, ok bool)
- func (c *Client) ReportsByAlias(alias string) []*Report
- func (c *Client) ReportsByModule(module string) []*Report
- func (c *Client) XRef(r *Report) *Xrefs
- type Description
- type ExcludedType
- type Fetcher
- type File
- type Module
- type NewOption
- type Note
- type NoteType
- type Package
- type Reference
- type Report
- func (r *Report) AddAliases(aliases []string) (added int)
- func (r *Report) AddCVE(cveID, cwe string, isGoCNA bool)
- func (r *Report) AddNote(t NoteType, format string, v ...any)
- func (r *Report) Aliases() []string
- func (r *Report) AllCVEs() []string
- func (r *Report) CVEFilename() string
- func (r *Report) CheckFilename(filename string) (err error)
- func (r *Report) CheckPackages(ctx context.Context, pkc *pkgsite.Client) (errs error)
- func (r *Report) CommitLinks() (links []string)
- func (r *Report) Encode(w io.Writer) error
- func (r *Report) Fix(pc *proxy.Client)
- func (r *Report) FixModules(pc *proxy.Client) (errs error)
- func (r *Report) FixReferences()
- func (r *Report) FixText()
- func (r *Report) GoCVE() string
- func (r *Report) IsExcluded() bool
- func (r *Report) IsFirstParty() bool
- func (r *Report) IsOriginal() bool
- func (r *Report) IsReviewed() bool
- func (r *Report) IsUnreviewed() bool
- func (r *Report) Lint(pc *proxy.Client) []string
- func (r *Report) LintAsNotes(pc *proxy.Client) bool
- func (r *Report) LintOffline() []string
- func (r *Report) NeedsReview() bool
- func (r *Report) OSVFilename() string
- func (r *Report) ToOSV(lastModified time.Time) (osv.Entry, error)
- func (r *Report) ToString() (string, error)
- func (r *Report) Write(filename string) (err error)
- func (r *Report) YAMLFilename() (string, error)
- type ReviewStatus
- type Source
- type SourceMeta
- type Summary
- type Version
- type VersionType
- type Versions
- type VulnerableAtVersion
- type Xrefs
Constants ¶
const ( VersionTypeIntroduced = "introduced" VersionTypeFixed = "fixed" VersionTypeVulnerableAt = "vulnerable_at" )
const PendingID = "GO-ID-PENDING"
const VulndbURL = "https://github.com/golang/vulndb"
Variables ¶
var ( // YAMLDir is the name of the directory in the vulndb repo that // contains reports. YAMLDir = filepath.Join(dataFolder, reportsFolder) // ExcludedDir is the name of the directory in the vulndb repo that // contains excluded reports. ExcludedDir = filepath.Join(dataFolder, excludedFolder) )
var ( // osvDir is the name of the directory in the vulndb repo that // contains reports. OSVDir = "data/osv" // SchemaVersion is used to indicate which version of the OSV schema a // particular vulnerability was exported with. SchemaVersion = "1.3.1" )
var ExcludedTypes = []ExcludedType{ ExcludedNotImportable, ExcludedNotGoCode, ExcludedNotAVulnerability, ExcludedEffectivelyPrivate, ExcludedDependentVulnerabilty, ExcludedLegacyFalsePositive, ExcludedWithdrawn, }
ExcludedTypes are the set of reasons a report may be excluded from the database. These are described in detail at https://go.googlesource.com/vulndb/+/refs/heads/master/doc/format.md.
Functions ¶
func GoID ¶
GoID returns the Go ID from the given filename, assuming the filename is of the form "*/<goID>.<ext>".
func IsYAMLReport ¶
func ModulesForEntry ¶
ModulesForEntry returns the list of modules affected by an OSV entry.
func NewLinter ¶
func NewLinter(prefix string) *linter
NewLinter creates a new linter. If prefix is set, all lints will have the given prefix when Errors is called.
func ParseFilepath ¶
func RemoveNewlines ¶
RemoveNewlines removes leading and trailing space characters and replaces inner newlines with spaces.
func UnmarshalFromFile ¶
Types ¶
type CVEMeta ¶
type CVEMeta struct { ID string `yaml:",omitempty"` CWE string `yaml:",omitempty"` Description string `yaml:",omitempty"` // Additional references that should be included in the CVE record // but not the OSV. This is used to preserve references that have been // added to a CVE by the CVE program that the Go team does not want // to display via OSV. An example that uses this is GO-2022-0476. References []string `yaml:",omitempty"` }
type Client ¶
type Client struct {
// contains filtered or unexported fields
}
Client is a client for accessing vulndb reports from a git repository.
func NewClient ¶
NewClient returns a Client for accessing the reports in the given repo, which must contain directories "data/reports" and "data/excluded".
func NewDefaultClient ¶
NewDefaultClient returns a Client that reads reports from https://github.com/golang/vulndb.
func NewTestClient ¶
NewTestClient returns a Client based on a map from filenames to reports.
Intended for testing.
func (*Client) AliasHasReport ¶
AliasHasReport returns whether the given alias exists in vulndb.
func (*Client) HasReport ¶
HasReport returns whether the Github issue id has a corresponding report in vulndb.
func (*Client) Report ¶
Report returns the report with the given filename in vulndb, or (nil, false) if not found.
func (*Client) ReportsByAlias ¶
ReportsByAlias returns a list of reports in vulndb with the given alias.
func (*Client) ReportsByModule ¶
ReportsByModule returns a list of reports in vulndb with the given module.
type Description ¶
type Description string
func (*Description) String ¶
func (d *Description) String() string
type ExcludedType ¶
type ExcludedType string
ExcludedType is the reason a report is excluded from the database.
It must be one of the values in ExcludedTypes.
const ( ExcludedNotImportable ExcludedType = "NOT_IMPORTABLE" ExcludedNotGoCode ExcludedType = "NOT_GO_CODE" ExcludedNotAVulnerability ExcludedType = "NOT_A_VULNERABILITY" ExcludedEffectivelyPrivate ExcludedType = "EFFECTIVELY_PRIVATE" ExcludedDependentVulnerabilty ExcludedType = "DEPENDENT_VULNERABILITY" ExcludedLegacyFalsePositive ExcludedType = "LEGACY_FALSE_POSITIVE" ExcludedWithdrawn ExcludedType = "WITHDRAWN" )
func FromLabel ¶
func FromLabel(label string) (ExcludedType, bool)
func ToExcludedType ¶
func ToExcludedType(s string) (ExcludedType, bool)
func (*ExcludedType) IsValid ¶
func (e *ExcludedType) IsValid() bool
func (ExcludedType) ToLabel ¶
func (e ExcludedType) ToLabel() string
type Module ¶
type Module struct { Module string `yaml:",omitempty"` Versions Versions `yaml:",omitempty"` // Versions that are not known to the module proxy, but // that may be useful to display to humans. NonGoVersions Versions `yaml:"non_go_versions,omitempty"` // Version types that exist in OSV, but we don't support. // These may be added when automatically creating a report, // but must be deleted in order to pass lint checks. UnsupportedVersions Versions `yaml:"unsupported_versions,omitempty"` // Known-vulnerable version, to use when performing static analysis or // other techniques on a vulnerable version of the package. // // In general, we want to use the most recent vulnerable version of // the package. Determining this programmatically is difficult, especially // for packages without tagged versions, so we specify it manually here. VulnerableAt *Version `yaml:"vulnerable_at,omitempty"` // Additional list of module@version to require when performing static analysis. // It is rare that we need to specify this. VulnerableAtRequires []string `yaml:"vulnerable_at_requires,omitempty"` Packages []*Package `yaml:",omitempty"` // Used to determine vulnerable symbols for a given module. If not populated, // the fix links found in the report's References field will be used. // Only auto-added if the -update flag is passed to vulnreport. FixLinks []string `yaml:"fix_links,omitempty"` // Do not lint this module. // Only for use in exceptional circumstances, such as when a malicious // module has been deleted from the proxy entirely. SkipLint bool `yaml:"skip_lint,omitempty"` }
func (*Module) AllPackages ¶
AllPackages returns all affected packages in a given module.
func (*Module) FixVersions ¶
FixVersions replaces each version with its canonical form (if possible), sorts version ranges, and moves versions to their proper spot.
func (*Module) IsFirstParty ¶
type NewOption ¶
type NewOption func(*cfg)
func WithAliases ¶
func WithCreated ¶
func WithModulePath ¶
func WithReviewStatus ¶
func WithReviewStatus(status ReviewStatus) NewOption
func WithUnexcluded ¶
func WithUnexcluded(reason ExcludedType) NewOption
type Note ¶
A Note is a note about the report. May be typed or untyped (with Type left blank).
func (*Note) MarshalYAML ¶
func (*Note) UnmarshalYAML ¶
type Package ¶
type Package struct { Package string `yaml:",omitempty"` GOOS []string `yaml:"goos,omitempty"` GOARCH []string `yaml:"goarch,omitempty"` // Symbols originally identified as vulnerable. Symbols []string `yaml:",omitempty"` // Additional vulnerable symbols, computed from Symbols via static analysis // or other technique. DerivedSymbols []string `yaml:"derived_symbols,omitempty"` // Symbols that may be considered vulnerable by automated tools, // but have been determined (by a human) to actually not be vulnerable. // For now, this field is respected only by the tool that finds derived // symbols, but is not published to OSV or elsewhere (so, for example, // govulncheck cannot consume it). ExcludedSymbols []string `yaml:"excluded_symbols,omitempty"` // Reason the package's symbols are already considered fixed and should not // be checked or automatically updated. SkipFixSymbols string `yaml:"skip_fix,omitempty"` }
func (*Package) AllSymbols ¶
AllSymbols returns both original and derived symbols.
type Reference ¶
A Reference is a link to some external resource.
For ease of typing, References are represented in the YAML as a single-element mapping of type to URL.
func ReferenceFromUrl ¶
ReferenceFromUrl creates a new Reference from a url with Type inferred from the contents of the url.
func (*Reference) MarshalYAML ¶
func (*Reference) UnmarshalYAML ¶
type Report ¶
type Report struct { ID string `yaml:",omitempty"` // Excluded indicates an excluded report. Excluded ExcludedType `yaml:",omitempty"` Modules []*Module `yaml:",omitempty"` // Summary is a short phrase describing the vulnerability. Summary Summary `yaml:",omitempty"` // Description is the CVE description from an existing CVE. If we are // assigning a CVE ID ourselves, use CVEMetadata.Description instead. Description Description `yaml:",omitempty"` Published time.Time `yaml:",omitempty"` Withdrawn *osv.Time `yaml:",omitempty"` // CVE are CVE IDs for existing CVEs. // If we are assigning a CVE ID ourselves, use CVEMetadata.ID instead. CVEs []string `yaml:",omitempty"` // GHSAs are the IDs of GitHub Security Advisories that match // the above CVEs. GHSAs []string `yaml:",omitempty"` // Aliases from other databases that we don't (yet) know about. // Not published to OSV. UnknownAliases []string `yaml:"unknown_aliases,omitempty"` // Related is a list of identifiers (e.g. CVEs or GHSAs) // that are related to, but are not direct aliases of, this report. Related []string `yaml:",omitempty"` Credits []string `yaml:",omitempty"` References []*Reference `yaml:",omitempty"` // CVEMetadata is used to capture CVE information when we want to assign a // CVE ourselves. If a CVE already exists for an issue, use the CVE field // to fill in the ID string. CVEMetadata *CVEMeta `yaml:"cve_metadata,omitempty"` // Notes about the report. This field is ignored when creating // OSV and CVE records. It can be used to document decisions made when // creating the report, outstanding issues, or anything else worth // mentioning. Notes []*Note `yaml:",omitempty"` // Metadata about how this report was generated. // Not published to OSV. SourceMeta *SourceMeta `yaml:"source,omitempty"` ReviewStatus ReviewStatus `yaml:"review_status,omitempty"` // Allow this report to be UNREVIEWED regardless of it's modules' // priorities. UnreviewedOK bool `yaml:"unreviewed_ok,omitempty"` // (For unexcluded reports) The reason this report was previously // excluded. Not published to OSV. Unexcluded ExcludedType `yaml:"unexcluded,omitempty"` }
Report represents a vulnerability report in the vulndb. Remember to update doc/format.md when this structure changes.
func (*Report) AddAliases ¶
AddAliases adds any GHSAs and CVEs in aliases that were not already present to the report.
func (*Report) CVEFilename ¶
func (*Report) CheckFilename ¶
CheckFilename errors if the filename is inconsistent with the report.
func (*Report) CheckPackages ¶
CheckPackages returns an error if any of the packages listed in the report do not exist (according to pkgsite).
func (*Report) CommitLinks ¶
CommitLinks returns all commit fix links in report.References
func (*Report) FixReferences ¶
func (r *Report) FixReferences()
FixReferences deletes some unneeded references, and attempts to fix reference types. Modifies r.
Deletes:
- "package"-type references
- Go advisory references (these are redundant for us)
- all advisories except the "best" one (if applicable)
Changes:
- reference type to "advisory" for GHSA and CVE links.
- reference type to "fix" for Github pull requests and commit links in one of the affected modules
- reference type to "report" for Github issues in one of the affected modules
func (*Report) GoCVE ¶
GoCVE returns the CVE assigned to this report by the Go CNA, or the empty string if not applicable.
func (*Report) IsExcluded ¶
func (*Report) IsFirstParty ¶
func (*Report) IsOriginal ¶
IsOriginal returns whether the source of this report is definitely the Go security team. (Many older reports do not have this metadata so other heuristics would have to be used).
func (*Report) IsReviewed ¶
func (*Report) IsUnreviewed ¶
func (*Report) Lint ¶
Lint checks the content of a Report and outputs a list of strings representing lint errors. TODO: It might make sense to include warnings or informational things alongside errors, especially during for use during the triage process.
func (*Report) LintAsNotes ¶
LintAsNotes works like Lint, but modifies r by adding any lints found to the notes section, instead of returning them. Removes any pre-existing lint notes. Returns true if any lints were found.
func (*Report) LintOffline ¶
LintOffline performs all lint checks that don't require a network connection.
func (*Report) NeedsReview ¶
func (*Report) OSVFilename ¶
func (*Report) ToOSV ¶
ToOSV creates an osv.Entry for a report. lastModified is the time the report should be considered to have been most recently modified.
func (*Report) YAMLFilename ¶
type ReviewStatus ¶
type ReviewStatus int
const ( Reviewed ReviewStatus Unreviewed NeedsReview )
func ToReviewStatus ¶
func ToReviewStatus(s string) (ReviewStatus, bool)
func (ReviewStatus) IsValid ¶
func (r ReviewStatus) IsValid() bool
func (ReviewStatus) MarshalYAML ¶
func (r ReviewStatus) MarshalYAML() (any, error)
func (ReviewStatus) String ¶
func (r ReviewStatus) String() string
func (ReviewStatus) ToOSV ¶
func (r ReviewStatus) ToOSV() osv.ReviewStatus
func (*ReviewStatus) UnmarshalYAML ¶
func (r *ReviewStatus) UnmarshalYAML(node *yaml.Node) error
type Source ¶
type Source interface { // SourceID returns the ID of the source. // For example, the GHSA or CVE id. SourceID() string ToReport(pxc *proxy.Client, modulePath string) *Report }
Source represents a vulnerability format (e.g., GHSA, CVE) that can be converted to our Report format.
func OriginalCVE ¶
type SourceMeta ¶
type Version ¶
type Version struct { Version string `yaml:",omitempty"` Type VersionType `yaml:",omitempty"` }
func Introduced ¶
func VulnerableAt ¶
func (*Version) IsIntroduced ¶
func (*Version) MarshalYAML ¶
func (*Version) ToRangeEvent ¶
func (v *Version) ToRangeEvent() (osv.RangeEvent, error)
func (*Version) UnmarshalYAML ¶
type VersionType ¶
type VersionType string
type Versions ¶
type Versions []*Version
func (Versions) MarshalYAML ¶
func (Versions) ToRangesWithType ¶
func (*Versions) UnmarshalYAML ¶
type VulnerableAtVersion ¶
type VulnerableAtVersion Version