circle-ir 4.14.2 → 4.16.0
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/configs/sinks/golang.json +4 -4
- package/dist/analysis/config-loader.d.ts.map +1 -1
- package/dist/analysis/config-loader.js +11 -7
- package/dist/analysis/config-loader.js.map +1 -1
- package/dist/analysis/const-table-lookup.d.ts +29 -0
- package/dist/analysis/const-table-lookup.d.ts.map +1 -0
- package/dist/analysis/const-table-lookup.js +145 -0
- package/dist/analysis/const-table-lookup.js.map +1 -0
- package/dist/analysis/constant-caller-gate.d.ts +39 -0
- package/dist/analysis/constant-caller-gate.d.ts.map +1 -0
- package/dist/analysis/constant-caller-gate.js +298 -0
- package/dist/analysis/constant-caller-gate.js.map +1 -0
- package/dist/analysis/constant-propagation/evaluator.d.ts.map +1 -1
- package/dist/analysis/constant-propagation/evaluator.js +3 -1
- package/dist/analysis/constant-propagation/evaluator.js.map +1 -1
- package/dist/analysis/constant-propagation/patterns.d.ts +19 -0
- package/dist/analysis/constant-propagation/patterns.d.ts.map +1 -1
- package/dist/analysis/constant-propagation/patterns.js +33 -0
- package/dist/analysis/constant-propagation/patterns.js.map +1 -1
- package/dist/analysis/constant-propagation/propagator.d.ts +59 -0
- package/dist/analysis/constant-propagation/propagator.d.ts.map +1 -1
- package/dist/analysis/constant-propagation/propagator.js +396 -49
- package/dist/analysis/constant-propagation/propagator.js.map +1 -1
- package/dist/analysis/constant-propagation/types.d.ts +9 -0
- package/dist/analysis/constant-propagation/types.d.ts.map +1 -1
- package/dist/analysis/findings.d.ts.map +1 -1
- package/dist/analysis/findings.js +149 -4
- package/dist/analysis/findings.js.map +1 -1
- package/dist/analysis/go-strings-replacer.d.ts +21 -0
- package/dist/analysis/go-strings-replacer.d.ts.map +1 -0
- package/dist/analysis/go-strings-replacer.js +145 -0
- package/dist/analysis/go-strings-replacer.js.map +1 -0
- package/dist/analysis/interprocedural.d.ts.map +1 -1
- package/dist/analysis/interprocedural.js +148 -0
- package/dist/analysis/interprocedural.js.map +1 -1
- package/dist/analysis/java-array-element-keys.d.ts +14 -0
- package/dist/analysis/java-array-element-keys.d.ts.map +1 -0
- package/dist/analysis/java-array-element-keys.js +36 -0
- package/dist/analysis/java-array-element-keys.js.map +1 -0
- package/dist/analysis/java-canonical-prefix.d.ts +42 -0
- package/dist/analysis/java-canonical-prefix.d.ts.map +1 -0
- package/dist/analysis/java-canonical-prefix.js +145 -0
- package/dist/analysis/java-canonical-prefix.js.map +1 -0
- package/dist/analysis/java-crlf-strip.d.ts +30 -0
- package/dist/analysis/java-crlf-strip.d.ts.map +1 -0
- package/dist/analysis/java-crlf-strip.js +195 -0
- package/dist/analysis/java-crlf-strip.js.map +1 -0
- package/dist/analysis/js-crlf-strip.d.ts +26 -0
- package/dist/analysis/js-crlf-strip.d.ts.map +1 -0
- package/dist/analysis/js-crlf-strip.js +244 -0
- package/dist/analysis/js-crlf-strip.js.map +1 -0
- package/dist/analysis/passes/cleartext-credential-transport-pass.d.ts +2 -0
- package/dist/analysis/passes/cleartext-credential-transport-pass.d.ts.map +1 -1
- package/dist/analysis/passes/cleartext-credential-transport-pass.js +64 -12
- package/dist/analysis/passes/cleartext-credential-transport-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 +43 -0
- package/dist/analysis/passes/cross-file-pass.js.map +1 -1
- package/dist/analysis/passes/csharp-sanitizer-credit.d.ts +12 -0
- package/dist/analysis/passes/csharp-sanitizer-credit.d.ts.map +1 -1
- package/dist/analysis/passes/csharp-sanitizer-credit.js +127 -12
- package/dist/analysis/passes/csharp-sanitizer-credit.js.map +1 -1
- package/dist/analysis/passes/interprocedural-pass.d.ts +28 -0
- package/dist/analysis/passes/interprocedural-pass.d.ts.map +1 -1
- package/dist/analysis/passes/interprocedural-pass.js +20 -1
- package/dist/analysis/passes/interprocedural-pass.js.map +1 -1
- package/dist/analysis/passes/language-sources-pass.d.ts +76 -2
- package/dist/analysis/passes/language-sources-pass.d.ts.map +1 -1
- package/dist/analysis/passes/language-sources-pass.js +2045 -156
- package/dist/analysis/passes/language-sources-pass.js.map +1 -1
- package/dist/analysis/passes/param-source-flow-gate-pass.d.ts +8 -0
- package/dist/analysis/passes/param-source-flow-gate-pass.d.ts.map +1 -1
- package/dist/analysis/passes/param-source-flow-gate-pass.js +214 -6
- package/dist/analysis/passes/param-source-flow-gate-pass.js.map +1 -1
- package/dist/analysis/passes/plaintext-password-storage-pass.d.ts +6 -0
- package/dist/analysis/passes/plaintext-password-storage-pass.d.ts.map +1 -1
- package/dist/analysis/passes/plaintext-password-storage-pass.js +160 -0
- package/dist/analysis/passes/plaintext-password-storage-pass.js.map +1 -1
- package/dist/analysis/passes/scan-secrets-pass.d.ts +1 -1
- package/dist/analysis/passes/scan-secrets-pass.d.ts.map +1 -1
- package/dist/analysis/passes/scan-secrets-pass.js +7 -1
- package/dist/analysis/passes/scan-secrets-pass.js.map +1 -1
- package/dist/analysis/passes/sink-filter-pass.d.ts +1 -1
- package/dist/analysis/passes/sink-filter-pass.d.ts.map +1 -1
- package/dist/analysis/passes/sink-filter-pass.js +509 -27
- package/dist/analysis/passes/sink-filter-pass.js.map +1 -1
- package/dist/analysis/passes/taint-matcher-pass.d.ts.map +1 -1
- package/dist/analysis/passes/taint-matcher-pass.js +2 -2
- package/dist/analysis/passes/taint-matcher-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 +1606 -60
- package/dist/analysis/passes/taint-propagation-pass.js.map +1 -1
- package/dist/analysis/passes/weak-hash-pass.d.ts +6 -0
- package/dist/analysis/passes/weak-hash-pass.d.ts.map +1 -1
- package/dist/analysis/passes/weak-hash-pass.js +191 -4
- package/dist/analysis/passes/weak-hash-pass.js.map +1 -1
- package/dist/analysis/passes/weak-random-pass.d.ts +5 -0
- package/dist/analysis/passes/weak-random-pass.d.ts.map +1 -1
- package/dist/analysis/passes/weak-random-pass.js +30 -0
- package/dist/analysis/passes/weak-random-pass.js.map +1 -1
- package/dist/analysis/project-callee-escape-gate.d.ts +40 -0
- package/dist/analysis/project-callee-escape-gate.d.ts.map +1 -0
- package/dist/analysis/project-callee-escape-gate.js +243 -0
- package/dist/analysis/project-callee-escape-gate.js.map +1 -0
- package/dist/analysis/rust-literal-guard-rebind.d.ts +34 -0
- package/dist/analysis/rust-literal-guard-rebind.d.ts.map +1 -0
- package/dist/analysis/rust-literal-guard-rebind.js +197 -0
- package/dist/analysis/rust-literal-guard-rebind.js.map +1 -0
- package/dist/analysis/rust-literal-guard.d.ts +33 -0
- package/dist/analysis/rust-literal-guard.d.ts.map +1 -0
- package/dist/analysis/rust-literal-guard.js +422 -0
- package/dist/analysis/rust-literal-guard.js.map +1 -0
- package/dist/analysis/scalar-derivation.d.ts +33 -0
- package/dist/analysis/scalar-derivation.d.ts.map +1 -0
- package/dist/analysis/scalar-derivation.js +368 -0
- package/dist/analysis/scalar-derivation.js.map +1 -0
- package/dist/analysis/taint-matcher.d.ts +2 -2
- package/dist/analysis/taint-matcher.d.ts.map +1 -1
- package/dist/analysis/taint-matcher.js +695 -34
- package/dist/analysis/taint-matcher.js.map +1 -1
- package/dist/analysis/taint-propagation.d.ts +26 -1
- package/dist/analysis/taint-propagation.d.ts.map +1 -1
- package/dist/analysis/taint-propagation.js +375 -24
- package/dist/analysis/taint-propagation.js.map +1 -1
- package/dist/analyzer.d.ts +16 -2
- package/dist/analyzer.d.ts.map +1 -1
- package/dist/analyzer.js +19 -2
- package/dist/analyzer.js.map +1 -1
- package/dist/browser/circle-ir.js +25539 -19200
- package/dist/core/circle-ir-core.cjs +3945 -2126
- package/dist/core/circle-ir-core.js +3945 -2126
- package/dist/core/extractors/calls.d.ts +12 -1
- package/dist/core/extractors/calls.d.ts.map +1 -1
- package/dist/core/extractors/calls.js +332 -22
- package/dist/core/extractors/calls.js.map +1 -1
- package/dist/core/extractors/dfg.js +336 -10
- package/dist/core/extractors/dfg.js.map +1 -1
- package/dist/core/extractors/types.d.ts +5 -1
- package/dist/core/extractors/types.d.ts.map +1 -1
- package/dist/core/extractors/types.js +62 -0
- package/dist/core/extractors/types.js.map +1 -1
- package/dist/graph/analysis-pass.d.ts +6 -1
- package/dist/graph/analysis-pass.d.ts.map +1 -1
- package/dist/graph/analysis-pass.js +2 -1
- package/dist/graph/analysis-pass.js.map +1 -1
- package/dist/graph/code-graph.d.ts +9 -0
- package/dist/graph/code-graph.d.ts.map +1 -1
- package/dist/graph/code-graph.js +11 -0
- package/dist/graph/code-graph.js.map +1 -1
- package/dist/navigation/navigation-index.d.ts +134 -14
- package/dist/navigation/navigation-index.d.ts.map +1 -1
- package/dist/navigation/navigation-index.js +1158 -104
- package/dist/navigation/navigation-index.js.map +1 -1
- package/dist/navigation/types.d.ts +59 -2
- package/dist/navigation/types.d.ts.map +1 -1
- package/dist/resolution/cross-file.d.ts +16 -0
- package/dist/resolution/cross-file.d.ts.map +1 -1
- package/dist/resolution/cross-file.js +110 -42
- package/dist/resolution/cross-file.js.map +1 -1
- package/dist/resolution/type-hierarchy.d.ts +3 -0
- package/dist/resolution/type-hierarchy.d.ts.map +1 -1
- package/dist/resolution/type-hierarchy.js +45 -1
- package/dist/resolution/type-hierarchy.js.map +1 -1
- package/dist/types/index.d.ts +33 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/wasm/web-tree-sitter.wasm +0 -0
- package/package.json +3 -3
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which of CR / LF a Java `String.replace` / `replaceAll` call strips as a
|
|
3
|
+
* match of its own (cognium-dev#562 / #605).
|
|
4
|
+
*
|
|
5
|
+
* Shared by the inline-chain credit (`taint-matcher.ts`) and the helper-body
|
|
6
|
+
* credit (`language-sources-pass.ts`), so a pattern is judged the same way
|
|
7
|
+
* wherever it appears.
|
|
8
|
+
*
|
|
9
|
+
* The literal is first decoded from Java source (`"\\r"` and `"\r"` both
|
|
10
|
+
* become a CR atom for the regex engine, `"\\\\r"` becomes a literal
|
|
11
|
+
* backslash followed by `r`), then the regex is read one atom at a time.
|
|
12
|
+
*/
|
|
13
|
+
/** Decode the escape sequences of the body of a Java string / char literal. */
|
|
14
|
+
export function decodeJavaLiteral(raw) {
|
|
15
|
+
return raw.replace(/\\(?:u+([0-9a-fA-F]{4})|([0-3][0-7]{0,2}|[4-7][0-7]?)|([btnfrs"'\\]))/g, (_m, hex, oct, simple) => {
|
|
16
|
+
if (hex !== undefined)
|
|
17
|
+
return String.fromCharCode(parseInt(hex, 16));
|
|
18
|
+
if (oct !== undefined)
|
|
19
|
+
return String.fromCharCode(parseInt(oct, 8));
|
|
20
|
+
switch (simple) {
|
|
21
|
+
case 'b': return '\b';
|
|
22
|
+
case 't': return '\t';
|
|
23
|
+
case 'n': return '\n';
|
|
24
|
+
case 'f': return '\f';
|
|
25
|
+
case 'r': return '\r';
|
|
26
|
+
case 's': return ' ';
|
|
27
|
+
default: return simple;
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
/** One regex atom at `i`: an escape (`\r`, `\n`, `\\`, `\t`…) or a single character. */
|
|
32
|
+
function readAtom(s, i) {
|
|
33
|
+
const c = s[i];
|
|
34
|
+
if (c === '\\' && i + 1 < s.length) {
|
|
35
|
+
const n = s[i + 1];
|
|
36
|
+
return { atom: n === 'r' ? 'cr' : n === 'n' ? 'lf' : 'other', end: i + 2 };
|
|
37
|
+
}
|
|
38
|
+
return { atom: c === '\r' ? 'cr' : c === '\n' ? 'lf' : 'other', end: i + 1 };
|
|
39
|
+
}
|
|
40
|
+
/** True when the quantifier text lets a single repetition match (min <= 1 <= max). */
|
|
41
|
+
function quantifierAllowsOne(q) {
|
|
42
|
+
if (q === '')
|
|
43
|
+
return true;
|
|
44
|
+
const m = /^(?:(\*)|(\+)|(\?)|\{(\d+)(?:(,)(\d*))?\})[+?]?$/.exec(q);
|
|
45
|
+
if (!m)
|
|
46
|
+
return false;
|
|
47
|
+
if (m[1] || m[2] || m[3])
|
|
48
|
+
return true;
|
|
49
|
+
const min = Number(m[4]);
|
|
50
|
+
const max = m[5] ? (m[6] === '' ? Infinity : Number(m[6])) : min;
|
|
51
|
+
return min <= 1 && max >= 1;
|
|
52
|
+
}
|
|
53
|
+
const NONE = { cr: false, lf: false };
|
|
54
|
+
/** Coverage of one alternative: a lone CR/LF atom or a non-negated class holding one, with a quantifier. */
|
|
55
|
+
function alternativeCoverage(alt) {
|
|
56
|
+
if (alt === '')
|
|
57
|
+
return NONE;
|
|
58
|
+
let cr = false;
|
|
59
|
+
let lf = false;
|
|
60
|
+
let i;
|
|
61
|
+
if (alt[0] === '[') {
|
|
62
|
+
if (alt[1] === '^')
|
|
63
|
+
return NONE;
|
|
64
|
+
i = 1;
|
|
65
|
+
let closed = false;
|
|
66
|
+
while (i < alt.length) {
|
|
67
|
+
if (alt[i] === ']' && i > 1) {
|
|
68
|
+
closed = true;
|
|
69
|
+
i++;
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
if (alt[i] === '[' || (alt[i] === '&' && alt[i + 1] === '&'))
|
|
73
|
+
return NONE;
|
|
74
|
+
const { atom, end } = readAtom(alt, i);
|
|
75
|
+
if (atom === 'cr')
|
|
76
|
+
cr = true;
|
|
77
|
+
else if (atom === 'lf')
|
|
78
|
+
lf = true;
|
|
79
|
+
i = end;
|
|
80
|
+
}
|
|
81
|
+
if (!closed)
|
|
82
|
+
return NONE;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
const { atom, end } = readAtom(alt, 0);
|
|
86
|
+
if (atom === 'other')
|
|
87
|
+
return NONE;
|
|
88
|
+
cr = atom === 'cr';
|
|
89
|
+
lf = atom === 'lf';
|
|
90
|
+
i = end;
|
|
91
|
+
}
|
|
92
|
+
return quantifierAllowsOne(alt.slice(i)) ? { cr, lf } : NONE;
|
|
93
|
+
}
|
|
94
|
+
/** Split `s` at top-level `|` (outside classes, groups and escapes). */
|
|
95
|
+
function splitAlternatives(s) {
|
|
96
|
+
const alts = [];
|
|
97
|
+
let depth = 0;
|
|
98
|
+
let inClass = false;
|
|
99
|
+
let cur = '';
|
|
100
|
+
for (let i = 0; i < s.length; i++) {
|
|
101
|
+
const c = s[i];
|
|
102
|
+
if (c === '\\') {
|
|
103
|
+
cur += c + (s[i + 1] ?? '');
|
|
104
|
+
i++;
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
if (inClass) {
|
|
108
|
+
if (c === ']')
|
|
109
|
+
inClass = false;
|
|
110
|
+
cur += c;
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
if (c === '[') {
|
|
114
|
+
inClass = true;
|
|
115
|
+
cur += c;
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
if (c === '(')
|
|
119
|
+
depth++;
|
|
120
|
+
else if (c === ')')
|
|
121
|
+
depth--;
|
|
122
|
+
if (c === '|' && depth === 0) {
|
|
123
|
+
alts.push(cur);
|
|
124
|
+
cur = '';
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
cur += c;
|
|
128
|
+
}
|
|
129
|
+
alts.push(cur);
|
|
130
|
+
return alts;
|
|
131
|
+
}
|
|
132
|
+
/** If `s` is one `(?:…)` / `(…)` group, optionally quantified, its body and quantifier. */
|
|
133
|
+
function unwrapGroup(s) {
|
|
134
|
+
const open = /^\((?:\?:)?/.exec(s);
|
|
135
|
+
if (!open)
|
|
136
|
+
return null;
|
|
137
|
+
let depth = 0;
|
|
138
|
+
let inClass = false;
|
|
139
|
+
for (let i = 0; i < s.length; i++) {
|
|
140
|
+
const c = s[i];
|
|
141
|
+
if (c === '\\') {
|
|
142
|
+
i++;
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
if (inClass) {
|
|
146
|
+
if (c === ']')
|
|
147
|
+
inClass = false;
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
if (c === '[') {
|
|
151
|
+
inClass = true;
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
if (c === '(')
|
|
155
|
+
depth++;
|
|
156
|
+
else if (c === ')' && --depth === 0) {
|
|
157
|
+
return { body: s.slice(open[0].length, i), quantifier: s.slice(i + 1) };
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* CR / LF coverage of a `replace` / `replaceAll` call from the raw source text
|
|
164
|
+
* of its first literal argument (the text between the quotes).
|
|
165
|
+
*
|
|
166
|
+
* `replace` is a plain-text match: only a lone CR or LF removes one. `replaceAll`
|
|
167
|
+
* is a regex: only a top-level alternation (optionally inside one `(?:…)` /
|
|
168
|
+
* `(…)` group, which may carry a quantifier) whose alternatives are a lone
|
|
169
|
+
* `\r` / `\n` atom or a non-negated class holding one, each quantified so that
|
|
170
|
+
* a single repetition matches, removes a lone CR or LF. A longer sequence
|
|
171
|
+
* (`\r\n`, `x\r\ny`) or a negated class does not.
|
|
172
|
+
*/
|
|
173
|
+
export function javaReplaceCrLfCoverage(method, rawFrom) {
|
|
174
|
+
const value = decodeJavaLiteral(rawFrom);
|
|
175
|
+
if (method === 'replace')
|
|
176
|
+
return { cr: value === '\r', lf: value === '\n' };
|
|
177
|
+
let body = value;
|
|
178
|
+
const group = unwrapGroup(value);
|
|
179
|
+
if (group) {
|
|
180
|
+
if (!quantifierAllowsOne(group.quantifier))
|
|
181
|
+
return NONE;
|
|
182
|
+
body = group.body;
|
|
183
|
+
}
|
|
184
|
+
let cr = false;
|
|
185
|
+
let lf = false;
|
|
186
|
+
for (const alt of splitAlternatives(body)) {
|
|
187
|
+
const c = alternativeCoverage(alt);
|
|
188
|
+
if (c.cr)
|
|
189
|
+
cr = true;
|
|
190
|
+
if (c.lf)
|
|
191
|
+
lf = true;
|
|
192
|
+
}
|
|
193
|
+
return { cr, lf };
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=java-crlf-strip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"java-crlf-strip.js","sourceRoot":"","sources":["../../src/analysis/java-crlf-strip.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether a JavaScript / TypeScript `String.replace` chain strips CR and LF
|
|
3
|
+
* (cognium-dev#562, the JS half of the Java rule in `java-crlf-strip.ts`).
|
|
4
|
+
*
|
|
5
|
+
* The decision is made by running the chain's own literal patterns against a
|
|
6
|
+
* short probe string, so a regex is judged by what it matches rather than by how
|
|
7
|
+
* it is spelled (`/[\r\n]/g`, `/\r|\n/g`, `/\s+/g` and `/[\x00-\x1f]/g` all
|
|
8
|
+
* strip both). Only literal arguments are understood: a pattern held in a
|
|
9
|
+
* variable, a `new RegExp(...)`, or a replacement that is a function or a
|
|
10
|
+
* non-literal makes the whole chain `undecided`, and the caller keeps the credit
|
|
11
|
+
* the class-less `replace` row gave before.
|
|
12
|
+
*/
|
|
13
|
+
export type JsReplaceVerdict = 'strips-crlf' | 'leaves-crlf' | 'undecided';
|
|
14
|
+
/**
|
|
15
|
+
* Verdict for the replace chain whose text is `chainText` (the receiver plus the
|
|
16
|
+
* `.method(...)` segments after it).
|
|
17
|
+
*/
|
|
18
|
+
export declare function jsReplaceChainVerdict(chainText: string): JsReplaceVerdict;
|
|
19
|
+
/**
|
|
20
|
+
* The text of the call chain that starts at (line, column): the receiver
|
|
21
|
+
* expression plus the `.method(...)` segments after it, up to the first
|
|
22
|
+
* character that cannot continue the chain at nesting depth 0. String and regex
|
|
23
|
+
* literals are skipped as units. The chain may continue over following lines.
|
|
24
|
+
*/
|
|
25
|
+
export declare function jsChainTextAt(sourceLines: string[], line: number, column: number): string;
|
|
26
|
+
//# sourceMappingURL=js-crlf-strip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"js-crlf-strip.d.ts","sourceRoot":"","sources":["../../src/analysis/js-crlf-strip.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,aAAa,GAAG,WAAW,CAAC;AAiI3E;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,CAazE;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CA2BzF"}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether a JavaScript / TypeScript `String.replace` chain strips CR and LF
|
|
3
|
+
* (cognium-dev#562, the JS half of the Java rule in `java-crlf-strip.ts`).
|
|
4
|
+
*
|
|
5
|
+
* The decision is made by running the chain's own literal patterns against a
|
|
6
|
+
* short probe string, so a regex is judged by what it matches rather than by how
|
|
7
|
+
* it is spelled (`/[\r\n]/g`, `/\r|\n/g`, `/\s+/g` and `/[\x00-\x1f]/g` all
|
|
8
|
+
* strip both). Only literal arguments are understood: a pattern held in a
|
|
9
|
+
* variable, a `new RegExp(...)`, or a replacement that is a function or a
|
|
10
|
+
* non-literal makes the whole chain `undecided`, and the caller keeps the credit
|
|
11
|
+
* the class-less `replace` row gave before.
|
|
12
|
+
*/
|
|
13
|
+
const MAX_PATTERN_LENGTH = 200;
|
|
14
|
+
/** String methods that may follow a replace in a judged chain without changing its CR / LF coverage. */
|
|
15
|
+
const NEUTRAL_AFTER_REPLACE = new Set([
|
|
16
|
+
'replace', 'replaceAll', 'trim', 'trimStart', 'trimEnd', 'toString',
|
|
17
|
+
'toLowerCase', 'toUpperCase', 'slice', 'substring',
|
|
18
|
+
]);
|
|
19
|
+
/** Probe text: lone and doubled CR / LF, a CRLF pair and neutral characters. */
|
|
20
|
+
const PROBE = 'a\r\rb\n\nc\r\nd\n\re x\t';
|
|
21
|
+
function readQuoted(s, i) {
|
|
22
|
+
const q = s[i];
|
|
23
|
+
if (q !== '"' && q !== "'" && q !== '`')
|
|
24
|
+
return null;
|
|
25
|
+
let out = '';
|
|
26
|
+
for (let j = i + 1; j < s.length; j++) {
|
|
27
|
+
const c = s[j];
|
|
28
|
+
if (c === q)
|
|
29
|
+
return { value: out, end: j + 1 };
|
|
30
|
+
if (q === '`' && c === '$' && s[j + 1] === '{')
|
|
31
|
+
return null;
|
|
32
|
+
if (c === '\\') {
|
|
33
|
+
const n = s[j + 1];
|
|
34
|
+
if (n === undefined)
|
|
35
|
+
return null;
|
|
36
|
+
switch (n) {
|
|
37
|
+
case 'n':
|
|
38
|
+
out += '\n';
|
|
39
|
+
j++;
|
|
40
|
+
continue;
|
|
41
|
+
case 'r':
|
|
42
|
+
out += '\r';
|
|
43
|
+
j++;
|
|
44
|
+
continue;
|
|
45
|
+
case 't':
|
|
46
|
+
out += '\t';
|
|
47
|
+
j++;
|
|
48
|
+
continue;
|
|
49
|
+
case '0':
|
|
50
|
+
out += '\0';
|
|
51
|
+
j++;
|
|
52
|
+
continue;
|
|
53
|
+
case 'x': {
|
|
54
|
+
const h = /^[0-9a-fA-F]{2}/.exec(s.slice(j + 2, j + 4));
|
|
55
|
+
if (!h)
|
|
56
|
+
return null;
|
|
57
|
+
out += String.fromCharCode(parseInt(h[0], 16));
|
|
58
|
+
j += 3;
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
case 'u': {
|
|
62
|
+
const h = /^[0-9a-fA-F]{4}/.exec(s.slice(j + 2, j + 6));
|
|
63
|
+
if (!h)
|
|
64
|
+
return null;
|
|
65
|
+
out += String.fromCharCode(parseInt(h[0], 16));
|
|
66
|
+
j += 5;
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
default:
|
|
70
|
+
out += n;
|
|
71
|
+
j++;
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (c === '\n' && q !== '`')
|
|
76
|
+
return null;
|
|
77
|
+
out += c;
|
|
78
|
+
}
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
function readRegexLiteral(s, i) {
|
|
82
|
+
if (s[i] !== '/')
|
|
83
|
+
return null;
|
|
84
|
+
let inClass = false;
|
|
85
|
+
for (let j = i + 1; j < s.length; j++) {
|
|
86
|
+
const c = s[j];
|
|
87
|
+
if (c === '\n')
|
|
88
|
+
return null;
|
|
89
|
+
if (c === '\\') {
|
|
90
|
+
j++;
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
if (inClass) {
|
|
94
|
+
if (c === ']')
|
|
95
|
+
inClass = false;
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
if (c === '[') {
|
|
99
|
+
inClass = true;
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (c === '/') {
|
|
103
|
+
const flags = /^[dgimsuvy]*/.exec(s.slice(j + 1))[0];
|
|
104
|
+
return { source: s.slice(i + 1, j), flags, end: j + 1 + flags.length };
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
const skipWs = (s, i) => {
|
|
110
|
+
while (i < s.length && /\s/.test(s[i]))
|
|
111
|
+
i++;
|
|
112
|
+
return i;
|
|
113
|
+
};
|
|
114
|
+
/**
|
|
115
|
+
* Parse every `.replace(<literal>, <string literal>)` / `.replaceAll(...)` step
|
|
116
|
+
* of a chain, in source order. Returns null when any step is not literal.
|
|
117
|
+
*/
|
|
118
|
+
function parseSteps(chainText) {
|
|
119
|
+
const steps = [];
|
|
120
|
+
const callRe = /\.\s*(replaceAll|replace)\s*\(/g;
|
|
121
|
+
let m;
|
|
122
|
+
while ((m = callRe.exec(chainText)) !== null) {
|
|
123
|
+
const kind = m[1];
|
|
124
|
+
let i = skipWs(chainText, m.index + m[0].length);
|
|
125
|
+
let pattern;
|
|
126
|
+
const rx = readRegexLiteral(chainText, i);
|
|
127
|
+
if (rx) {
|
|
128
|
+
if (rx.source.length > MAX_PATTERN_LENGTH)
|
|
129
|
+
return null;
|
|
130
|
+
try {
|
|
131
|
+
pattern = new RegExp(rx.source, rx.flags);
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
i = rx.end;
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
const str = readQuoted(chainText, i);
|
|
140
|
+
if (!str)
|
|
141
|
+
return null;
|
|
142
|
+
pattern = str.value;
|
|
143
|
+
i = str.end;
|
|
144
|
+
}
|
|
145
|
+
i = skipWs(chainText, i);
|
|
146
|
+
if (chainText[i] !== ',')
|
|
147
|
+
return null;
|
|
148
|
+
i = skipWs(chainText, i + 1);
|
|
149
|
+
const rep = readQuoted(chainText, i);
|
|
150
|
+
if (!rep)
|
|
151
|
+
return null;
|
|
152
|
+
i = skipWs(chainText, rep.end);
|
|
153
|
+
if (chainText[i] !== ')')
|
|
154
|
+
return null;
|
|
155
|
+
steps.push({ kind, pattern, replacement: rep.value });
|
|
156
|
+
callRe.lastIndex = i + 1;
|
|
157
|
+
}
|
|
158
|
+
return steps;
|
|
159
|
+
}
|
|
160
|
+
function run(steps, input) {
|
|
161
|
+
let s = input;
|
|
162
|
+
try {
|
|
163
|
+
for (const st of steps) {
|
|
164
|
+
if (st.kind === 'replaceAll' && st.pattern instanceof RegExp && !st.pattern.global)
|
|
165
|
+
return null;
|
|
166
|
+
s = st.kind === 'replaceAll'
|
|
167
|
+
? s.replaceAll(st.pattern, st.replacement)
|
|
168
|
+
: s.replace(st.pattern, st.replacement);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
return s;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Verdict for the replace chain whose text is `chainText` (the receiver plus the
|
|
178
|
+
* `.method(...)` segments after it).
|
|
179
|
+
*/
|
|
180
|
+
export function jsReplaceChainVerdict(chainText) {
|
|
181
|
+
const steps = parseSteps(chainText);
|
|
182
|
+
if (!steps || steps.length === 0)
|
|
183
|
+
return 'undecided';
|
|
184
|
+
// Another transform after the first replace may strip CR / LF on its own
|
|
185
|
+
// (`.split("\r").join("")`): the chain is only judged when every later
|
|
186
|
+
// segment is a replace or a harmless string method.
|
|
187
|
+
const first = chainText.search(/\.\s*(?:replaceAll|replace)\s*\(/);
|
|
188
|
+
for (const seg of chainText.slice(first + 1).matchAll(/\.\s*([A-Za-z_$][\w$]*)\s*\(/g)) {
|
|
189
|
+
if (!NEUTRAL_AFTER_REPLACE.has(seg[1]))
|
|
190
|
+
return 'undecided';
|
|
191
|
+
}
|
|
192
|
+
const out = run(steps, PROBE);
|
|
193
|
+
if (out === null)
|
|
194
|
+
return 'undecided';
|
|
195
|
+
return out.includes('\r') || out.includes('\n') ? 'leaves-crlf' : 'strips-crlf';
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* The text of the call chain that starts at (line, column): the receiver
|
|
199
|
+
* expression plus the `.method(...)` segments after it, up to the first
|
|
200
|
+
* character that cannot continue the chain at nesting depth 0. String and regex
|
|
201
|
+
* literals are skipped as units. The chain may continue over following lines.
|
|
202
|
+
*/
|
|
203
|
+
export function jsChainTextAt(sourceLines, line, column) {
|
|
204
|
+
const text = [(sourceLines[line - 1] ?? '').slice(column), ...sourceLines.slice(line, line + 7)].join('\n');
|
|
205
|
+
let depth = 0;
|
|
206
|
+
let prevSig = '';
|
|
207
|
+
let i = 0;
|
|
208
|
+
for (; i < text.length; i++) {
|
|
209
|
+
const c = text[i];
|
|
210
|
+
if (c === '"' || c === "'" || c === '`') {
|
|
211
|
+
for (i++; i < text.length && text[i] !== c; i++)
|
|
212
|
+
if (text[i] === '\\')
|
|
213
|
+
i++;
|
|
214
|
+
prevSig = c;
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
if (c === '/' && depth > 0 && (prevSig === '(' || prevSig === ',')) {
|
|
218
|
+
const rx = readRegexLiteral(text, i);
|
|
219
|
+
if (rx) {
|
|
220
|
+
i = rx.end - 1;
|
|
221
|
+
prevSig = '/';
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
if (c === '(' || c === '[' || c === '{') {
|
|
226
|
+
depth++;
|
|
227
|
+
prevSig = c;
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
if (c === ')' || c === ']' || c === '}') {
|
|
231
|
+
if (depth === 0)
|
|
232
|
+
break;
|
|
233
|
+
depth--;
|
|
234
|
+
prevSig = c;
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
if (depth === 0 && !/[\w$.\s]/.test(c))
|
|
238
|
+
break;
|
|
239
|
+
if (!/\s/.test(c))
|
|
240
|
+
prevSig = c;
|
|
241
|
+
}
|
|
242
|
+
return text.slice(0, i);
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=js-crlf-strip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"js-crlf-strip.js","sourceRoot":"","sources":["../../src/analysis/js-crlf-strip.ts"],"names":[],"mappings":"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"}
|
|
@@ -37,6 +37,8 @@ export declare class CleartextCredentialTransportPass implements AnalysisPass<Cl
|
|
|
37
37
|
readonly name = "cleartext-credential-transport";
|
|
38
38
|
readonly category: 'security';
|
|
39
39
|
run(ctx: PassContext): CleartextCredentialTransportResult;
|
|
40
|
+
/** `http.request('http://…')` whose credential body is written afterwards (#670). */
|
|
41
|
+
private detectNodeRequestBody;
|
|
40
42
|
private detect;
|
|
41
43
|
}
|
|
42
44
|
//# sourceMappingURL=cleartext-credential-transport-pass.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cleartext-credential-transport-pass.d.ts","sourceRoot":"","sources":["../../../src/analysis/passes/cleartext-credential-transport-pass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAU9E,MAAM,WAAW,kCAAkC;IACjD,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;KACb,CAAC,CAAC;CACJ;
|
|
1
|
+
{"version":3,"file":"cleartext-credential-transport-pass.d.ts","sourceRoot":"","sources":["../../../src/analysis/passes/cleartext-credential-transport-pass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAU9E,MAAM,WAAW,kCAAkC;IACjD,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;KACb,CAAC,CAAC;CACJ;AAyED,qBAAa,gCACX,YAAW,YAAY,CAAC,kCAAkC,CAAC;IAE3D,QAAQ,CAAC,IAAI,oCAAoC;IACjD,QAAQ,CAAC,QAAQ,EAAG,UAAU,CAAU;IAExC,GAAG,CAAC,GAAG,EAAE,WAAW,GAAG,kCAAkC,CAmCxD;IAED,qFAAqF;IACrF,OAAO,CAAC,qBAAqB;IAe7B,OAAO,CAAC,MAAM;CA8Ff"}
|
|
@@ -51,19 +51,56 @@ function anyArgCarriesCredential(call, startPos) {
|
|
|
51
51
|
// Direct identifier (`requests.post(url, password)` shape).
|
|
52
52
|
if (argLooksLikeCredential(a))
|
|
53
53
|
return true;
|
|
54
|
-
|
|
55
|
-
const expr = (a.expression ?? '').trim();
|
|
56
|
-
if (!expr)
|
|
57
|
-
continue;
|
|
58
|
-
// Look for credential-keyword as a key OR value identifier.
|
|
59
|
-
if (/(?:["'`]?(?:password|passwd|pwd|secret|api[_-]?key|auth[_-]?token|credential)["'`]?\s*[:=])/i
|
|
60
|
-
.test(expr)) {
|
|
54
|
+
if (textCarriesCredential(a.expression ?? ''))
|
|
61
55
|
return true;
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
56
|
+
}
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
/** True if an expression mentions a credential keyword as a key or a word. */
|
|
60
|
+
function textCarriesCredential(text) {
|
|
61
|
+
const expr = text.trim();
|
|
62
|
+
if (!expr)
|
|
63
|
+
return false;
|
|
64
|
+
// Inline object literal: `{ password: pw, ... }` — keyword as a key.
|
|
65
|
+
if (/(?:["'`]?(?:password|passwd|pwd|secret|api[_-]?key|auth[_-]?token|credential)["'`]?\s*[:=])/i
|
|
66
|
+
.test(expr)) {
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
// Credential identifier appearing as a word.
|
|
70
|
+
return /\b(?:password|passwd|pwd|secret|api_key|api-key|apiKey|auth_token|authToken|credential)\w*\b/i
|
|
71
|
+
.test(expr);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* #670 — node `const r = http.request('http://…', opts)` whose body is sent
|
|
75
|
+
* later with `r.write(x)` / `r.end(x)` on that same binding. Credits `x` when
|
|
76
|
+
* its own text, or the text of the definition of `x` that reaches the write,
|
|
77
|
+
* carries a credential keyword.
|
|
78
|
+
*/
|
|
79
|
+
function nodeRequestWritesCredential(call, graph, lines) {
|
|
80
|
+
const text = lines[call.location.line - 1] ?? '';
|
|
81
|
+
const bound = /(?:const|let|var)\s+([A-Za-z_$][\w$]*)\s*=\s*https?\s*\.\s*request\s*\(/.exec(text);
|
|
82
|
+
if (!bound)
|
|
83
|
+
return false;
|
|
84
|
+
const reqVar = bound[1];
|
|
85
|
+
const reqDef = graph.defsAtLine(call.location.line).find((d) => d.variable === reqVar);
|
|
86
|
+
if (!reqDef)
|
|
87
|
+
return false;
|
|
88
|
+
for (const w of graph.ir.calls) {
|
|
89
|
+
if (w.receiver !== reqVar || (w.method_name !== 'write' && w.method_name !== 'end'))
|
|
90
|
+
continue;
|
|
91
|
+
// The write must use this request object: its reaching def is the binding.
|
|
92
|
+
const use = graph.usesAtLine(w.location.line).find((u) => u.variable === reqVar);
|
|
93
|
+
if (!use || use.def_id !== reqDef.id)
|
|
94
|
+
continue;
|
|
95
|
+
if (anyArgCarriesCredential(w, 0))
|
|
66
96
|
return true;
|
|
97
|
+
for (const a of w.arguments) {
|
|
98
|
+
if (!a.variable)
|
|
99
|
+
continue;
|
|
100
|
+
const argUse = graph.usesAtLine(w.location.line).find((u) => u.variable === a.variable);
|
|
101
|
+
const def = argUse?.def_id != null ? graph.defById.get(argUse.def_id) : undefined;
|
|
102
|
+
if (def && textCarriesCredential(lines[def.line - 1] ?? ''))
|
|
103
|
+
return true;
|
|
67
104
|
}
|
|
68
105
|
}
|
|
69
106
|
return false;
|
|
@@ -75,8 +112,9 @@ export class CleartextCredentialTransportPass {
|
|
|
75
112
|
const { graph, language } = ctx;
|
|
76
113
|
const file = graph.ir.meta.file;
|
|
77
114
|
const findings = [];
|
|
115
|
+
const lines = ctx.code.split('\n');
|
|
78
116
|
for (const call of graph.ir.calls) {
|
|
79
|
-
const detection = this.detect(call, language);
|
|
117
|
+
const detection = this.detect(call, language) ?? this.detectNodeRequestBody(call, language, graph, lines);
|
|
80
118
|
if (!detection)
|
|
81
119
|
continue;
|
|
82
120
|
const { api, url } = detection;
|
|
@@ -101,6 +139,20 @@ export class CleartextCredentialTransportPass {
|
|
|
101
139
|
}
|
|
102
140
|
return { findings };
|
|
103
141
|
}
|
|
142
|
+
/** `http.request('http://…')` whose credential body is written afterwards (#670). */
|
|
143
|
+
detectNodeRequestBody(call, language, graph, lines) {
|
|
144
|
+
if (language !== 'javascript' && language !== 'typescript')
|
|
145
|
+
return null;
|
|
146
|
+
if (call.method_name !== 'request')
|
|
147
|
+
return null;
|
|
148
|
+
const recvLower = (call.receiver ?? '').toLowerCase();
|
|
149
|
+
if (recvLower !== 'http' && !recvLower.endsWith('.http'))
|
|
150
|
+
return null;
|
|
151
|
+
const url = literalAt(call, 0);
|
|
152
|
+
if (!isInsecureHttpUrl(url))
|
|
153
|
+
return null;
|
|
154
|
+
return nodeRequestWritesCredential(call, graph, lines) ? { api: 'http.request', url: url } : null;
|
|
155
|
+
}
|
|
104
156
|
detect(call, language) {
|
|
105
157
|
const method = call.method_name ?? '';
|
|
106
158
|
const receiver = call.receiver ?? '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cleartext-credential-transport-pass.js","sourceRoot":"","sources":["../../../src/analysis/passes/cleartext-credential-transport-pass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAIH,OAAO,EACL,sBAAsB,EACtB,SAAS,EACT,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAElC,MAAM,YAAY,GAAG,mDAAmD,CAAC;AAWzE,iFAAiF;AACjF,SAAS,iBAAiB,CAAC,UAAyB;IAClD,IAAI,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IAC9B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAC;IAClD,wBAAwB;IACxB,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACzC,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1C,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,SAAS,uBAAuB,CAAC,IAAc,EAAE,QAAgB;IAC/D,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QAC/B,IAAI,CAAC,CAAC,QAAQ,GAAG,QAAQ;YAAE,SAAS;QACpC,4DAA4D;QAC5D,IAAI,sBAAsB,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAC3C,
|
|
1
|
+
{"version":3,"file":"cleartext-credential-transport-pass.js","sourceRoot":"","sources":["../../../src/analysis/passes/cleartext-credential-transport-pass.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cross-file-pass.d.ts","sourceRoot":"","sources":["../../../src/analysis/passes/cross-file-pass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACT,aAAa,EAKd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"cross-file-pass.d.ts","sourceRoot":"","sources":["../../../src/analysis/passes/cross-file-pass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACT,aAAa,EAKd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAOjE,MAAM,WAAW,mBAAmB;IAClC,2DAA2D;IAC3D,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,8CAA8C;IAC9C,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,uCAAuC;IACvC,aAAa,EAAE,aAAa,CAAC;IAC7B;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,aAAa;IACxB,GAAG,CACD,YAAY,EAAE,YAAY;IAC1B,2EAA2E;IAC3E,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAClC,OAAO,GAAE,oBAAyB,GACjC,mBAAmB,CA6RrB;CACF"}
|