circle-ir 4.17.0 → 4.18.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/analysis/advisories.d.ts +186 -0
- package/dist/analysis/advisories.d.ts.map +1 -0
- package/dist/analysis/advisories.js +391 -0
- package/dist/analysis/advisories.js.map +1 -0
- package/dist/analysis/comment-lines.d.ts +14 -0
- package/dist/analysis/comment-lines.d.ts.map +1 -0
- package/dist/analysis/comment-lines.js +34 -0
- package/dist/analysis/comment-lines.js.map +1 -0
- package/dist/analysis/config-loader.d.ts.map +1 -1
- package/dist/analysis/config-loader.js +59 -5
- package/dist/analysis/config-loader.js.map +1 -1
- package/dist/analysis/constant-caller-gate.d.ts +2 -2
- package/dist/analysis/constant-caller-gate.d.ts.map +1 -1
- package/dist/analysis/constant-caller-gate.js +205 -29
- package/dist/analysis/constant-caller-gate.js.map +1 -1
- package/dist/analysis/constant-propagation/propagator.d.ts +4 -0
- package/dist/analysis/constant-propagation/propagator.d.ts.map +1 -1
- package/dist/analysis/constant-propagation/propagator.js +99 -0
- package/dist/analysis/constant-propagation/propagator.js.map +1 -1
- package/dist/analysis/entry-point-detection.d.ts.map +1 -1
- package/dist/analysis/entry-point-detection.js +72 -0
- package/dist/analysis/entry-point-detection.js.map +1 -1
- package/dist/analysis/interprocedural.d.ts.map +1 -1
- package/dist/analysis/interprocedural.js +75 -8
- package/dist/analysis/interprocedural.js.map +1 -1
- package/dist/analysis/maven-declared.d.ts +72 -0
- package/dist/analysis/maven-declared.d.ts.map +1 -0
- package/dist/analysis/maven-declared.js +216 -0
- package/dist/analysis/maven-declared.js.map +1 -0
- package/dist/analysis/maven-version.d.ts +28 -0
- package/dist/analysis/maven-version.d.ts.map +1 -0
- package/dist/analysis/maven-version.js +172 -0
- package/dist/analysis/maven-version.js.map +1 -0
- package/dist/analysis/passes/constant-propagation-pass.d.ts.map +1 -1
- package/dist/analysis/passes/constant-propagation-pass.js +29 -1
- package/dist/analysis/passes/constant-propagation-pass.js.map +1 -1
- package/dist/analysis/passes/cross-file-pass.d.ts.map +1 -1
- package/dist/analysis/passes/cross-file-pass.js +81 -1
- package/dist/analysis/passes/cross-file-pass.js.map +1 -1
- package/dist/analysis/passes/csharp-sanitizer-credit.d.ts +7 -0
- package/dist/analysis/passes/csharp-sanitizer-credit.d.ts.map +1 -1
- package/dist/analysis/passes/csharp-sanitizer-credit.js +44 -1
- package/dist/analysis/passes/csharp-sanitizer-credit.js.map +1 -1
- package/dist/analysis/passes/insecure-cookie-pass.d.ts +2 -0
- package/dist/analysis/passes/insecure-cookie-pass.d.ts.map +1 -1
- package/dist/analysis/passes/insecure-cookie-pass.js +25 -3
- package/dist/analysis/passes/insecure-cookie-pass.js.map +1 -1
- package/dist/analysis/passes/interprocedural-pass.d.ts +11 -14
- package/dist/analysis/passes/interprocedural-pass.d.ts.map +1 -1
- package/dist/analysis/passes/interprocedural-pass.js +562 -0
- package/dist/analysis/passes/interprocedural-pass.js.map +1 -1
- package/dist/analysis/passes/language-sources-pass.d.ts +18 -1
- package/dist/analysis/passes/language-sources-pass.d.ts.map +1 -1
- package/dist/analysis/passes/language-sources-pass.js +1057 -14
- package/dist/analysis/passes/language-sources-pass.js.map +1 -1
- package/dist/analysis/passes/param-source-flow-gate-pass.d.ts.map +1 -1
- package/dist/analysis/passes/param-source-flow-gate-pass.js +66 -3
- package/dist/analysis/passes/param-source-flow-gate-pass.js.map +1 -1
- package/dist/analysis/passes/sink-filter-pass.d.ts +44 -2
- package/dist/analysis/passes/sink-filter-pass.d.ts.map +1 -1
- package/dist/analysis/passes/sink-filter-pass.js +690 -12
- package/dist/analysis/passes/sink-filter-pass.js.map +1 -1
- package/dist/analysis/passes/taint-propagation-pass.d.ts.map +1 -1
- package/dist/analysis/passes/taint-propagation-pass.js +133 -10
- package/dist/analysis/passes/taint-propagation-pass.js.map +1 -1
- package/dist/analysis/passes/tls-verify-disabled-pass.d.ts +18 -0
- package/dist/analysis/passes/tls-verify-disabled-pass.d.ts.map +1 -1
- package/dist/analysis/passes/tls-verify-disabled-pass.js +161 -0
- package/dist/analysis/passes/tls-verify-disabled-pass.js.map +1 -1
- package/dist/analysis/passes/weak-random-pass.d.ts +6 -0
- package/dist/analysis/passes/weak-random-pass.d.ts.map +1 -1
- package/dist/analysis/passes/weak-random-pass.js +29 -0
- package/dist/analysis/passes/weak-random-pass.js.map +1 -1
- package/dist/analysis/promote-cross-file-flows.d.ts +17 -0
- package/dist/analysis/promote-cross-file-flows.d.ts.map +1 -0
- package/dist/analysis/promote-cross-file-flows.js +32 -0
- package/dist/analysis/promote-cross-file-flows.js.map +1 -0
- package/dist/analysis/sbom.d.ts +100 -0
- package/dist/analysis/sbom.d.ts.map +1 -1
- package/dist/analysis/sbom.js +514 -3
- package/dist/analysis/sbom.js.map +1 -1
- package/dist/analysis/semver-version.d.ts +30 -0
- package/dist/analysis/semver-version.d.ts.map +1 -0
- package/dist/analysis/semver-version.js +76 -0
- package/dist/analysis/semver-version.js.map +1 -0
- package/dist/analysis/taint-matcher.d.ts +5 -0
- package/dist/analysis/taint-matcher.d.ts.map +1 -1
- package/dist/analysis/taint-matcher.js +225 -4
- package/dist/analysis/taint-matcher.js.map +1 -1
- package/dist/analyzer.d.ts +57 -0
- package/dist/analyzer.d.ts.map +1 -1
- package/dist/analyzer.js +69 -6
- package/dist/analyzer.js.map +1 -1
- package/dist/browser/circle-ir.js +2936 -291
- package/dist/core/circle-ir-core.cjs +634 -203
- package/dist/core/circle-ir-core.js +634 -203
- package/dist/core/extractors/dfg.js +205 -2
- package/dist/core/extractors/dfg.js.map +1 -1
- package/dist/core/extractors/ts-declaration-detail.d.ts +39 -0
- package/dist/core/extractors/ts-declaration-detail.d.ts.map +1 -0
- package/dist/core/extractors/ts-declaration-detail.js +266 -0
- package/dist/core/extractors/ts-declaration-detail.js.map +1 -0
- package/dist/graph/analysis-pass.d.ts +4 -1
- package/dist/graph/analysis-pass.d.ts.map +1 -1
- package/dist/graph/analysis-pass.js +4 -1
- package/dist/graph/analysis-pass.js.map +1 -1
- package/dist/graph-facts/dead-code.d.ts +62 -0
- package/dist/graph-facts/dead-code.d.ts.map +1 -0
- package/dist/graph-facts/dead-code.js +90 -0
- package/dist/graph-facts/dead-code.js.map +1 -0
- package/dist/graph-facts/dependency-calls.d.ts +86 -0
- package/dist/graph-facts/dependency-calls.d.ts.map +1 -0
- package/dist/graph-facts/dependency-calls.js +93 -0
- package/dist/graph-facts/dependency-calls.js.map +1 -0
- package/dist/graph-facts/index.d.ts +10 -0
- package/dist/graph-facts/index.d.ts.map +1 -0
- package/dist/graph-facts/index.js +10 -0
- package/dist/graph-facts/index.js.map +1 -0
- package/dist/graph-facts/maven-packages.d.ts +42 -0
- package/dist/graph-facts/maven-packages.d.ts.map +1 -0
- package/dist/graph-facts/maven-packages.js +133 -0
- package/dist/graph-facts/maven-packages.js.map +1 -0
- package/dist/graph-facts/reach.d.ts +203 -0
- package/dist/graph-facts/reach.d.ts.map +1 -0
- package/dist/graph-facts/reach.js +219 -0
- package/dist/graph-facts/reach.js.map +1 -0
- package/dist/graph-facts/removal-reach.d.ts +73 -0
- package/dist/graph-facts/removal-reach.d.ts.map +1 -0
- package/dist/graph-facts/removal-reach.js +64 -0
- package/dist/graph-facts/removal-reach.js.map +1 -0
- package/dist/index.d.ts +21 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -3
- package/dist/index.js.map +1 -1
- package/dist/navigation/go-graph.d.ts +68 -0
- package/dist/navigation/go-graph.d.ts.map +1 -0
- package/dist/navigation/go-graph.js +753 -0
- package/dist/navigation/go-graph.js.map +1 -0
- package/dist/navigation/index.d.ts +7 -1
- package/dist/navigation/index.d.ts.map +1 -1
- package/dist/navigation/index.js +6 -0
- package/dist/navigation/index.js.map +1 -1
- package/dist/navigation/java-entry-tables.d.ts +43 -0
- package/dist/navigation/java-entry-tables.d.ts.map +1 -0
- package/dist/navigation/java-entry-tables.js +56 -0
- package/dist/navigation/java-entry-tables.js.map +1 -0
- package/dist/navigation/java-graph.d.ts +64 -0
- package/dist/navigation/java-graph.d.ts.map +1 -0
- package/dist/navigation/java-graph.js +466 -0
- package/dist/navigation/java-graph.js.map +1 -0
- package/dist/navigation/navigation-index.d.ts +51 -1
- package/dist/navigation/navigation-index.d.ts.map +1 -1
- package/dist/navigation/navigation-index.js +72 -0
- package/dist/navigation/navigation-index.js.map +1 -1
- package/dist/navigation/python-graph.d.ts +73 -0
- package/dist/navigation/python-graph.d.ts.map +1 -0
- package/dist/navigation/python-graph.js +867 -0
- package/dist/navigation/python-graph.js.map +1 -0
- package/dist/navigation/ts-call-edges.d.ts +193 -0
- package/dist/navigation/ts-call-edges.d.ts.map +1 -0
- package/dist/navigation/ts-call-edges.js +2089 -0
- package/dist/navigation/ts-call-edges.js.map +1 -0
- package/dist/navigation/ts-entry-tables.d.ts +88 -0
- package/dist/navigation/ts-entry-tables.d.ts.map +1 -0
- package/dist/navigation/ts-entry-tables.js +50 -0
- package/dist/navigation/ts-entry-tables.js.map +1 -0
- package/dist/path-set/branches.d.ts +52 -0
- package/dist/path-set/branches.d.ts.map +1 -0
- package/dist/path-set/branches.js +124 -0
- package/dist/path-set/branches.js.map +1 -0
- package/dist/path-set/finding-diff.d.ts +63 -0
- package/dist/path-set/finding-diff.d.ts.map +1 -0
- package/dist/path-set/finding-diff.js +150 -0
- package/dist/path-set/finding-diff.js.map +1 -0
- package/dist/path-set/index.d.ts +18 -0
- package/dist/path-set/index.d.ts.map +1 -0
- package/dist/path-set/index.js +12 -0
- package/dist/path-set/index.js.map +1 -0
- package/dist/path-set/line-diff.d.ts +19 -0
- package/dist/path-set/line-diff.d.ts.map +1 -0
- package/dist/path-set/line-diff.js +98 -0
- package/dist/path-set/line-diff.js.map +1 -0
- package/dist/path-set/path-set.d.ts +88 -0
- package/dist/path-set/path-set.d.ts.map +1 -0
- package/dist/path-set/path-set.js +716 -0
- package/dist/path-set/path-set.js.map +1 -0
- package/dist/path-set/templates.d.ts +42 -0
- package/dist/path-set/templates.d.ts.map +1 -0
- package/dist/path-set/templates.js +119 -0
- package/dist/path-set/templates.js.map +1 -0
- package/dist/path-set/types.d.ts +195 -0
- package/dist/path-set/types.d.ts.map +1 -0
- package/dist/path-set/types.js +8 -0
- package/dist/path-set/types.js.map +1 -0
- package/dist/remedy-class/index.d.ts +12 -0
- package/dist/remedy-class/index.d.ts.map +1 -0
- package/dist/remedy-class/index.js +9 -0
- package/dist/remedy-class/index.js.map +1 -0
- package/dist/remedy-class/match.d.ts +165 -0
- package/dist/remedy-class/match.d.ts.map +1 -0
- package/dist/remedy-class/match.js +705 -0
- package/dist/remedy-class/match.js.map +1 -0
- package/dist/remedy-class/output-context.d.ts +25 -0
- package/dist/remedy-class/output-context.d.ts.map +1 -0
- package/dist/remedy-class/output-context.js +150 -0
- package/dist/remedy-class/output-context.js.map +1 -0
- package/dist/remedy-class/sha256.d.ts +18 -0
- package/dist/remedy-class/sha256.d.ts.map +1 -0
- package/dist/remedy-class/sha256.js +89 -0
- package/dist/remedy-class/sha256.js.map +1 -0
- package/dist/remedy-class/table.d.ts +130 -0
- package/dist/remedy-class/table.d.ts.map +1 -0
- package/dist/remedy-class/table.js +457 -0
- package/dist/remedy-class/table.js.map +1 -0
- package/dist/resolution/cross-file.d.ts +9 -0
- package/dist/resolution/cross-file.d.ts.map +1 -1
- package/dist/resolution/cross-file.js +60 -5
- package/dist/resolution/cross-file.js.map +1 -1
- package/dist/stable-ids/builder.d.ts +20 -0
- package/dist/stable-ids/builder.d.ts.map +1 -0
- package/dist/stable-ids/builder.js +65 -0
- package/dist/stable-ids/builder.js.map +1 -0
- package/dist/stable-ids/diff.d.ts +18 -0
- package/dist/stable-ids/diff.d.ts.map +1 -0
- package/dist/stable-ids/diff.js +37 -0
- package/dist/stable-ids/diff.js.map +1 -0
- package/dist/stable-ids/go.d.ts +28 -0
- package/dist/stable-ids/go.d.ts.map +1 -0
- package/dist/stable-ids/go.js +160 -0
- package/dist/stable-ids/go.js.map +1 -0
- package/dist/stable-ids/hash.d.ts +22 -0
- package/dist/stable-ids/hash.d.ts.map +1 -0
- package/dist/stable-ids/hash.js +167 -0
- package/dist/stable-ids/hash.js.map +1 -0
- package/dist/stable-ids/index.d.ts +30 -0
- package/dist/stable-ids/index.d.ts.map +1 -0
- package/dist/stable-ids/index.js +59 -0
- package/dist/stable-ids/index.js.map +1 -0
- package/dist/stable-ids/java.d.ts +28 -0
- package/dist/stable-ids/java.d.ts.map +1 -0
- package/dist/stable-ids/java.js +224 -0
- package/dist/stable-ids/java.js.map +1 -0
- package/dist/stable-ids/moves.d.ts +87 -0
- package/dist/stable-ids/moves.d.ts.map +1 -0
- package/dist/stable-ids/moves.js +222 -0
- package/dist/stable-ids/moves.js.map +1 -0
- package/dist/stable-ids/nodes.d.ts +32 -0
- package/dist/stable-ids/nodes.d.ts.map +1 -0
- package/dist/stable-ids/nodes.js +92 -0
- package/dist/stable-ids/nodes.js.map +1 -0
- package/dist/stable-ids/normalize.d.ts +35 -0
- package/dist/stable-ids/normalize.d.ts.map +1 -0
- package/dist/stable-ids/normalize.js +174 -0
- package/dist/stable-ids/normalize.js.map +1 -0
- package/dist/stable-ids/parse-errors.d.ts +24 -0
- package/dist/stable-ids/parse-errors.d.ts.map +1 -0
- package/dist/stable-ids/parse-errors.js +46 -0
- package/dist/stable-ids/parse-errors.js.map +1 -0
- package/dist/stable-ids/python.d.ts +27 -0
- package/dist/stable-ids/python.d.ts.map +1 -0
- package/dist/stable-ids/python.js +212 -0
- package/dist/stable-ids/python.js.map +1 -0
- package/dist/stable-ids/ts-parse-errors.d.ts +27 -0
- package/dist/stable-ids/ts-parse-errors.d.ts.map +1 -0
- package/dist/stable-ids/ts-parse-errors.js +75 -0
- package/dist/stable-ids/ts-parse-errors.js.map +1 -0
- package/dist/stable-ids/types.d.ts +106 -0
- package/dist/stable-ids/types.d.ts.map +1 -0
- package/dist/stable-ids/types.js +16 -0
- package/dist/stable-ids/types.js.map +1 -0
- package/dist/stable-ids/typescript.d.ts +30 -0
- package/dist/stable-ids/typescript.d.ts.map +1 -0
- package/dist/stable-ids/typescript.js +362 -0
- package/dist/stable-ids/typescript.js.map +1 -0
- package/dist/types/config.d.ts +9 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/index.d.ts +35 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Known-vulnerability matching of a resolved dependency set against advisory
|
|
3
|
+
* records in the OSV schema (https://ossf.github.io/osv-schema/).
|
|
4
|
+
*
|
|
5
|
+
* The library ships no advisory data and fetches none: the caller parses the
|
|
6
|
+
* records of a snapshot it chose (for example the unzipped per-ecosystem
|
|
7
|
+
* export of OSV.dev) and passes them in, so the same set, records and engine
|
|
8
|
+
* version always give the same answer. Facts only: which advisory affects
|
|
9
|
+
* which coordinate, by which range, and which later versions are fixed.
|
|
10
|
+
* Severity is copied from the record; nothing is ranked or scored here.
|
|
11
|
+
*
|
|
12
|
+
* Ecosystems with an ordering (see {@link ADVISORY_ECOSYSTEMS}): `Maven`
|
|
13
|
+
* (Maven's `ComparableVersion` order, `ECOSYSTEM` ranges) and `npm` (SemVer
|
|
14
|
+
* 2.0 precedence, `SEMVER` ranges). Any other ecosystem name keeps the
|
|
15
|
+
* original behaviour: Maven order over `ECOSYSTEM` ranges, names as given.
|
|
16
|
+
*/
|
|
17
|
+
import type { Dependency, Ecosystem } from './sbom.js';
|
|
18
|
+
/** How one OSV ecosystem orders versions and names packages. */
|
|
19
|
+
export interface AdvisoryEcosystem {
|
|
20
|
+
/** OSV's ecosystem name (`affected[].package.ecosystem`). */
|
|
21
|
+
osv: string;
|
|
22
|
+
/** The `Dependency.ecosystem` it matches. */
|
|
23
|
+
dependency: Ecosystem;
|
|
24
|
+
/** Version order for ranges, fixed lists and deltas. */
|
|
25
|
+
compare: (a: string, b: string) => number;
|
|
26
|
+
/** OSV range types evaluated (others are ignored). */
|
|
27
|
+
rangeTypes: readonly string[];
|
|
28
|
+
/** A version the matcher may place in that order. */
|
|
29
|
+
isVersion: (version: string) => boolean;
|
|
30
|
+
/** Canonical package name, applied to OSV names and dependency names alike. */
|
|
31
|
+
normalizeName: (name: string) => string;
|
|
32
|
+
}
|
|
33
|
+
/** The ecosystems this library can order, keyed by OSV name. */
|
|
34
|
+
export declare const ADVISORY_ECOSYSTEMS: Readonly<Record<string, AdvisoryEcosystem>>;
|
|
35
|
+
export interface OsvEvent {
|
|
36
|
+
introduced?: string;
|
|
37
|
+
fixed?: string;
|
|
38
|
+
last_affected?: string;
|
|
39
|
+
limit?: string;
|
|
40
|
+
}
|
|
41
|
+
export interface OsvRange {
|
|
42
|
+
type: string;
|
|
43
|
+
events: OsvEvent[];
|
|
44
|
+
}
|
|
45
|
+
export interface OsvAffected {
|
|
46
|
+
package: {
|
|
47
|
+
ecosystem: string;
|
|
48
|
+
name: string;
|
|
49
|
+
purl?: string;
|
|
50
|
+
};
|
|
51
|
+
ranges?: OsvRange[];
|
|
52
|
+
versions?: string[];
|
|
53
|
+
}
|
|
54
|
+
export interface OsvRecord {
|
|
55
|
+
id: string;
|
|
56
|
+
aliases?: string[];
|
|
57
|
+
summary?: string;
|
|
58
|
+
published?: string;
|
|
59
|
+
modified: string;
|
|
60
|
+
withdrawn?: string;
|
|
61
|
+
severity?: Array<{
|
|
62
|
+
type: string;
|
|
63
|
+
score: string;
|
|
64
|
+
}>;
|
|
65
|
+
affected?: OsvAffected[];
|
|
66
|
+
references?: Array<{
|
|
67
|
+
type: string;
|
|
68
|
+
url: string;
|
|
69
|
+
}>;
|
|
70
|
+
database_specific?: {
|
|
71
|
+
severity?: string;
|
|
72
|
+
} & Record<string, unknown>;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Read one OSV record from JSON text or an already-parsed value. Returns null
|
|
76
|
+
* for anything that is not a record (no string `id` or `modified`), so a
|
|
77
|
+
* stray file in a snapshot directory is skipped rather than fatal.
|
|
78
|
+
*/
|
|
79
|
+
export declare function parseOsvRecord(input: string | unknown): OsvRecord | null;
|
|
80
|
+
/** One vulnerability after alias merge: the records that describe it. */
|
|
81
|
+
export interface AdvisoryGroup {
|
|
82
|
+
/** The group's id: its `GHSA-…` id if any, else the lowest id. */
|
|
83
|
+
id: string;
|
|
84
|
+
/** Every other id and alias of the group, CVE ids first. */
|
|
85
|
+
aliases: string[];
|
|
86
|
+
records: OsvRecord[];
|
|
87
|
+
}
|
|
88
|
+
export interface AdvisoryIndex {
|
|
89
|
+
/** Ecosystem the index was built for (OSV name, e.g. `Maven`). */
|
|
90
|
+
ecosystem: string;
|
|
91
|
+
/** Live (non-withdrawn) records read. */
|
|
92
|
+
records: number;
|
|
93
|
+
/** The greatest `modified` across all records read: the data's own date. */
|
|
94
|
+
snapshotDate: string | null;
|
|
95
|
+
/** Withdrawn records, never matched: id, aliases and withdrawal time. */
|
|
96
|
+
withdrawn: Array<{
|
|
97
|
+
id: string;
|
|
98
|
+
aliases: string[];
|
|
99
|
+
withdrawnAt: string;
|
|
100
|
+
}>;
|
|
101
|
+
/** Package name → groups with an `affected` entry for it. */
|
|
102
|
+
byPackage: Map<string, AdvisoryGroup[]>;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Build the matching index for one ecosystem. Records whose ids or aliases
|
|
106
|
+
* intersect are merged into one group, so a vulnerability published under two
|
|
107
|
+
* ids is reported once. Withdrawn records are listed and never matched.
|
|
108
|
+
*/
|
|
109
|
+
export declare function buildAdvisoryIndex(records: OsvRecord[], ecosystem?: string): AdvisoryIndex;
|
|
110
|
+
export interface AffectedInterval {
|
|
111
|
+
/** Inclusive lower bound; `"0"` means from the first version. */
|
|
112
|
+
introduced: string;
|
|
113
|
+
/** Exclusive upper bound. */
|
|
114
|
+
fixed?: string;
|
|
115
|
+
/** Inclusive upper bound. */
|
|
116
|
+
lastAffected?: string;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Turn one range's events into intervals, in version order (Maven order unless
|
|
120
|
+
* another `compare` is given).
|
|
121
|
+
*/
|
|
122
|
+
export declare function rangeIntervals(range: OsvRange, compare?: (a: string, b: string) => number): AffectedInterval[];
|
|
123
|
+
export interface AdvisoryRef {
|
|
124
|
+
id: string;
|
|
125
|
+
aliases: string[];
|
|
126
|
+
summary?: string;
|
|
127
|
+
published?: string;
|
|
128
|
+
modified: string;
|
|
129
|
+
/** Copied from the records (CVSS vectors and the like), never computed. */
|
|
130
|
+
severity: Array<{
|
|
131
|
+
type: string;
|
|
132
|
+
score: string;
|
|
133
|
+
}>;
|
|
134
|
+
/** The record's own `database_specific.severity` (e.g. GHSA's HIGH), copied. */
|
|
135
|
+
databaseSeverity?: string;
|
|
136
|
+
references: string[];
|
|
137
|
+
}
|
|
138
|
+
export interface AdvisoryMatch {
|
|
139
|
+
dependency: Dependency;
|
|
140
|
+
advisory: AdvisoryRef;
|
|
141
|
+
affected: {
|
|
142
|
+
ranges: AffectedInterval[];
|
|
143
|
+
viaVersionsList: boolean;
|
|
144
|
+
};
|
|
145
|
+
/** Every `fixed` bound above the dependency's version, ascending. */
|
|
146
|
+
fixedIn: string[];
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Match each dependency against the index. A dependency whose version is not
|
|
150
|
+
* concrete (`unknown`, a range, an unresolved property) is never matched: the
|
|
151
|
+
* caller reports it as unresolved. One match per (dependency, vulnerability).
|
|
152
|
+
*/
|
|
153
|
+
export declare function matchAdvisories(deps: Dependency[], index: AdvisoryIndex): AdvisoryMatch[];
|
|
154
|
+
/** A version the matcher may compare: one token, no range or unresolved reference. */
|
|
155
|
+
export declare function isConcreteVersion(version: string): boolean;
|
|
156
|
+
export interface DeltaMatch extends AdvisoryMatch {
|
|
157
|
+
baselineVersions: string[];
|
|
158
|
+
headVersions: string[];
|
|
159
|
+
}
|
|
160
|
+
export interface AdvisoryDelta {
|
|
161
|
+
/** Matched at baseline, not at head (keyed by package name and advisory id). */
|
|
162
|
+
removed: DeltaMatch[];
|
|
163
|
+
/** Matched at head, not at baseline. */
|
|
164
|
+
added: DeltaMatch[];
|
|
165
|
+
/** Matched at both. */
|
|
166
|
+
persisting: DeltaMatch[];
|
|
167
|
+
}
|
|
168
|
+
export interface DependencyDelta {
|
|
169
|
+
added: Dependency[];
|
|
170
|
+
removed: Dependency[];
|
|
171
|
+
changed: Array<{
|
|
172
|
+
name: string;
|
|
173
|
+
from: string[];
|
|
174
|
+
to: string[];
|
|
175
|
+
head: Dependency[];
|
|
176
|
+
}>;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Advisory delta between two pins matched under the same records. Each entry
|
|
180
|
+
* is a full match (the head side for `added` and `persisting`, the baseline
|
|
181
|
+
* side for `removed`) carrying the versions seen on both sides.
|
|
182
|
+
*/
|
|
183
|
+
export declare function diffAdvisoryMatches(baseline: AdvisoryMatch[], head: AdvisoryMatch[]): AdvisoryDelta;
|
|
184
|
+
/** Resolved-set drift between two pins, by package name. */
|
|
185
|
+
export declare function diffDependencySets(baseline: Dependency[], head: Dependency[]): DependencyDelta;
|
|
186
|
+
//# sourceMappingURL=advisories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advisories.d.ts","sourceRoot":"","sources":["../../src/analysis/advisories.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAQvD,gEAAgE;AAChE,MAAM,WAAW,iBAAiB;IAChC,6DAA6D;IAC7D,GAAG,EAAE,MAAM,CAAC;IACZ,6CAA6C;IAC7C,UAAU,EAAE,SAAS,CAAC;IACtB,wDAAwD;IACxD,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAC1C,sDAAsD;IACtD,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,qDAAqD;IACrD,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IACxC,+EAA+E;IAC/E,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACzC;AAID,gEAAgE;AAChE,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAiB3E,CAAC;AAmBF,MAAM,WAAW,QAAQ;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5D,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,iBAAiB,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,IAAI,CAaxE;AAMD,yEAAyE;AACzE,MAAM,WAAW,aAAa;IAC5B,kEAAkE;IAClE,EAAE,EAAE,MAAM,CAAC;IACX,4DAA4D;IAC5D,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,SAAS,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,yEAAyE;IACzE,SAAS,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzE,6DAA6D;IAC7D,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;CACzC;AAOD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,SAAS,SAAU,GAAG,aAAa,CA0E3F;AAMD,MAAM,WAAW,gBAAgB;IAC/B,iEAAiE;IACjE,UAAU,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6BAA6B;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,GAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,MAAY,GAAG,gBAAgB,EAAE,CAyBnH;AAaD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjD,gFAAgF;IAChF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,EAAE,WAAW,CAAC;IACtB,QAAQ,EAAE;QAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;QAAC,eAAe,EAAE,OAAO,CAAA;KAAE,CAAC;IACnE,qEAAqE;IACrE,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAqCD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,aAAa,GAAG,aAAa,EAAE,CAkDzF;AAED,sFAAsF;AACtF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE1D;AAMD,MAAM,WAAW,UAAW,SAAQ,aAAa;IAC/C,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,gFAAgF;IAChF,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,wCAAwC;IACxC,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,uBAAuB;IACvB,UAAU,EAAE,UAAU,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,EAAE,EAAE,MAAM,EAAE,CAAC;QAAC,IAAI,EAAE,UAAU,EAAE,CAAA;KAAE,CAAC,CAAC;CACpF;AAkBD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,aAAa,CAenG;AAED,4DAA4D;AAC5D,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,eAAe,CAyB9F"}
|
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Known-vulnerability matching of a resolved dependency set against advisory
|
|
3
|
+
* records in the OSV schema (https://ossf.github.io/osv-schema/).
|
|
4
|
+
*
|
|
5
|
+
* The library ships no advisory data and fetches none: the caller parses the
|
|
6
|
+
* records of a snapshot it chose (for example the unzipped per-ecosystem
|
|
7
|
+
* export of OSV.dev) and passes them in, so the same set, records and engine
|
|
8
|
+
* version always give the same answer. Facts only: which advisory affects
|
|
9
|
+
* which coordinate, by which range, and which later versions are fixed.
|
|
10
|
+
* Severity is copied from the record; nothing is ranked or scored here.
|
|
11
|
+
*
|
|
12
|
+
* Ecosystems with an ordering (see {@link ADVISORY_ECOSYSTEMS}): `Maven`
|
|
13
|
+
* (Maven's `ComparableVersion` order, `ECOSYSTEM` ranges) and `npm` (SemVer
|
|
14
|
+
* 2.0 precedence, `SEMVER` ranges). Any other ecosystem name keeps the
|
|
15
|
+
* original behaviour: Maven order over `ECOSYSTEM` ranges, names as given.
|
|
16
|
+
*/
|
|
17
|
+
import { compareMavenVersions } from './maven-version.js';
|
|
18
|
+
import { compareSemver, parseSemver } from './semver-version.js';
|
|
19
|
+
const asIs = (n) => n;
|
|
20
|
+
/** The ecosystems this library can order, keyed by OSV name. */
|
|
21
|
+
export const ADVISORY_ECOSYSTEMS = {
|
|
22
|
+
Maven: {
|
|
23
|
+
osv: 'Maven',
|
|
24
|
+
dependency: 'maven',
|
|
25
|
+
compare: compareMavenVersions,
|
|
26
|
+
rangeTypes: ['ECOSYSTEM'],
|
|
27
|
+
isVersion: () => true,
|
|
28
|
+
normalizeName: asIs,
|
|
29
|
+
},
|
|
30
|
+
npm: {
|
|
31
|
+
osv: 'npm',
|
|
32
|
+
dependency: 'npm',
|
|
33
|
+
compare: compareSemver,
|
|
34
|
+
rangeTypes: ['SEMVER', 'ECOSYSTEM'],
|
|
35
|
+
isVersion: (v) => parseSemver(v) !== null,
|
|
36
|
+
normalizeName: asIs,
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
/** Rules for an index; unknown ecosystems keep the original Maven behaviour. */
|
|
40
|
+
function rulesFor(ecosystem) {
|
|
41
|
+
const known = ADVISORY_ECOSYSTEMS[ecosystem];
|
|
42
|
+
if (known)
|
|
43
|
+
return { ...known, filterDependencies: known.osv !== 'Maven' };
|
|
44
|
+
return { ...ADVISORY_ECOSYSTEMS.Maven, osv: ecosystem, filterDependencies: false };
|
|
45
|
+
}
|
|
46
|
+
/** Version order for a dependency's ecosystem (Maven order when unknown). */
|
|
47
|
+
function compareForDependency(eco) {
|
|
48
|
+
for (const r of Object.values(ADVISORY_ECOSYSTEMS))
|
|
49
|
+
if (r.dependency === eco)
|
|
50
|
+
return r.compare;
|
|
51
|
+
return compareMavenVersions;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Read one OSV record from JSON text or an already-parsed value. Returns null
|
|
55
|
+
* for anything that is not a record (no string `id` or `modified`), so a
|
|
56
|
+
* stray file in a snapshot directory is skipped rather than fatal.
|
|
57
|
+
*/
|
|
58
|
+
export function parseOsvRecord(input) {
|
|
59
|
+
let value = input;
|
|
60
|
+
if (typeof input === 'string') {
|
|
61
|
+
try {
|
|
62
|
+
value = JSON.parse(input);
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (!value || typeof value !== 'object')
|
|
69
|
+
return null;
|
|
70
|
+
const r = value;
|
|
71
|
+
if (typeof r.id !== 'string' || typeof r.modified !== 'string')
|
|
72
|
+
return null;
|
|
73
|
+
return r;
|
|
74
|
+
}
|
|
75
|
+
function aliasOrder(a, b) {
|
|
76
|
+
const rank = (s) => (s.startsWith('CVE-') ? 0 : s.startsWith('GHSA-') ? 1 : 2);
|
|
77
|
+
return rank(a) - rank(b) || (a < b ? -1 : a > b ? 1 : 0);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Build the matching index for one ecosystem. Records whose ids or aliases
|
|
81
|
+
* intersect are merged into one group, so a vulnerability published under two
|
|
82
|
+
* ids is reported once. Withdrawn records are listed and never matched.
|
|
83
|
+
*/
|
|
84
|
+
export function buildAdvisoryIndex(records, ecosystem = 'Maven') {
|
|
85
|
+
const rules = rulesFor(ecosystem);
|
|
86
|
+
let snapshotDate = null;
|
|
87
|
+
const withdrawn = [];
|
|
88
|
+
const live = [];
|
|
89
|
+
for (const r of records) {
|
|
90
|
+
if (snapshotDate === null || r.modified > snapshotDate)
|
|
91
|
+
snapshotDate = r.modified;
|
|
92
|
+
if (r.withdrawn) {
|
|
93
|
+
withdrawn.push({ id: r.id, aliases: [...(r.aliases ?? [])].sort(aliasOrder), withdrawnAt: r.withdrawn });
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
if (r.affected?.some((a) => a.package?.ecosystem === ecosystem))
|
|
97
|
+
live.push(r);
|
|
98
|
+
}
|
|
99
|
+
withdrawn.sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));
|
|
100
|
+
// Union-find over every id and alias.
|
|
101
|
+
const parent = new Map();
|
|
102
|
+
const find = (x) => {
|
|
103
|
+
let root = x;
|
|
104
|
+
while (parent.get(root) !== root)
|
|
105
|
+
root = parent.get(root);
|
|
106
|
+
let cur = x;
|
|
107
|
+
while (parent.get(cur) !== root) {
|
|
108
|
+
const next = parent.get(cur);
|
|
109
|
+
parent.set(cur, root);
|
|
110
|
+
cur = next;
|
|
111
|
+
}
|
|
112
|
+
return root;
|
|
113
|
+
};
|
|
114
|
+
const add = (x) => {
|
|
115
|
+
if (!parent.has(x))
|
|
116
|
+
parent.set(x, x);
|
|
117
|
+
};
|
|
118
|
+
const union = (a, b) => {
|
|
119
|
+
add(a);
|
|
120
|
+
add(b);
|
|
121
|
+
const ra = find(a);
|
|
122
|
+
const rb = find(b);
|
|
123
|
+
if (ra !== rb)
|
|
124
|
+
parent.set(ra, rb);
|
|
125
|
+
};
|
|
126
|
+
for (const r of live) {
|
|
127
|
+
add(r.id);
|
|
128
|
+
for (const al of r.aliases ?? [])
|
|
129
|
+
union(r.id, al);
|
|
130
|
+
}
|
|
131
|
+
const groups = new Map();
|
|
132
|
+
for (const r of live) {
|
|
133
|
+
const root = find(r.id);
|
|
134
|
+
const list = groups.get(root) ?? [];
|
|
135
|
+
list.push(r);
|
|
136
|
+
groups.set(root, list);
|
|
137
|
+
}
|
|
138
|
+
const byPackage = new Map();
|
|
139
|
+
for (const recs of groups.values()) {
|
|
140
|
+
recs.sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));
|
|
141
|
+
const ids = new Set();
|
|
142
|
+
for (const r of recs) {
|
|
143
|
+
ids.add(r.id);
|
|
144
|
+
for (const al of r.aliases ?? [])
|
|
145
|
+
ids.add(al);
|
|
146
|
+
}
|
|
147
|
+
const sorted = [...ids].sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
|
|
148
|
+
const recordIds = new Set(recs.map((r) => r.id));
|
|
149
|
+
const id = sorted.find((x) => x.startsWith('GHSA-') && recordIds.has(x)) ?? [...recordIds].sort()[0];
|
|
150
|
+
const group = { id, aliases: sorted.filter((x) => x !== id).sort(aliasOrder), records: recs };
|
|
151
|
+
const names = new Set();
|
|
152
|
+
for (const r of recs)
|
|
153
|
+
for (const a of r.affected ?? [])
|
|
154
|
+
if (a.package.ecosystem === ecosystem)
|
|
155
|
+
names.add(rules.normalizeName(a.package.name));
|
|
156
|
+
for (const n of names) {
|
|
157
|
+
const list = byPackage.get(n) ?? [];
|
|
158
|
+
list.push(group);
|
|
159
|
+
byPackage.set(n, list);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
for (const list of byPackage.values())
|
|
163
|
+
list.sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));
|
|
164
|
+
return { ecosystem, records: live.length, snapshotDate, withdrawn, byPackage };
|
|
165
|
+
}
|
|
166
|
+
const cmp = compareMavenVersions;
|
|
167
|
+
/**
|
|
168
|
+
* Turn one range's events into intervals, in version order (Maven order unless
|
|
169
|
+
* another `compare` is given).
|
|
170
|
+
*/
|
|
171
|
+
export function rangeIntervals(range, compare = cmp) {
|
|
172
|
+
const events = range.events
|
|
173
|
+
.filter((e) => e.introduced !== undefined || e.fixed !== undefined || e.last_affected !== undefined)
|
|
174
|
+
.map((e) => {
|
|
175
|
+
const v = (e.introduced ?? e.fixed ?? e.last_affected);
|
|
176
|
+
return { e, v };
|
|
177
|
+
})
|
|
178
|
+
.sort((a, b) => {
|
|
179
|
+
if (a.v === '0' || b.v === '0')
|
|
180
|
+
return a.v === b.v ? 0 : a.v === '0' ? -1 : 1;
|
|
181
|
+
return compare(a.v, b.v);
|
|
182
|
+
});
|
|
183
|
+
const out = [];
|
|
184
|
+
let open = null;
|
|
185
|
+
for (const { e, v } of events) {
|
|
186
|
+
if (e.introduced !== undefined) {
|
|
187
|
+
if (!open)
|
|
188
|
+
open = { introduced: v };
|
|
189
|
+
}
|
|
190
|
+
else if (open) {
|
|
191
|
+
if (e.fixed !== undefined)
|
|
192
|
+
open.fixed = v;
|
|
193
|
+
else
|
|
194
|
+
open.lastAffected = v;
|
|
195
|
+
out.push(open);
|
|
196
|
+
open = null;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
if (open)
|
|
200
|
+
out.push(open);
|
|
201
|
+
return out;
|
|
202
|
+
}
|
|
203
|
+
function inInterval(version, iv, compare) {
|
|
204
|
+
if (iv.introduced !== '0' && compare(version, iv.introduced) < 0)
|
|
205
|
+
return false;
|
|
206
|
+
if (iv.fixed !== undefined)
|
|
207
|
+
return compare(version, iv.fixed) < 0;
|
|
208
|
+
if (iv.lastAffected !== undefined)
|
|
209
|
+
return compare(version, iv.lastAffected) <= 0;
|
|
210
|
+
return true;
|
|
211
|
+
}
|
|
212
|
+
function advisoryRef(g) {
|
|
213
|
+
const first = g.records[0];
|
|
214
|
+
const severity = [];
|
|
215
|
+
const seenSev = new Set();
|
|
216
|
+
let databaseSeverity;
|
|
217
|
+
let modified = first.modified;
|
|
218
|
+
let published;
|
|
219
|
+
let summary;
|
|
220
|
+
const references = new Set();
|
|
221
|
+
for (const r of g.records) {
|
|
222
|
+
for (const s of r.severity ?? []) {
|
|
223
|
+
const k = `${s.type}|${s.score}`;
|
|
224
|
+
if (!seenSev.has(k)) {
|
|
225
|
+
seenSev.add(k);
|
|
226
|
+
severity.push({ type: s.type, score: s.score });
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
if (!databaseSeverity && typeof r.database_specific?.severity === 'string')
|
|
230
|
+
databaseSeverity = r.database_specific.severity;
|
|
231
|
+
if (r.modified > modified)
|
|
232
|
+
modified = r.modified;
|
|
233
|
+
if (r.published && (!published || r.published < published))
|
|
234
|
+
published = r.published;
|
|
235
|
+
if (!summary && r.summary)
|
|
236
|
+
summary = r.summary;
|
|
237
|
+
for (const ref of r.references ?? [])
|
|
238
|
+
references.add(ref.url);
|
|
239
|
+
}
|
|
240
|
+
return {
|
|
241
|
+
id: g.id,
|
|
242
|
+
aliases: g.aliases,
|
|
243
|
+
...(summary ? { summary } : {}),
|
|
244
|
+
...(published ? { published } : {}),
|
|
245
|
+
modified,
|
|
246
|
+
severity,
|
|
247
|
+
...(databaseSeverity ? { databaseSeverity } : {}),
|
|
248
|
+
references: [...references].sort(),
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Match each dependency against the index. A dependency whose version is not
|
|
253
|
+
* concrete (`unknown`, a range, an unresolved property) is never matched: the
|
|
254
|
+
* caller reports it as unresolved. One match per (dependency, vulnerability).
|
|
255
|
+
*/
|
|
256
|
+
export function matchAdvisories(deps, index) {
|
|
257
|
+
const rules = rulesFor(index.ecosystem);
|
|
258
|
+
const c = rules.compare;
|
|
259
|
+
const out = [];
|
|
260
|
+
for (const d of deps) {
|
|
261
|
+
if (rules.filterDependencies && d.ecosystem !== rules.dependency)
|
|
262
|
+
continue;
|
|
263
|
+
if (!isConcreteVersion(d.version) || !rules.isVersion(d.version))
|
|
264
|
+
continue;
|
|
265
|
+
const name = rules.normalizeName(d.name);
|
|
266
|
+
const groups = index.byPackage.get(name);
|
|
267
|
+
if (!groups)
|
|
268
|
+
continue;
|
|
269
|
+
for (const g of groups) {
|
|
270
|
+
const ranges = [];
|
|
271
|
+
const fixed = new Set();
|
|
272
|
+
let hitRange = false;
|
|
273
|
+
let hitList = false;
|
|
274
|
+
for (const r of g.records) {
|
|
275
|
+
for (const a of r.affected ?? []) {
|
|
276
|
+
if (a.package.ecosystem !== index.ecosystem || rules.normalizeName(a.package.name) !== name)
|
|
277
|
+
continue;
|
|
278
|
+
if (a.versions?.includes(d.version))
|
|
279
|
+
hitList = true;
|
|
280
|
+
for (const range of a.ranges ?? []) {
|
|
281
|
+
if (!rules.rangeTypes.includes(range.type))
|
|
282
|
+
continue;
|
|
283
|
+
for (const iv of rangeIntervals(range, c)) {
|
|
284
|
+
if (!inInterval(d.version, iv, c))
|
|
285
|
+
continue;
|
|
286
|
+
hitRange = true;
|
|
287
|
+
if (!ranges.some((x) => x.introduced === iv.introduced && x.fixed === iv.fixed && x.lastAffected === iv.lastAffected))
|
|
288
|
+
ranges.push(iv);
|
|
289
|
+
if (iv.fixed !== undefined)
|
|
290
|
+
fixed.add(iv.fixed);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
if (!hitRange && !hitList)
|
|
296
|
+
continue;
|
|
297
|
+
// Later fixed bounds of the same package (other branches) are fix candidates too.
|
|
298
|
+
for (const r of g.records) {
|
|
299
|
+
for (const a of r.affected ?? []) {
|
|
300
|
+
if (a.package.ecosystem !== index.ecosystem || rules.normalizeName(a.package.name) !== name)
|
|
301
|
+
continue;
|
|
302
|
+
for (const range of a.ranges ?? []) {
|
|
303
|
+
if (!rules.rangeTypes.includes(range.type))
|
|
304
|
+
continue;
|
|
305
|
+
for (const iv of rangeIntervals(range, c))
|
|
306
|
+
if (iv.fixed !== undefined && c(iv.fixed, d.version) > 0)
|
|
307
|
+
fixed.add(iv.fixed);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
out.push({
|
|
312
|
+
dependency: d,
|
|
313
|
+
advisory: advisoryRef(g),
|
|
314
|
+
affected: { ranges, viaVersionsList: hitList && !hitRange },
|
|
315
|
+
fixedIn: [...fixed].filter((f) => c(f, d.version) > 0).sort(c),
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
return out;
|
|
320
|
+
}
|
|
321
|
+
/** A version the matcher may compare: one token, no range or unresolved reference. */
|
|
322
|
+
export function isConcreteVersion(version) {
|
|
323
|
+
return /^[0-9A-Za-z][\w.+-]*$/.test(version) && version !== 'unknown';
|
|
324
|
+
}
|
|
325
|
+
const byKey = (m) => `${m.dependency.ecosystem}\u0000${m.dependency.name}\u0000${m.advisory.id}`;
|
|
326
|
+
function group(matches) {
|
|
327
|
+
const out = new Map();
|
|
328
|
+
for (const m of matches) {
|
|
329
|
+
const k = byKey(m);
|
|
330
|
+
const list = out.get(k) ?? [];
|
|
331
|
+
list.push(m);
|
|
332
|
+
out.set(k, list);
|
|
333
|
+
}
|
|
334
|
+
return out;
|
|
335
|
+
}
|
|
336
|
+
const versionsOf = (ms) => ms ? [...new Set(ms.map((m) => m.dependency.version))].sort(compareForDependency(ms[0].dependency.ecosystem)) : [];
|
|
337
|
+
/**
|
|
338
|
+
* Advisory delta between two pins matched under the same records. Each entry
|
|
339
|
+
* is a full match (the head side for `added` and `persisting`, the baseline
|
|
340
|
+
* side for `removed`) carrying the versions seen on both sides.
|
|
341
|
+
*/
|
|
342
|
+
export function diffAdvisoryMatches(baseline, head) {
|
|
343
|
+
const b = group(baseline);
|
|
344
|
+
const h = group(head);
|
|
345
|
+
const delta = { removed: [], added: [], persisting: [] };
|
|
346
|
+
const keys = [...new Set([...b.keys(), ...h.keys()])].sort();
|
|
347
|
+
for (const k of keys) {
|
|
348
|
+
const bs = b.get(k);
|
|
349
|
+
const hs = h.get(k);
|
|
350
|
+
const base = (hs ?? bs);
|
|
351
|
+
const entry = { ...base[0], baselineVersions: versionsOf(bs), headVersions: versionsOf(hs) };
|
|
352
|
+
if (bs && hs)
|
|
353
|
+
delta.persisting.push(entry);
|
|
354
|
+
else if (bs)
|
|
355
|
+
delta.removed.push(entry);
|
|
356
|
+
else
|
|
357
|
+
delta.added.push(entry);
|
|
358
|
+
}
|
|
359
|
+
return delta;
|
|
360
|
+
}
|
|
361
|
+
/** Resolved-set drift between two pins, by package name. */
|
|
362
|
+
export function diffDependencySets(baseline, head) {
|
|
363
|
+
const index = (deps) => {
|
|
364
|
+
const m = new Map();
|
|
365
|
+
for (const d of deps) {
|
|
366
|
+
const k = `${d.ecosystem}\u0000${d.name}`;
|
|
367
|
+
m.set(k, [...(m.get(k) ?? []), d]);
|
|
368
|
+
}
|
|
369
|
+
return m;
|
|
370
|
+
};
|
|
371
|
+
const b = index(baseline);
|
|
372
|
+
const h = index(head);
|
|
373
|
+
const out = { added: [], removed: [], changed: [] };
|
|
374
|
+
for (const key of [...new Set([...b.keys(), ...h.keys()])].sort()) {
|
|
375
|
+
const bs = b.get(key);
|
|
376
|
+
const hs = h.get(key);
|
|
377
|
+
if (!bs)
|
|
378
|
+
out.added.push(...hs);
|
|
379
|
+
else if (!hs)
|
|
380
|
+
out.removed.push(...bs);
|
|
381
|
+
else {
|
|
382
|
+
const order = compareForDependency(hs[0].ecosystem);
|
|
383
|
+
const from = [...new Set(bs.map((d) => d.version))].sort(order);
|
|
384
|
+
const to = [...new Set(hs.map((d) => d.version))].sort(order);
|
|
385
|
+
if (from.join('\u0000') !== to.join('\u0000'))
|
|
386
|
+
out.changed.push({ name: hs[0].name, from, to, head: hs });
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
return out;
|
|
390
|
+
}
|
|
391
|
+
//# sourceMappingURL=advisories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advisories.js","sourceRoot":"","sources":["../../src/analysis/advisories.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cognium-dev#999 — security results on lines that are only a comment.
|
|
3
|
+
*
|
|
4
|
+
* Several passes scan source text line by line (LanguageSourcesPass,
|
|
5
|
+
* mass-assignment, tls-verify-disabled), so a doc comment such as
|
|
6
|
+
* ` * JSON.parse(req.body)` produced a high-severity finding. This answers,
|
|
7
|
+
* from the syntax tree, whether a line holds nothing but comment text: the
|
|
8
|
+
* first non-blank column sits inside a comment node that runs to the end of
|
|
9
|
+
* the line's content. Mixed lines (`foo(x); // note`) are code and keep their
|
|
10
|
+
* results. String literals are not comments and are untouched.
|
|
11
|
+
*/
|
|
12
|
+
import type { Node } from 'web-tree-sitter';
|
|
13
|
+
export declare function makeCommentOnlyLineTest(root: Node, code: string): (line: number) => boolean;
|
|
14
|
+
//# sourceMappingURL=comment-lines.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comment-lines.d.ts","sourceRoot":"","sources":["../../src/analysis/comment-lines.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAE5C,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAiC3F"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export function makeCommentOnlyLineTest(root, code) {
|
|
2
|
+
const lines = code.split('\n');
|
|
3
|
+
const cache = new Map();
|
|
4
|
+
return (line) => {
|
|
5
|
+
const hit = cache.get(line);
|
|
6
|
+
if (hit !== undefined)
|
|
7
|
+
return hit;
|
|
8
|
+
let result = false;
|
|
9
|
+
const text = lines[line - 1];
|
|
10
|
+
if (text !== undefined) {
|
|
11
|
+
const first = text.search(/\S/);
|
|
12
|
+
if (first >= 0) {
|
|
13
|
+
const end = text.trimEnd().length;
|
|
14
|
+
const node = root.descendantForPosition({ row: line - 1, column: first });
|
|
15
|
+
let n = node;
|
|
16
|
+
// Climb to the comment node itself (some grammars nest a content child).
|
|
17
|
+
while (n && !/comment/.test(n.type) && n.startPosition.row === line - 1 &&
|
|
18
|
+
n.startPosition.column === first && n.parent) {
|
|
19
|
+
n = n.parent;
|
|
20
|
+
}
|
|
21
|
+
if (n && /comment/.test(n.type)) {
|
|
22
|
+
const startsBefore = n.startPosition.row < line - 1 ||
|
|
23
|
+
(n.startPosition.row === line - 1 && n.startPosition.column <= first);
|
|
24
|
+
const endsAfter = n.endPosition.row > line - 1 ||
|
|
25
|
+
(n.endPosition.row === line - 1 && n.endPosition.column >= end);
|
|
26
|
+
result = startsBefore && endsAfter;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
cache.set(line, result);
|
|
31
|
+
return result;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=comment-lines.js.map
|