@quantakrypto/core 0.4.2 → 0.4.4
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/LICENSE +201 -0
- package/README.md +38 -10
- package/dist/agent-types.js.map +1 -1
- package/dist/baseline.js.map +1 -1
- package/dist/cache.js.map +1 -1
- package/dist/cbom-merge.d.ts +9 -0
- package/dist/cbom-merge.d.ts.map +1 -0
- package/dist/cbom-merge.js +99 -0
- package/dist/cbom-merge.js.map +1 -0
- package/dist/cbom.js.map +1 -1
- package/dist/changed.js.map +1 -1
- package/dist/codemods/config-toggle.js.map +1 -1
- package/dist/codemods/registry.js.map +1 -1
- package/dist/comments.d.ts +29 -2
- package/dist/comments.d.ts.map +1 -1
- package/dist/comments.js +178 -18
- package/dist/comments.js.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/cwe.js.map +1 -1
- package/dist/dependencies.d.ts +3 -2
- package/dist/dependencies.d.ts.map +1 -1
- package/dist/dependencies.js +138 -2
- package/dist/dependencies.js.map +1 -1
- package/dist/detect-utils.d.ts +19 -4
- package/dist/detect-utils.d.ts.map +1 -1
- package/dist/detect-utils.js +43 -6
- package/dist/detect-utils.js.map +1 -1
- package/dist/detectors/c.d.ts +4 -2
- package/dist/detectors/c.d.ts.map +1 -1
- package/dist/detectors/c.js +382 -3
- package/dist/detectors/c.js.map +1 -1
- package/dist/detectors/cicd.d.ts +27 -0
- package/dist/detectors/cicd.d.ts.map +1 -0
- package/dist/detectors/cicd.js +116 -0
- package/dist/detectors/cicd.js.map +1 -0
- package/dist/detectors/cloud-kms.d.ts +21 -0
- package/dist/detectors/cloud-kms.d.ts.map +1 -0
- package/dist/detectors/cloud-kms.js +57 -0
- package/dist/detectors/cloud-kms.js.map +1 -0
- package/dist/detectors/cloudformation.d.ts +30 -0
- package/dist/detectors/cloudformation.d.ts.map +1 -0
- package/dist/detectors/cloudformation.js +170 -0
- package/dist/detectors/cloudformation.js.map +1 -0
- package/dist/detectors/csharp.d.ts.map +1 -1
- package/dist/detectors/csharp.js +141 -3
- package/dist/detectors/csharp.js.map +1 -1
- package/dist/detectors/database.d.ts +17 -0
- package/dist/detectors/database.d.ts.map +1 -0
- package/dist/detectors/database.js +60 -0
- package/dist/detectors/database.js.map +1 -0
- package/dist/detectors/dnssec.d.ts +55 -0
- package/dist/detectors/dnssec.d.ts.map +1 -0
- package/dist/detectors/dnssec.js +107 -0
- package/dist/detectors/dnssec.js.map +1 -0
- package/dist/detectors/elixir.d.ts +20 -0
- package/dist/detectors/elixir.d.ts.map +1 -0
- package/dist/detectors/elixir.js +195 -0
- package/dist/detectors/elixir.js.map +1 -0
- package/dist/detectors/go.d.ts +5 -3
- package/dist/detectors/go.d.ts.map +1 -1
- package/dist/detectors/go.js +187 -3
- package/dist/detectors/go.js.map +1 -1
- package/dist/detectors/java.d.ts.map +1 -1
- package/dist/detectors/java.js +169 -4
- package/dist/detectors/java.js.map +1 -1
- package/dist/detectors/jose.d.ts +20 -0
- package/dist/detectors/jose.d.ts.map +1 -0
- package/dist/detectors/jose.js +62 -0
- package/dist/detectors/jose.js.map +1 -0
- package/dist/detectors/jwk.d.ts +25 -0
- package/dist/detectors/jwk.d.ts.map +1 -0
- package/dist/detectors/jwk.js +95 -0
- package/dist/detectors/jwk.js.map +1 -0
- package/dist/detectors/k8s.d.ts +17 -0
- package/dist/detectors/k8s.d.ts.map +1 -0
- package/dist/detectors/k8s.js +85 -0
- package/dist/detectors/k8s.js.map +1 -0
- package/dist/detectors/mesh.d.ts +35 -0
- package/dist/detectors/mesh.d.ts.map +1 -0
- package/dist/detectors/mesh.js +109 -0
- package/dist/detectors/mesh.js.map +1 -0
- package/dist/detectors/messaging.d.ts +16 -0
- package/dist/detectors/messaging.d.ts.map +1 -0
- package/dist/detectors/messaging.js +72 -0
- package/dist/detectors/messaging.js.map +1 -0
- package/dist/detectors/pem.d.ts.map +1 -1
- package/dist/detectors/pem.js +50 -2
- package/dist/detectors/pem.js.map +1 -1
- package/dist/detectors/php.d.ts +24 -0
- package/dist/detectors/php.d.ts.map +1 -0
- package/dist/detectors/php.js +167 -0
- package/dist/detectors/php.js.map +1 -0
- package/dist/detectors/python.d.ts.map +1 -1
- package/dist/detectors/python.js +144 -3
- package/dist/detectors/python.js.map +1 -1
- package/dist/detectors/ruby.d.ts +9 -5
- package/dist/detectors/ruby.d.ts.map +1 -1
- package/dist/detectors/ruby.js +122 -2
- package/dist/detectors/ruby.js.map +1 -1
- package/dist/detectors/rust.d.ts +8 -3
- package/dist/detectors/rust.d.ts.map +1 -1
- package/dist/detectors/rust.js +253 -3
- package/dist/detectors/rust.js.map +1 -1
- package/dist/detectors/secrets.d.ts +21 -0
- package/dist/detectors/secrets.d.ts.map +1 -0
- package/dist/detectors/secrets.js +79 -0
- package/dist/detectors/secrets.js.map +1 -0
- package/dist/detectors/source.d.ts.map +1 -1
- package/dist/detectors/source.js +305 -52
- package/dist/detectors/source.js.map +1 -1
- package/dist/detectors/stateful-hbs.d.ts +22 -0
- package/dist/detectors/stateful-hbs.d.ts.map +1 -0
- package/dist/detectors/stateful-hbs.js +142 -0
- package/dist/detectors/stateful-hbs.js.map +1 -0
- package/dist/detectors/terraform.d.ts +21 -0
- package/dist/detectors/terraform.d.ts.map +1 -0
- package/dist/detectors/terraform.js +123 -0
- package/dist/detectors/terraform.js.map +1 -0
- package/dist/detectors/vpn.d.ts +22 -0
- package/dist/detectors/vpn.d.ts.map +1 -0
- package/dist/detectors/vpn.js +99 -0
- package/dist/detectors/vpn.js.map +1 -0
- package/dist/errors.js.map +1 -1
- package/dist/evidence.d.ts +53 -0
- package/dist/evidence.d.ts.map +1 -0
- package/dist/evidence.js +81 -0
- package/dist/evidence.js.map +1 -0
- package/dist/index.d.ts +9 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -2
- package/dist/index.js.map +1 -1
- package/dist/inventory.d.ts +2 -0
- package/dist/inventory.d.ts.map +1 -1
- package/dist/inventory.js +27 -1
- package/dist/inventory.js.map +1 -1
- package/dist/parallel.js.map +1 -1
- package/dist/patch-policy.js.map +1 -1
- package/dist/policy.d.ts +67 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +115 -0
- package/dist/policy.js.map +1 -0
- package/dist/redact.d.ts.map +1 -1
- package/dist/redact.js +39 -0
- package/dist/redact.js.map +1 -1
- package/dist/registry.d.ts +2 -2
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +34 -2
- package/dist/registry.js.map +1 -1
- package/dist/remediate-pipeline.d.ts +3 -0
- package/dist/remediate-pipeline.d.ts.map +1 -1
- package/dist/remediate-pipeline.js +71 -0
- package/dist/remediate-pipeline.js.map +1 -1
- package/dist/remediate-request.js.map +1 -1
- package/dist/remediation.d.ts +9 -3
- package/dist/remediation.d.ts.map +1 -1
- package/dist/remediation.js +17 -5
- package/dist/remediation.js.map +1 -1
- package/dist/report.d.ts +9 -0
- package/dist/report.d.ts.map +1 -1
- package/dist/report.js +38 -0
- package/dist/report.js.map +1 -1
- package/dist/scan-worker.js.map +1 -1
- package/dist/scan.d.ts.map +1 -1
- package/dist/scan.js +8 -1
- package/dist/scan.js.map +1 -1
- package/dist/severity.js.map +1 -1
- package/dist/standards.d.ts +96 -0
- package/dist/standards.d.ts.map +1 -0
- package/dist/standards.js +107 -0
- package/dist/standards.js.map +1 -0
- package/dist/triage.js.map +1 -1
- package/dist/types.d.ts +2 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/verify.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/dist/walk.js.map +1 -1
- package/dist/worktree.js.map +1 -1
- package/package.json +1 -1
- package/src/cbom-merge.ts +116 -0
- package/src/comments.ts +183 -18
- package/src/dependencies.ts +144 -4
- package/src/detect-utils.ts +47 -6
- package/src/detectors/c.ts +411 -5
- package/src/detectors/cicd.ts +158 -0
- package/src/detectors/cloud-kms.ts +87 -0
- package/src/detectors/cloudformation.ts +215 -0
- package/src/detectors/csharp.ts +154 -3
- package/src/detectors/database.ts +88 -0
- package/src/detectors/dnssec.ts +186 -0
- package/src/detectors/elixir.ts +237 -0
- package/src/detectors/go.ts +209 -6
- package/src/detectors/java.ts +191 -4
- package/src/detectors/jose.ts +94 -0
- package/src/detectors/jwk.ts +128 -0
- package/src/detectors/k8s.ts +112 -0
- package/src/detectors/mesh.ts +154 -0
- package/src/detectors/messaging.ts +98 -0
- package/src/detectors/pem.ts +54 -2
- package/src/detectors/php.ts +225 -0
- package/src/detectors/python.ts +153 -3
- package/src/detectors/ruby.ts +138 -7
- package/src/detectors/rust.ts +282 -7
- package/src/detectors/secrets.ts +114 -0
- package/src/detectors/source.ts +382 -72
- package/src/detectors/stateful-hbs.ts +180 -0
- package/src/detectors/terraform.ts +154 -0
- package/src/detectors/vpn.ts +131 -0
- package/src/evidence.ts +135 -0
- package/src/index.ts +15 -1
- package/src/inventory.ts +31 -1
- package/src/policy.ts +180 -0
- package/src/redact.ts +41 -0
- package/src/registry.ts +34 -2
- package/src/remediate-pipeline.ts +78 -0
- package/src/remediation.ts +23 -8
- package/src/report.ts +48 -2
- package/src/scan.ts +13 -1
- package/src/standards.ts +186 -0
- package/src/types.ts +3 -1
- package/src/version.ts +1 -1
package/dist/comments.js
CHANGED
|
@@ -33,32 +33,61 @@ export function commentStyleForFile(file) {
|
|
|
33
33
|
return "hash";
|
|
34
34
|
return null;
|
|
35
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* Advance past a string / char literal starting at `content[i]` (a quote char);
|
|
38
|
+
* returns the index just after it. Two correctness rules a naive escape-scan got
|
|
39
|
+
* wrong (both verified as real bugs):
|
|
40
|
+
* - a `'` char literal must close within a short window (`'\u{10FFFF}'` is ~11
|
|
41
|
+
* chars); otherwise it is a Rust lifetime (`'a`) or a stray apostrophe, NOT a
|
|
42
|
+
* literal — return `i + 1` so the scan continues instead of consuming the
|
|
43
|
+
* rest of the file.
|
|
44
|
+
* - Go raw strings (backtick, when `rawBacktick`) do NOT process escapes, so a
|
|
45
|
+
* trailing backslash (`` `C:\` ``) must not swallow the closing delimiter.
|
|
46
|
+
*/
|
|
47
|
+
function skipQuoted(content, i, n, rawBacktick) {
|
|
48
|
+
const quote = content[i];
|
|
49
|
+
if (quote === "'") {
|
|
50
|
+
const limit = Math.min(n, i + 1 + 12);
|
|
51
|
+
let j = i + 1;
|
|
52
|
+
while (j < limit) {
|
|
53
|
+
if (content[j] === "\\") {
|
|
54
|
+
j += 2;
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
if (content[j] === "'")
|
|
58
|
+
return j + 1;
|
|
59
|
+
j++;
|
|
60
|
+
}
|
|
61
|
+
return i + 1; // a lifetime / stray apostrophe, not a char literal
|
|
62
|
+
}
|
|
63
|
+
const escapes = !(quote === "`" && rawBacktick);
|
|
64
|
+
let j = i + 1;
|
|
65
|
+
while (j < n) {
|
|
66
|
+
if (escapes && content[j] === "\\") {
|
|
67
|
+
j += 2;
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
if (content[j] === quote)
|
|
71
|
+
return j + 1;
|
|
72
|
+
j++;
|
|
73
|
+
}
|
|
74
|
+
return n;
|
|
75
|
+
}
|
|
36
76
|
/**
|
|
37
77
|
* Compute the comment spans (`[start, end)` offsets) of `content`, skipping over
|
|
38
78
|
* string literals so a comment marker inside a string is not treated as a
|
|
39
|
-
* comment. Spans are returned sorted and non-overlapping.
|
|
79
|
+
* comment. Spans are returned sorted and non-overlapping. `rawBacktick` (Go)
|
|
80
|
+
* makes backtick strings raw (no escapes).
|
|
40
81
|
*/
|
|
41
|
-
export function commentSpans(content, style) {
|
|
82
|
+
export function commentSpans(content, style, rawBacktick = false) {
|
|
42
83
|
const spans = [];
|
|
43
84
|
const n = content.length;
|
|
44
85
|
let i = 0;
|
|
45
86
|
while (i < n) {
|
|
46
87
|
const c = content[i];
|
|
47
|
-
// String /
|
|
88
|
+
// String / char literal: skip past it (lexically correct for lifetimes + raw strings).
|
|
48
89
|
if (c === '"' || c === "'" || c === "`") {
|
|
49
|
-
|
|
50
|
-
i++;
|
|
51
|
-
while (i < n) {
|
|
52
|
-
if (content[i] === "\\") {
|
|
53
|
-
i += 2;
|
|
54
|
-
continue;
|
|
55
|
-
}
|
|
56
|
-
if (content[i] === quote) {
|
|
57
|
-
i++;
|
|
58
|
-
break;
|
|
59
|
-
}
|
|
60
|
-
i++;
|
|
61
|
-
}
|
|
90
|
+
i = skipQuoted(content, i, n, rawBacktick);
|
|
62
91
|
continue;
|
|
63
92
|
}
|
|
64
93
|
if (style === "c" && c === "/" && content[i + 1] === "/") {
|
|
@@ -90,6 +119,55 @@ export function commentSpans(content, style) {
|
|
|
90
119
|
}
|
|
91
120
|
return spans;
|
|
92
121
|
}
|
|
122
|
+
/**
|
|
123
|
+
* Compute Python triple-quoted string spans (`"""…"""` / `'''…'''`). These are
|
|
124
|
+
* docstrings / prose in practice, so a crypto *name* mentioned inside one
|
|
125
|
+
* (`:param key_type: eg "ssh-ed25519"`) should not fire a token finding — but a
|
|
126
|
+
* PEM key pasted into one is still real material, so {@link stripCommentFindings}
|
|
127
|
+
* exempts `pem-*` rules. Comments and normal strings are skipped so a `"""`
|
|
128
|
+
* delimiter inside them is not mis-detected.
|
|
129
|
+
*/
|
|
130
|
+
export function pythonDocstringSpans(content) {
|
|
131
|
+
const spans = [];
|
|
132
|
+
const n = content.length;
|
|
133
|
+
let i = 0;
|
|
134
|
+
while (i < n) {
|
|
135
|
+
const c = content[i];
|
|
136
|
+
if (c === "#") {
|
|
137
|
+
i++;
|
|
138
|
+
while (i < n && content[i] !== "\n")
|
|
139
|
+
i++;
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
if ((c === '"' || c === "'") && content[i + 1] === c && content[i + 2] === c) {
|
|
143
|
+
const start = i;
|
|
144
|
+
i += 3;
|
|
145
|
+
while (i < n && !(content[i] === c && content[i + 1] === c && content[i + 2] === c))
|
|
146
|
+
i++;
|
|
147
|
+
i = Math.min(n, i + 3);
|
|
148
|
+
spans.push([start, i]);
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
if (c === '"' || c === "'") {
|
|
152
|
+
const q = c;
|
|
153
|
+
i++;
|
|
154
|
+
while (i < n) {
|
|
155
|
+
if (content[i] === "\\") {
|
|
156
|
+
i += 2;
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
if (content[i] === q) {
|
|
160
|
+
i++;
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
i++;
|
|
164
|
+
}
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
i++;
|
|
168
|
+
}
|
|
169
|
+
return spans;
|
|
170
|
+
}
|
|
93
171
|
/** True if `offset` falls inside one of the (sorted, non-overlapping) spans. */
|
|
94
172
|
export function offsetInSpans(spans, offset) {
|
|
95
173
|
let lo = 0;
|
|
@@ -145,8 +223,10 @@ export function stripCommentFindings(findings, content, file) {
|
|
|
145
223
|
const style = commentStyleForFile(file);
|
|
146
224
|
if (!style)
|
|
147
225
|
return findings;
|
|
148
|
-
const spans = commentSpans(content, style);
|
|
149
|
-
|
|
226
|
+
const spans = commentSpans(content, style, /\.go$/i.test(file));
|
|
227
|
+
// Python docstrings suppress prose *token* rules but keep real PEM material.
|
|
228
|
+
const docSpans = style === "hash" ? pythonDocstringSpans(content) : [];
|
|
229
|
+
if (spans.length === 0 && docSpans.length === 0)
|
|
150
230
|
return findings;
|
|
151
231
|
// 1-based line → start offset, to turn a finding's (line, column) back into an
|
|
152
232
|
// absolute offset (column is 1-based: offset = lineStart + column - 1).
|
|
@@ -158,6 +238,86 @@ export function stripCommentFindings(findings, content, file) {
|
|
|
158
238
|
return findings.filter((f) => {
|
|
159
239
|
const start = lineStarts[f.location.line - 1] ?? 0;
|
|
160
240
|
const offset = start + ((f.location.column ?? 1) - 1);
|
|
241
|
+
if (offsetInSpans(spans, offset))
|
|
242
|
+
return false;
|
|
243
|
+
if (docSpans.length > 0 && !f.ruleId.startsWith("pem-") && offsetInSpans(docSpans, offset)) {
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
return true;
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Compute the string-literal spans (`[start, end)`) of `content`, skipping over
|
|
251
|
+
* comments so a quote inside a comment is not treated as a string. Used to
|
|
252
|
+
* suppress findings from IDENTIFIER-only rules (e.g. a Go `SigningMethodRS256`
|
|
253
|
+
* mentioned inside an error-message string) — the mirror of {@link commentSpans}.
|
|
254
|
+
*/
|
|
255
|
+
export function stringSpans(content, style, rawBacktick = false) {
|
|
256
|
+
const spans = [];
|
|
257
|
+
const n = content.length;
|
|
258
|
+
let i = 0;
|
|
259
|
+
while (i < n) {
|
|
260
|
+
const c = content[i];
|
|
261
|
+
if (style === "c" && c === "/" && content[i + 1] === "/") {
|
|
262
|
+
i += 2;
|
|
263
|
+
while (i < n && content[i] !== "\n")
|
|
264
|
+
i++;
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
if (style === "c" && c === "/" && content[i + 1] === "*") {
|
|
268
|
+
i += 2;
|
|
269
|
+
while (i < n && !(content[i] === "*" && content[i + 1] === "/"))
|
|
270
|
+
i++;
|
|
271
|
+
i = Math.min(n, i + 2);
|
|
272
|
+
continue;
|
|
273
|
+
}
|
|
274
|
+
if (style === "hash" && c === "#") {
|
|
275
|
+
i++;
|
|
276
|
+
while (i < n && content[i] !== "\n")
|
|
277
|
+
i++;
|
|
278
|
+
continue;
|
|
279
|
+
}
|
|
280
|
+
if (c === '"' || c === "'" || c === "`") {
|
|
281
|
+
const start = i;
|
|
282
|
+
const end = skipQuoted(content, i, n, rawBacktick);
|
|
283
|
+
// A lone `'` (Rust lifetime, end === start+1) is not a string; skip it.
|
|
284
|
+
if (c !== "'" || end > start + 1)
|
|
285
|
+
spans.push([start, end]);
|
|
286
|
+
i = end;
|
|
287
|
+
continue;
|
|
288
|
+
}
|
|
289
|
+
i++;
|
|
290
|
+
}
|
|
291
|
+
return spans;
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Drop findings of "code-only" rules (`ruleIds`) whose match starts inside a
|
|
295
|
+
* string literal. Some rules — an identifier-form JWT signing method, a Go
|
|
296
|
+
* `SigningMethodRS256` — are only meaningful as code; when the same token appears
|
|
297
|
+
* inside a string (a test's `t.Error("SigningMethodPS256 …")`) it is prose, not a
|
|
298
|
+
* usage. Rules that legitimately match inside strings (quoted `"RS256"` alg
|
|
299
|
+
* tokens, cipher-suite strings, ssh-key tokens) are NOT in `ruleIds` and pass
|
|
300
|
+
* through untouched.
|
|
301
|
+
*/
|
|
302
|
+
export function stripStringLiteralFindings(findings, content, file, ruleIds) {
|
|
303
|
+
if (findings.length === 0 || !findings.some((f) => ruleIds.has(f.ruleId)))
|
|
304
|
+
return findings;
|
|
305
|
+
const style = commentStyleForFile(file);
|
|
306
|
+
if (!style)
|
|
307
|
+
return findings;
|
|
308
|
+
const spans = stringSpans(content, style, /\.go$/i.test(file));
|
|
309
|
+
if (spans.length === 0)
|
|
310
|
+
return findings;
|
|
311
|
+
const lineStarts = [0];
|
|
312
|
+
for (let i = 0; i < content.length; i++) {
|
|
313
|
+
if (content[i] === "\n")
|
|
314
|
+
lineStarts.push(i + 1);
|
|
315
|
+
}
|
|
316
|
+
return findings.filter((f) => {
|
|
317
|
+
if (!ruleIds.has(f.ruleId))
|
|
318
|
+
return true;
|
|
319
|
+
const start = lineStarts[f.location.line - 1] ?? 0;
|
|
320
|
+
const offset = start + ((f.location.column ?? 1) - 1);
|
|
161
321
|
return !offsetInSpans(spans, offset);
|
|
162
322
|
});
|
|
163
323
|
}
|
package/dist/comments.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"comments.js","sourceRoot":"","sources":["../src/comments.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"comments.js","sourceRoot":"","sources":["../src/comments.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Comment-aware false-positive suppression.\n *\n * The detectors are lexical (regex over source text), so a crypto API name\n * written in a COMMENT — `// migrated off createECDH()` — fires a finding just\n * like real code. This module computes the comment spans of a file (respecting\n * string literals, so a `//` inside a string is not a comment) and drops any\n * finding whose match starts inside one.\n *\n * The lexer is deliberately conservative: it only ever ENTERS a comment on a\n * literal line comment, block comment, or `#` in code position (all of which ARE\n * comments), so it never mis-classifies code as a comment and can only reduce\n * false positives, not recall. The one inherent lexical ambiguity — a regex\n * literal that looks like a block-comment open — is rare and guarded by the\n * detection benchmark's recall gate.\n */\nimport type { Finding } from \"./types.js\";\n\nexport type CommentStyle = \"c\" | \"hash\";\n\n/** C-style (line + block) comment languages, by extension. */\nconst C_LIKE: readonly string[] = [\n \".js\",\n \".jsx\",\n \".ts\",\n \".tsx\",\n \".mjs\",\n \".cjs\",\n \".vue\",\n \".svelte\",\n \".go\",\n \".java\",\n \".kt\",\n \".kts\",\n \".cs\",\n \".rs\",\n \".c\",\n \".h\",\n \".cc\",\n \".cpp\",\n \".cxx\",\n \".hpp\",\n \".hh\",\n];\n\n/** Hash-style (`#`) comment languages, by extension. */\nconst HASH_LIKE: readonly string[] = [\".py\", \".pyi\", \".pyw\", \".rb\"];\n\n/** The comment style for a file path, or null when we don't strip comments for it. */\nexport function commentStyleForFile(file: string): CommentStyle | null {\n const lower = file.toLowerCase();\n if (C_LIKE.some((e) => lower.endsWith(e))) return \"c\";\n if (HASH_LIKE.some((e) => lower.endsWith(e))) return \"hash\";\n return null;\n}\n\n/**\n * Advance past a string / char literal starting at `content[i]` (a quote char);\n * returns the index just after it. Two correctness rules a naive escape-scan got\n * wrong (both verified as real bugs):\n * - a `'` char literal must close within a short window (`'\\u{10FFFF}'` is ~11\n * chars); otherwise it is a Rust lifetime (`'a`) or a stray apostrophe, NOT a\n * literal — return `i + 1` so the scan continues instead of consuming the\n * rest of the file.\n * - Go raw strings (backtick, when `rawBacktick`) do NOT process escapes, so a\n * trailing backslash (`` `C:\\` ``) must not swallow the closing delimiter.\n */\nfunction skipQuoted(content: string, i: number, n: number, rawBacktick: boolean): number {\n const quote = content[i];\n if (quote === \"'\") {\n const limit = Math.min(n, i + 1 + 12);\n let j = i + 1;\n while (j < limit) {\n if (content[j] === \"\\\\\") {\n j += 2;\n continue;\n }\n if (content[j] === \"'\") return j + 1;\n j++;\n }\n return i + 1; // a lifetime / stray apostrophe, not a char literal\n }\n const escapes = !(quote === \"`\" && rawBacktick);\n let j = i + 1;\n while (j < n) {\n if (escapes && content[j] === \"\\\\\") {\n j += 2;\n continue;\n }\n if (content[j] === quote) return j + 1;\n j++;\n }\n return n;\n}\n\n/**\n * Compute the comment spans (`[start, end)` offsets) of `content`, skipping over\n * string literals so a comment marker inside a string is not treated as a\n * comment. Spans are returned sorted and non-overlapping. `rawBacktick` (Go)\n * makes backtick strings raw (no escapes).\n */\nexport function commentSpans(\n content: string,\n style: CommentStyle,\n rawBacktick = false,\n): Array<[number, number]> {\n const spans: Array<[number, number]> = [];\n const n = content.length;\n let i = 0;\n while (i < n) {\n const c = content[i];\n // String / char literal: skip past it (lexically correct for lifetimes + raw strings).\n if (c === '\"' || c === \"'\" || c === \"`\") {\n i = skipQuoted(content, i, n, rawBacktick);\n continue;\n }\n if (style === \"c\" && c === \"/\" && content[i + 1] === \"/\") {\n const start = i;\n i += 2;\n while (i < n && content[i] !== \"\\n\") i++;\n spans.push([start, i]);\n continue;\n }\n if (style === \"c\" && c === \"/\" && content[i + 1] === \"*\") {\n const start = i;\n i += 2;\n while (i < n && !(content[i] === \"*\" && content[i + 1] === \"/\")) i++;\n i = Math.min(n, i + 2);\n spans.push([start, i]);\n continue;\n }\n if (style === \"hash\" && c === \"#\") {\n const start = i;\n i++;\n while (i < n && content[i] !== \"\\n\") i++;\n spans.push([start, i]);\n continue;\n }\n i++;\n }\n return spans;\n}\n\n/**\n * Compute Python triple-quoted string spans (`\"\"\"…\"\"\"` / `'''…'''`). These are\n * docstrings / prose in practice, so a crypto *name* mentioned inside one\n * (`:param key_type: eg \"ssh-ed25519\"`) should not fire a token finding — but a\n * PEM key pasted into one is still real material, so {@link stripCommentFindings}\n * exempts `pem-*` rules. Comments and normal strings are skipped so a `\"\"\"`\n * delimiter inside them is not mis-detected.\n */\nexport function pythonDocstringSpans(content: string): Array<[number, number]> {\n const spans: Array<[number, number]> = [];\n const n = content.length;\n let i = 0;\n while (i < n) {\n const c = content[i];\n if (c === \"#\") {\n i++;\n while (i < n && content[i] !== \"\\n\") i++;\n continue;\n }\n if ((c === '\"' || c === \"'\") && content[i + 1] === c && content[i + 2] === c) {\n const start = i;\n i += 3;\n while (i < n && !(content[i] === c && content[i + 1] === c && content[i + 2] === c)) i++;\n i = Math.min(n, i + 3);\n spans.push([start, i]);\n continue;\n }\n if (c === '\"' || c === \"'\") {\n const q = c;\n i++;\n while (i < n) {\n if (content[i] === \"\\\\\") {\n i += 2;\n continue;\n }\n if (content[i] === q) {\n i++;\n break;\n }\n i++;\n }\n continue;\n }\n i++;\n }\n return spans;\n}\n\n/** True if `offset` falls inside one of the (sorted, non-overlapping) spans. */\nexport function offsetInSpans(spans: ReadonlyArray<[number, number]>, offset: number): boolean {\n let lo = 0;\n let hi = spans.length - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >>> 1;\n const [s, e] = spans[mid];\n if (offset < s) hi = mid - 1;\n else if (offset >= e) lo = mid + 1;\n else return true;\n }\n return false;\n}\n\n/**\n * Line numbers (1-based) suppressed by an inline ignore directive:\n * - `qscan-ignore-line` on a line suppresses findings on THAT line.\n * - `qscan-ignore-next-line` on a line suppresses findings on the NEXT line.\n * The directive text is matched anywhere on the line (usually in a comment), so\n * it is language-agnostic. `qscan-ignore-line` is not a substring of\n * `qscan-ignore-next-line`, so the two never collide.\n */\nexport function ignoredLines(content: string): Set<number> {\n const ignored = new Set<number>();\n const lines = content.split(\"\\n\");\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (line.includes(\"qscan-ignore-next-line\")) ignored.add(i + 2);\n else if (line.includes(\"qscan-ignore-line\")) ignored.add(i + 1);\n }\n return ignored;\n}\n\n/** Drop findings on lines suppressed by an inline `qscan-ignore` directive. */\nexport function stripIgnoredFindings(findings: Finding[], content: string): Finding[] {\n if (findings.length === 0 || !content.includes(\"qscan-ignore\")) return findings;\n const ignored = ignoredLines(content);\n if (ignored.size === 0) return findings;\n return findings.filter((f) => !ignored.has(f.location.line));\n}\n\n/**\n * Drop findings whose match starts inside a comment. No-op when the file's\n * language has no comment style we handle, or when it has no comments.\n */\nexport function stripCommentFindings(\n findings: Finding[],\n content: string,\n file: string,\n): Finding[] {\n if (findings.length === 0) return findings;\n const style = commentStyleForFile(file);\n if (!style) return findings;\n const spans = commentSpans(content, style, /\\.go$/i.test(file));\n // Python docstrings suppress prose *token* rules but keep real PEM material.\n const docSpans = style === \"hash\" ? pythonDocstringSpans(content) : [];\n if (spans.length === 0 && docSpans.length === 0) return findings;\n\n // 1-based line → start offset, to turn a finding's (line, column) back into an\n // absolute offset (column is 1-based: offset = lineStart + column - 1).\n const lineStarts: number[] = [0];\n for (let i = 0; i < content.length; i++) {\n if (content[i] === \"\\n\") lineStarts.push(i + 1);\n }\n\n return findings.filter((f) => {\n const start = lineStarts[f.location.line - 1] ?? 0;\n const offset = start + ((f.location.column ?? 1) - 1);\n if (offsetInSpans(spans, offset)) return false;\n if (docSpans.length > 0 && !f.ruleId.startsWith(\"pem-\") && offsetInSpans(docSpans, offset)) {\n return false;\n }\n return true;\n });\n}\n\n/**\n * Compute the string-literal spans (`[start, end)`) of `content`, skipping over\n * comments so a quote inside a comment is not treated as a string. Used to\n * suppress findings from IDENTIFIER-only rules (e.g. a Go `SigningMethodRS256`\n * mentioned inside an error-message string) — the mirror of {@link commentSpans}.\n */\nexport function stringSpans(\n content: string,\n style: CommentStyle,\n rawBacktick = false,\n): Array<[number, number]> {\n const spans: Array<[number, number]> = [];\n const n = content.length;\n let i = 0;\n while (i < n) {\n const c = content[i];\n if (style === \"c\" && c === \"/\" && content[i + 1] === \"/\") {\n i += 2;\n while (i < n && content[i] !== \"\\n\") i++;\n continue;\n }\n if (style === \"c\" && c === \"/\" && content[i + 1] === \"*\") {\n i += 2;\n while (i < n && !(content[i] === \"*\" && content[i + 1] === \"/\")) i++;\n i = Math.min(n, i + 2);\n continue;\n }\n if (style === \"hash\" && c === \"#\") {\n i++;\n while (i < n && content[i] !== \"\\n\") i++;\n continue;\n }\n if (c === '\"' || c === \"'\" || c === \"`\") {\n const start = i;\n const end = skipQuoted(content, i, n, rawBacktick);\n // A lone `'` (Rust lifetime, end === start+1) is not a string; skip it.\n if (c !== \"'\" || end > start + 1) spans.push([start, end]);\n i = end;\n continue;\n }\n i++;\n }\n return spans;\n}\n\n/**\n * Drop findings of \"code-only\" rules (`ruleIds`) whose match starts inside a\n * string literal. Some rules — an identifier-form JWT signing method, a Go\n * `SigningMethodRS256` — are only meaningful as code; when the same token appears\n * inside a string (a test's `t.Error(\"SigningMethodPS256 …\")`) it is prose, not a\n * usage. Rules that legitimately match inside strings (quoted `\"RS256\"` alg\n * tokens, cipher-suite strings, ssh-key tokens) are NOT in `ruleIds` and pass\n * through untouched.\n */\nexport function stripStringLiteralFindings(\n findings: Finding[],\n content: string,\n file: string,\n ruleIds: ReadonlySet<string>,\n): Finding[] {\n if (findings.length === 0 || !findings.some((f) => ruleIds.has(f.ruleId))) return findings;\n const style = commentStyleForFile(file);\n if (!style) return findings;\n const spans = stringSpans(content, style, /\\.go$/i.test(file));\n if (spans.length === 0) return findings;\n\n const lineStarts: number[] = [0];\n for (let i = 0; i < content.length; i++) {\n if (content[i] === \"\\n\") lineStarts.push(i + 1);\n }\n\n return findings.filter((f) => {\n if (!ruleIds.has(f.ruleId)) return true;\n const start = lineStarts[f.location.line - 1] ?? 0;\n const offset = start + ((f.location.column ?? 1) - 1);\n return !offsetInSpans(spans, offset);\n });\n}\n"]}
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `quantakrypto.config.json` loader (ROADMAP P2-9, see docs/CONFIG.md).\n *\n * Reads an optional project configuration file, validates the *types* of known\n * keys, ignores unknown keys (forward compatibility), and maps it onto a\n * `Partial<ScanOptions>` plus the two policy keys qScan consumes\n * (`severityThreshold`, `baseline`). It performs NO scanning and has no\n * side-effects beyond a single `readFile`.\n *\n * Precedence (resolved by the consumer, not here): flags > config > defaults.\n *\n * The parsed object is treated as **untrusted input** in the same spirit as a\n * scanned manifest (THREAT-MODEL Q-09): we only membership-test known keys and\n * never deep-merge the parsed object into anything.\n */\nimport { readFile } from \"node:fs/promises\";\nimport * as path from \"node:path\";\n\nimport type { ScanOptions, Severity } from \"./types.js\";\n\n/** Canonical config file name discovered at a scan root. */\nexport const CONFIG_FILENAME = \"quantakrypto.config.json\";\n\n/** Severity levels accepted by `severityThreshold`, for validation. */\nconst SEVERITIES: readonly Severity[] = [\"critical\", \"high\", \"medium\", \"low\", \"info\"];\n\n/** Detector-family toggle names recognised in the `detectors` object. */\nconst DETECTOR_FAMILIES = [\n \"node-crypto\",\n \"webcrypto\",\n \"crypto-libs\",\n \"jwt-jose\",\n \"tls-config\",\n \"pem-material\",\n \"dependencies\",\n] as const;\n\n/**\n * The slice of options a `quantakrypto.config.json` can set. A subset of\n * {@link ScanOptions} (the file-selection + scope keys) extended with the two\n * policy keys qScan owns: `severityThreshold` and `baseline`.\n *\n * `root`, `files`, `detectors` (the programmatic detector array), and `onFile`\n * are intentionally NOT configurable from a file — they are call-site concerns.\n */\nexport interface QuantakryptoFileConfig extends Partial<\n Pick<\n ScanOptions,\n | \"include\"\n | \"exclude\"\n | \"noDefaultIgnores\"\n | \"maxFileSize\"\n | \"scanMinified\"\n | \"source\"\n | \"dependencies\"\n | \"config\"\n | \"disabledRules\"\n >\n> {\n /** Gate severity (drives the exit code). Maps to qScan's `severityThreshold`. */\n severityThreshold?: Severity;\n /** Path to a baseline file, relative to the config file's directory. */\n baseline?: string;\n}\n\n/** Result of {@link loadConfig}: the resolved config plus where it came from. */\nexport interface LoadConfigResult {\n /** Validated, mapped config. Empty object when no file was found. */\n config: QuantakryptoFileConfig;\n /** Absolute path of the file that was loaded, when one was. */\n path?: string;\n /**\n * Non-fatal warnings (unknown keys, unknown future `version`). The caller may\n * surface these; they never abort the load.\n */\n warnings: string[];\n}\n\n/** Thrown when a known key has a malformed *value* (a usage error: exit 2). */\nexport class ConfigError extends Error {\n override readonly name = \"ConfigError\";\n /** The config file path the error relates to, when known. */\n readonly path: string | undefined;\n constructor(message: string, configPath?: string) {\n super(message);\n this.path = configPath;\n }\n}\n\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\n/** Validate an optional boolean field; returns it or undefined, or throws. */\nfunction asBool(obj: Record<string, unknown>, key: string, file: string): boolean | undefined {\n if (!(key in obj)) return undefined;\n const v = obj[key];\n if (typeof v !== \"boolean\") {\n throw new ConfigError(`\"${key}\" must be a boolean (got ${typeof v})`, file);\n }\n return v;\n}\n\n/** Validate an optional non-negative-integer field. */\nfunction asInt(obj: Record<string, unknown>, key: string, file: string): number | undefined {\n if (!(key in obj)) return undefined;\n const v = obj[key];\n if (typeof v !== \"number\" || !Number.isInteger(v) || v < 0) {\n throw new ConfigError(`\"${key}\" must be a non-negative integer`, file);\n }\n return v;\n}\n\n/** Validate an optional string[] field (every element must be a string). */\nfunction asStringArray(\n obj: Record<string, unknown>,\n key: string,\n file: string,\n): string[] | undefined {\n if (!(key in obj)) return undefined;\n const v = obj[key];\n if (!Array.isArray(v) || !v.every((x): x is string => typeof x === \"string\")) {\n throw new ConfigError(`\"${key}\" must be an array of strings`, file);\n }\n return [...v];\n}\n\n/**\n * Map the validated raw JSON object onto a {@link QuantakryptoFileConfig}. Throws\n * {@link ConfigError} on a malformed *value* for any known key; collects\n * warnings for unknown keys and unrecognised `version`.\n */\nfunction mapConfig(\n raw: Record<string, unknown>,\n file: string,\n warnings: string[],\n): QuantakryptoFileConfig {\n // Known top-level keys. Anything else is a warning, not an error.\n const KNOWN = new Set([\n \"$schema\",\n \"version\",\n \"include\",\n \"exclude\",\n \"noDefaultIgnores\",\n \"maxFileSize\",\n \"scanMinified\",\n \"detectors\",\n \"disabledRules\",\n \"languages\",\n \"severityThreshold\",\n \"baseline\",\n ]);\n for (const key of Object.keys(raw)) {\n if (!KNOWN.has(key)) warnings.push(`unknown config key \"${key}\" ignored`);\n }\n\n // version: known forward-compat warning only.\n if (\"version\" in raw) {\n const version = raw[\"version\"];\n if (typeof version !== \"number\" || !Number.isInteger(version)) {\n throw new ConfigError(`\"version\" must be an integer`, file);\n }\n if (version !== 1) {\n warnings.push(`config \"version\" ${version} is newer than supported (1); best-effort`);\n }\n }\n\n const out: QuantakryptoFileConfig = {};\n\n const include = asStringArray(raw, \"include\", file);\n if (include) out.include = include;\n const exclude = asStringArray(raw, \"exclude\", file);\n if (exclude) out.exclude = exclude;\n\n const noDefaultIgnores = asBool(raw, \"noDefaultIgnores\", file);\n if (noDefaultIgnores !== undefined) out.noDefaultIgnores = noDefaultIgnores;\n const scanMinified = asBool(raw, \"scanMinified\", file);\n if (scanMinified !== undefined) out.scanMinified = scanMinified;\n\n const maxFileSize = asInt(raw, \"maxFileSize\", file);\n if (maxFileSize !== undefined) out.maxFileSize = maxFileSize;\n\n // detectors.<family> bool map → source / dependencies / config scope toggles.\n // A family turned off is equivalent to its `--no-*` flag (per docs/CONFIG.md\n // §4.1). We collapse the per-family map onto the three scan-scope toggles:\n // dependencies → ScanOptions.dependencies\n // pem-material + tls-config → ScanOptions.config (config-scope detectors)\n // the JS source families → ScanOptions.source (source-scope detectors)\n // Only an explicit `false` flips a toggle off; absent/true leaves the default.\n if (\"detectors\" in raw) {\n const det = raw[\"detectors\"];\n if (!isObject(det)) {\n throw new ConfigError(`\"detectors\" must be an object of family→boolean`, file);\n }\n for (const key of Object.keys(det)) {\n if (!(DETECTOR_FAMILIES as readonly string[]).includes(key)) {\n warnings.push(`unknown detector family \"${key}\" ignored`);\n continue;\n }\n const v = det[key];\n if (typeof v !== \"boolean\") {\n throw new ConfigError(`\"detectors.${key}\" must be a boolean`, file);\n }\n if (v) continue; // true = default; nothing to disable.\n switch (key) {\n case \"dependencies\":\n out.dependencies = false;\n break;\n case \"tls-config\":\n case \"pem-material\":\n out.config = false;\n break;\n default:\n // node-crypto / webcrypto / crypto-libs / jwt-jose are source-scope.\n out.source = false;\n break;\n }\n }\n }\n\n // disabledRules: rule ids to suppress, threaded to ScanOptions.disabledRules.\n // Unknown ids are harmless (they never match), so we accept the list as-is —\n // this also lets a config forward-reference a rule added in a later version.\n const disabledRules = asStringArray(raw, \"disabledRules\", file);\n if (disabledRules && disabledRules.length > 0) out.disabledRules = disabledRules;\n\n // languages: forward-looking (inert until the plugin registry lands). Validate\n // the type so the file format is stable, but do not map it anywhere.\n const languages = asStringArray(raw, \"languages\", file);\n if (languages) warnings.push(`\"languages\" is accepted but inert until detector plugins land`);\n\n // severityThreshold: enum.\n if (\"severityThreshold\" in raw) {\n const sev = raw[\"severityThreshold\"];\n if (typeof sev !== \"string\" || !(SEVERITIES as readonly string[]).includes(sev)) {\n throw new ConfigError(`\"severityThreshold\" must be one of: ${SEVERITIES.join(\", \")}`, file);\n }\n out.severityThreshold = sev as Severity;\n }\n\n // baseline: path string, resolved relative to the config file's directory.\n if (\"baseline\" in raw) {\n const baseline = raw[\"baseline\"];\n if (typeof baseline !== \"string\" || baseline.length === 0) {\n throw new ConfigError(`\"baseline\" must be a non-empty path string`, file);\n }\n out.baseline = path.isAbsolute(baseline) ? baseline : path.join(path.dirname(file), baseline);\n }\n\n return out;\n}\n\n/**\n * Load a `quantakrypto.config.json` for a scan.\n *\n * By default reads `<root>/quantakrypto.config.json`. Pass an explicit file path as\n * `root` (or via the caller's `--config` flag) to read a named file instead —\n * if the path's basename is `quantakrypto.config.json` it is read directly; otherwise\n * the path is treated as a directory and the file is looked up inside it. When\n * an explicit path is given but missing, that is an error; an *absent*\n * auto-discovered file is tolerated (returns an empty config).\n *\n * @param root Directory to look in, OR an explicit config file path.\n * @param opts.explicit When true, a missing file is an error (the user named it).\n * @throws {ConfigError} On malformed JSON, a bad value for a known key, or a\n * missing explicitly-named file.\n */\nexport async function loadConfig(\n root: string,\n opts: { explicit?: boolean } = {},\n): Promise<LoadConfigResult> {\n // Resolve the file path: an explicit *.json file is used verbatim; otherwise\n // treat `root` as a directory and append the canonical name.\n const base = path.basename(root);\n const file =\n base === CONFIG_FILENAME || base.endsWith(\".json\")\n ? path.resolve(root)\n : path.resolve(root, CONFIG_FILENAME);\n\n let text: string;\n try {\n text = await readFile(file, \"utf8\");\n } catch {\n if (opts.explicit) {\n throw new ConfigError(`config file not found: ${file}`, file);\n }\n return { config: {}, warnings: [] }; // tolerant when auto-discovering.\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch (err) {\n throw new ConfigError(`invalid JSON in ${file}: ${(err as Error).message}`, file);\n }\n if (!isObject(parsed)) {\n throw new ConfigError(`config must be a JSON object, got ${typeof parsed}`, file);\n }\n\n const warnings: string[] = [];\n const config = mapConfig(parsed, file, warnings);\n return { config, path: file, warnings };\n}\n"]}
|
package/dist/cwe.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cwe.js","sourceRoot":"","sources":["../src/cwe.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,iEAAiE;AACjE,MAAM,CAAC,MAAM,iBAAiB,GAAG,SAAS,CAAC;AAE3C,+CAA+C;AAC/C,MAAM,CAAC,MAAM,iBAAiB,GAAG,SAAS,CAAC;AAE3C,gDAAgD;AAChD,MAAM,CAAC,MAAM,mBAAmB,GAAG,SAAS,CAAC;AAE7C,sEAAsE;AACtE,MAAM,CAAC,MAAM,iBAAiB,GAAG,SAAS,CAAC;AAE3C,8EAA8E;AAC9E,MAAM,CAAC,MAAM,mBAAmB,GAAG,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"cwe.js","sourceRoot":"","sources":["../src/cwe.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,iEAAiE;AACjE,MAAM,CAAC,MAAM,iBAAiB,GAAG,SAAS,CAAC;AAE3C,+CAA+C;AAC/C,MAAM,CAAC,MAAM,iBAAiB,GAAG,SAAS,CAAC;AAE3C,gDAAgD;AAChD,MAAM,CAAC,MAAM,mBAAmB,GAAG,SAAS,CAAC;AAE7C,sEAAsE;AACtE,MAAM,CAAC,MAAM,iBAAiB,GAAG,SAAS,CAAC;AAE3C,8EAA8E;AAC9E,MAAM,CAAC,MAAM,mBAAmB,GAAG,UAAU,CAAC","sourcesContent":["/**\n * CWE (Common Weakness Enumeration) identifiers used to tag findings. These\n * feed SARIF rule taxa / properties and the CBOM export, and let downstream\n * compliance tooling map quantaKrypto findings to a standard weakness taxonomy.\n */\n\n/** CWE-327: Use of a Broken or Risky Cryptographic Algorithm. */\nexport const CWE_BROKEN_CRYPTO = \"CWE-327\";\n\n/** CWE-326: Inadequate Encryption Strength. */\nexport const CWE_WEAK_STRENGTH = \"CWE-326\";\n\n/** CWE-295: Improper Certificate Validation. */\nexport const CWE_CERT_VALIDATION = \"CWE-295\";\n\n/** CWE-798: Use of Hard-coded Credentials (embedded private keys). */\nexport const CWE_HARDCODED_KEY = \"CWE-798\";\n\n/** CWE-1240: Use of a Cryptographic Primitive with a Risky Implementation. */\nexport const CWE_RISKY_PRIMITIVE = \"CWE-1240\";\n"]}
|
package/dist/dependencies.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Curated database of packages that primarily expose classical asymmetric
|
|
3
3
|
* cryptography (and are therefore quantum-vulnerable), across multiple
|
|
4
|
-
* ecosystems (npm, PyPI, crates.io, Go modules, Maven, RubyGems), plus a
|
|
4
|
+
* ecosystems (npm, PyPI, crates.io, Go modules, Maven, RubyGems, NuGet), plus a
|
|
5
5
|
* manifest scanner that flags any of them found in the corresponding manifest
|
|
6
|
-
* (package.json, requirements.txt, Cargo.toml, go.mod, pom.xml, Gemfile,
|
|
6
|
+
* (package.json, requirements.txt, Cargo.toml, go.mod, pom.xml, Gemfile,
|
|
7
|
+
* packages.config / *.csproj, …).
|
|
7
8
|
*
|
|
8
9
|
* The list is intentionally focused on libraries whose *purpose* is classical
|
|
9
10
|
* public-key crypto. General-purpose packages that merely call the language's
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../src/dependencies.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../src/dependencies.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAEV,mBAAmB,EACnB,OAAO,EACP,QAAQ,EACR,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAKpB;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,EAAE,QAkBjC,CAAC;AAEF,iDAAiD;AACjD,eAAO,MAAM,sBAAsB,EAAE,oBAAoB,EA0jBxD,CAAC;AAuEF;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAoB1E;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD;AAuID;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,CAyBrE"}
|
package/dist/dependencies.js
CHANGED
|
@@ -287,6 +287,28 @@ export const vulnerableDependencies = [
|
|
|
287
287
|
algorithms: ["RSA", "ECDSA", "DSA"],
|
|
288
288
|
severity: "high",
|
|
289
289
|
},
|
|
290
|
+
{
|
|
291
|
+
name: "pycrypto",
|
|
292
|
+
ecosystem: "pypi",
|
|
293
|
+
reason: "Abandoned/unmaintained crypto library — classical RSA/DSA/ElGamal.",
|
|
294
|
+
algorithms: ["RSA", "DSA"],
|
|
295
|
+
severity: "high",
|
|
296
|
+
},
|
|
297
|
+
{
|
|
298
|
+
name: "jwcrypto",
|
|
299
|
+
ecosystem: "pypi",
|
|
300
|
+
reason: "JWK / JWS / JWE with classical RS*/ES* and ECDH-ES key agreement.",
|
|
301
|
+
algorithms: ["RSA", "ECDSA", "ECDH"],
|
|
302
|
+
severity: "medium",
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
name: "authlib",
|
|
306
|
+
ecosystem: "pypi",
|
|
307
|
+
reason: "OAuth / OIDC / JOSE stack using classical RS*/ES* JWT signing.",
|
|
308
|
+
algorithms: ["RSA", "ECDSA"],
|
|
309
|
+
severity: "medium",
|
|
310
|
+
hndl: false,
|
|
311
|
+
},
|
|
290
312
|
{
|
|
291
313
|
name: "pycryptodomex",
|
|
292
314
|
ecosystem: "pypi",
|
|
@@ -394,6 +416,13 @@ export const vulnerableDependencies = [
|
|
|
394
416
|
algorithms: ["ECDSA", "ECDH"],
|
|
395
417
|
severity: "high",
|
|
396
418
|
},
|
|
419
|
+
{
|
|
420
|
+
name: "secp256k1",
|
|
421
|
+
ecosystem: "cargo",
|
|
422
|
+
reason: "libsecp256k1 bindings (blockchain) — classical ECDSA + ECDH.",
|
|
423
|
+
algorithms: ["ECDSA", "ECDH"],
|
|
424
|
+
severity: "high",
|
|
425
|
+
},
|
|
397
426
|
{
|
|
398
427
|
name: "ed25519-dalek",
|
|
399
428
|
ecosystem: "cargo",
|
|
@@ -416,6 +445,43 @@ export const vulnerableDependencies = [
|
|
|
416
445
|
algorithms: ["RSA", "ECDSA", "EdDSA", "ECDH"],
|
|
417
446
|
severity: "medium",
|
|
418
447
|
},
|
|
448
|
+
{
|
|
449
|
+
name: "github.com/golang-jwt/jwt/v5",
|
|
450
|
+
ecosystem: "go",
|
|
451
|
+
reason: "golang-jwt — classical RS*/PS*/ES* JWT algorithms.",
|
|
452
|
+
algorithms: ["RSA", "ECDSA"],
|
|
453
|
+
severity: "medium",
|
|
454
|
+
hndl: false,
|
|
455
|
+
},
|
|
456
|
+
{
|
|
457
|
+
name: "github.com/golang-jwt/jwt/v4",
|
|
458
|
+
ecosystem: "go",
|
|
459
|
+
reason: "golang-jwt (v4) — classical RS*/PS*/ES* JWT algorithms.",
|
|
460
|
+
algorithms: ["RSA", "ECDSA"],
|
|
461
|
+
severity: "medium",
|
|
462
|
+
hndl: false,
|
|
463
|
+
},
|
|
464
|
+
{
|
|
465
|
+
name: "github.com/go-jose/go-jose/v4",
|
|
466
|
+
ecosystem: "go",
|
|
467
|
+
reason: "go-jose — classical JOSE (RSA/ECDSA signatures, ECDH-ES key agreement).",
|
|
468
|
+
algorithms: ["RSA", "ECDSA", "ECDH"],
|
|
469
|
+
severity: "medium",
|
|
470
|
+
},
|
|
471
|
+
{
|
|
472
|
+
name: "github.com/cloudflare/circl",
|
|
473
|
+
ecosystem: "go",
|
|
474
|
+
reason: "Cloudflare CIRCL — classical ECDH/EdDSA curves (X25519, X448, Ed25519, P-256); also ships PQC (ML-KEM/ML-DSA + hybrids), so migrate the classical *usage*, not the package.",
|
|
475
|
+
algorithms: ["ECDH", "EdDSA"],
|
|
476
|
+
severity: "medium",
|
|
477
|
+
},
|
|
478
|
+
{
|
|
479
|
+
name: "github.com/decred/dcrd/dcrec/secp256k1/v4",
|
|
480
|
+
ecosystem: "go",
|
|
481
|
+
reason: "decred secp256k1 — classical ECDSA/ECDH on the secp256k1 curve (blockchain keys).",
|
|
482
|
+
algorithms: ["ECDSA", "ECDH"],
|
|
483
|
+
severity: "medium",
|
|
484
|
+
},
|
|
419
485
|
// --- Maven (Java) ---
|
|
420
486
|
{
|
|
421
487
|
name: "bcprov-jdk18on",
|
|
@@ -446,6 +512,21 @@ export const vulnerableDependencies = [
|
|
|
446
512
|
severity: "medium",
|
|
447
513
|
hndl: false,
|
|
448
514
|
},
|
|
515
|
+
{
|
|
516
|
+
name: "nimbus-jose-jwt",
|
|
517
|
+
ecosystem: "maven",
|
|
518
|
+
reason: "Nimbus JOSE+JWT — classical RS*/PS*/ES* JWS and RSA/ECDH-ES JWE.",
|
|
519
|
+
algorithms: ["RSA", "ECDSA", "ECDH"],
|
|
520
|
+
severity: "medium",
|
|
521
|
+
},
|
|
522
|
+
{
|
|
523
|
+
name: "jjwt-api",
|
|
524
|
+
ecosystem: "maven",
|
|
525
|
+
reason: "JJWT (io.jsonwebtoken) — classical RS*/ES* JWT signing.",
|
|
526
|
+
algorithms: ["RSA", "ECDSA"],
|
|
527
|
+
severity: "medium",
|
|
528
|
+
hndl: false,
|
|
529
|
+
},
|
|
449
530
|
// --- RubyGems ---
|
|
450
531
|
{
|
|
451
532
|
name: "jwt",
|
|
@@ -455,6 +536,13 @@ export const vulnerableDependencies = [
|
|
|
455
536
|
severity: "medium",
|
|
456
537
|
hndl: false,
|
|
457
538
|
},
|
|
539
|
+
{
|
|
540
|
+
name: "net-ssh",
|
|
541
|
+
ecosystem: "rubygems",
|
|
542
|
+
reason: "Ruby SSH client — classical host/user keys (RSA/ECDSA/Ed25519) and ECDH/DH key exchange.",
|
|
543
|
+
algorithms: ["RSA", "ECDSA", "ECDH"],
|
|
544
|
+
severity: "medium",
|
|
545
|
+
},
|
|
458
546
|
{
|
|
459
547
|
name: "rbnacl",
|
|
460
548
|
ecosystem: "rubygems",
|
|
@@ -469,12 +557,44 @@ export const vulnerableDependencies = [
|
|
|
469
557
|
algorithms: ["EdDSA"],
|
|
470
558
|
severity: "low",
|
|
471
559
|
},
|
|
560
|
+
// --- NuGet (.NET) ---
|
|
561
|
+
{
|
|
562
|
+
name: "BouncyCastle.Cryptography",
|
|
563
|
+
ecosystem: "nuget",
|
|
564
|
+
reason: "BouncyCastle for .NET — full classical RSA/ECDSA/ECDH/DSA suite.",
|
|
565
|
+
algorithms: ["RSA", "ECDSA", "ECDH", "DSA"],
|
|
566
|
+
severity: "high",
|
|
567
|
+
},
|
|
568
|
+
{
|
|
569
|
+
name: "Portable.BouncyCastle",
|
|
570
|
+
ecosystem: "nuget",
|
|
571
|
+
reason: "Portable BouncyCastle for .NET — classical RSA/ECDSA/ECDH/DSA.",
|
|
572
|
+
algorithms: ["RSA", "ECDSA", "ECDH", "DSA"],
|
|
573
|
+
severity: "high",
|
|
574
|
+
},
|
|
575
|
+
{
|
|
576
|
+
name: "System.IdentityModel.Tokens.Jwt",
|
|
577
|
+
ecosystem: "nuget",
|
|
578
|
+
reason: "Microsoft JWT handler — classical RS*/ES* (RSA/ECDSA) signatures.",
|
|
579
|
+
algorithms: ["RSA", "ECDSA"],
|
|
580
|
+
severity: "medium",
|
|
581
|
+
hndl: false,
|
|
582
|
+
},
|
|
583
|
+
{
|
|
584
|
+
name: "Microsoft.IdentityModel.Tokens",
|
|
585
|
+
ecosystem: "nuget",
|
|
586
|
+
reason: "Microsoft IdentityModel token crypto — classical RSA/ECDSA keys.",
|
|
587
|
+
algorithms: ["RSA", "ECDSA"],
|
|
588
|
+
severity: "medium",
|
|
589
|
+
hndl: false,
|
|
590
|
+
},
|
|
472
591
|
];
|
|
473
592
|
/**
|
|
474
593
|
* Normalise a package name for matching within its ecosystem. PyPI is
|
|
475
594
|
* case-insensitive and folds runs of `-_.` to a single `-` (PEP 503); cargo /
|
|
476
|
-
* maven / rubygems are effectively lower-case
|
|
477
|
-
*
|
|
595
|
+
* maven / rubygems / nuget are effectively lower-case (NuGet ids are matched
|
|
596
|
+
* case-insensitively); npm and go module paths are matched verbatim (npm scopes
|
|
597
|
+
* and go paths are case-sensitive).
|
|
478
598
|
*/
|
|
479
599
|
function normalizeName(ecosystem, name) {
|
|
480
600
|
const n = name.trim();
|
|
@@ -565,6 +685,8 @@ export function manifestEcosystem(file) {
|
|
|
565
685
|
return "maven";
|
|
566
686
|
if (base === "gemfile" || base.endsWith(".gemspec"))
|
|
567
687
|
return "rubygems";
|
|
688
|
+
if (base === "packages.config" || base === "directory.packages.props" || base.endsWith(".csproj"))
|
|
689
|
+
return "nuget";
|
|
568
690
|
return null;
|
|
569
691
|
}
|
|
570
692
|
/** True if a file path looks like a manifest we can parse for dependencies. */
|
|
@@ -635,6 +757,20 @@ function candidateNames(ecosystem, content) {
|
|
|
635
757
|
}
|
|
636
758
|
break;
|
|
637
759
|
}
|
|
760
|
+
case "nuget": {
|
|
761
|
+
// NuGet manifests are XML. `.csproj` / `Directory.Packages.props` declare
|
|
762
|
+
// `<PackageReference Include="Name" … />`; `packages.config` uses
|
|
763
|
+
// `<package id="Name" … />`. Pull the Include= / id= attribute value from
|
|
764
|
+
// each. The `[^>]` guard keeps every match inside a single tag, so the
|
|
765
|
+
// scan is linear (no nested quantifiers → no catastrophic backtracking).
|
|
766
|
+
for (const m of content.matchAll(/<PackageReference\b[^>]*\bInclude\s*=\s*"([^"]+)"/gi)) {
|
|
767
|
+
names.push(m[1]);
|
|
768
|
+
}
|
|
769
|
+
for (const m of content.matchAll(/<package\b[^>]*\bid\s*=\s*"([^"]+)"/gi)) {
|
|
770
|
+
names.push(m[1]);
|
|
771
|
+
}
|
|
772
|
+
break;
|
|
773
|
+
}
|
|
638
774
|
case "npm":
|
|
639
775
|
break; // npm uses the JSON path, not this extractor.
|
|
640
776
|
}
|