@ai-dossier/core 1.12.1 → 1.14.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/dist/dry-run-langs.d.ts +37 -0
- package/dist/dry-run-langs.d.ts.map +1 -0
- package/dist/dry-run-langs.js +390 -0
- package/dist/dry-run-langs.js.map +1 -0
- package/dist/dry-run.d.ts +14 -0
- package/dist/dry-run.d.ts.map +1 -1
- package/dist/dry-run.js +1185 -143
- package/dist/dry-run.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/trusted-author.d.ts +21 -0
- package/dist/trusted-author.d.ts.map +1 -0
- package/dist/trusted-author.js +31 -0
- package/dist/trusted-author.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Small per-language extractors for the dry-run analyzer (issue #933).
|
|
3
|
+
*
|
|
4
|
+
* Each extractor pattern-matches the *obvious* exec / delete / network / write
|
|
5
|
+
* calls of a non-shell fence and returns hits. Hits that embed a shell command
|
|
6
|
+
* (`os.system("rm -rf ~")`, `RUN rm -rf /`, `execSync('...')`) carry the literal
|
|
7
|
+
* text in `shell`, which the caller re-analyses with the shell classifier.
|
|
8
|
+
*
|
|
9
|
+
* Every regex here is a fixed alternation with bounded (or single-pass) repeats,
|
|
10
|
+
* so matching is linear in the line length; lines are additionally clipped to
|
|
11
|
+
* MAX_LINE_CHARS before matching.
|
|
12
|
+
*/
|
|
13
|
+
import type { DryRunKind } from './dry-run';
|
|
14
|
+
export type CodeLang = 'python' | 'js' | 'powershell' | 'dockerfile' | 'ruby' | 'perl' | 'sql' | 'yaml';
|
|
15
|
+
export interface CodeHit {
|
|
16
|
+
/** Command text shown in the plan; empty for a hit that only carries `shell`. */
|
|
17
|
+
command: string;
|
|
18
|
+
kind: DryRunKind;
|
|
19
|
+
line: number;
|
|
20
|
+
/** Literal shell command lines embedded in the call, to be analysed as shell. */
|
|
21
|
+
shell?: string[];
|
|
22
|
+
file?: {
|
|
23
|
+
path: string;
|
|
24
|
+
operation: 'write' | 'delete' | 'move';
|
|
25
|
+
};
|
|
26
|
+
network?: {
|
|
27
|
+
tool: string;
|
|
28
|
+
target: string;
|
|
29
|
+
mutates: boolean;
|
|
30
|
+
};
|
|
31
|
+
reason?: string;
|
|
32
|
+
}
|
|
33
|
+
/** Lines longer than this are clipped before regex matching (keeps matching cheap and bounded). */
|
|
34
|
+
export declare const MAX_LINE_CHARS = 4000;
|
|
35
|
+
/** Extract hits from a non-shell fence. `lines` are raw fence lines; `startLine` is the first line's number. */
|
|
36
|
+
export declare function extractCodeHits(lang: CodeLang, lines: string[], startLine: number): CodeHit[];
|
|
37
|
+
//# sourceMappingURL=dry-run-langs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dry-run-langs.d.ts","sourceRoot":"","sources":["../src/dry-run-langs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,MAAM,MAAM,QAAQ,GAChB,QAAQ,GACR,IAAI,GACJ,YAAY,GACZ,YAAY,GACZ,MAAM,GACN,MAAM,GACN,KAAK,GACL,MAAM,CAAC;AAEX,MAAM,WAAW,OAAO;IACtB,iFAAiF;IACjF,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAA;KAAE,CAAC;IAChE,OAAO,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,mGAAmG;AACnG,eAAO,MAAM,cAAc,OAAO,CAAC;AAkWnC,gHAAgH;AAChH,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,EAAE,CAkD7F"}
|
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Small per-language extractors for the dry-run analyzer (issue #933).
|
|
4
|
+
*
|
|
5
|
+
* Each extractor pattern-matches the *obvious* exec / delete / network / write
|
|
6
|
+
* calls of a non-shell fence and returns hits. Hits that embed a shell command
|
|
7
|
+
* (`os.system("rm -rf ~")`, `RUN rm -rf /`, `execSync('...')`) carry the literal
|
|
8
|
+
* text in `shell`, which the caller re-analyses with the shell classifier.
|
|
9
|
+
*
|
|
10
|
+
* Every regex here is a fixed alternation with bounded (or single-pass) repeats,
|
|
11
|
+
* so matching is linear in the line length; lines are additionally clipped to
|
|
12
|
+
* MAX_LINE_CHARS before matching.
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.MAX_LINE_CHARS = void 0;
|
|
16
|
+
exports.extractCodeHits = extractCodeHits;
|
|
17
|
+
/** Lines longer than this are clipped before regex matching (keeps matching cheap and bounded). */
|
|
18
|
+
exports.MAX_LINE_CHARS = 4000;
|
|
19
|
+
const STRING_LITERAL = /"(?:[^"\\\n]|\\.)*"|'(?:[^'\\\n]|\\.)*'|`(?:[^`\\]|\\.)*`/g;
|
|
20
|
+
/** String literals appearing after `from` on the line, unquoted, at most `max` of them. */
|
|
21
|
+
function literalsAfter(line, from, max = 24) {
|
|
22
|
+
const out = [];
|
|
23
|
+
for (const m of line.slice(from).matchAll(STRING_LITERAL)) {
|
|
24
|
+
out.push(m[0].slice(1, -1).replace(/\\(["'`\\])/g, '$1'));
|
|
25
|
+
if (out.length >= max)
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
return out;
|
|
29
|
+
}
|
|
30
|
+
function hostFromText(s) {
|
|
31
|
+
const m = s.match(/[a-z][a-z0-9+.-]*:\/\/([^/\s:'"`)]+)/i);
|
|
32
|
+
return m ? m[1] : 'unknown host';
|
|
33
|
+
}
|
|
34
|
+
const FETCH_OR_DECODE_HINT = /\b(?:requests\.|urlopen|urllib|httpx\.|fetch\s*\(|axios|https?\.get|b64decode|atob|Buffer\.from|zlib\.|Invoke-WebRequest|Invoke-RestMethod|iwr|irm|DownloadString|FromBase64String|Net::HTTP|open-uri|URI\.open|LWP)/;
|
|
35
|
+
// --- python ----------------------------------------------------------------
|
|
36
|
+
const PY_EXEC = /\.(?:system|popen)\s*\(|\bsubprocess\.\w+\s*\(|(?<![\w.])(?:check_output|check_call|getoutput|Popen)\s*\(|\bos\.(?:exec|spawn)\w*\s*\(|\bpty\.spawn\s*\(|\basyncio\.create_subprocess_\w+\s*\(|\bpexpect\.(?:spawn|run)\s*\(/g;
|
|
37
|
+
const PY_DELETE = /\b(?:shutil\.rmtree|os\.(?:remove|unlink|rmdir|removedirs)|send2trash)\s*\(|\.(?:unlink|rmdir|rmtree)\s*\(/g;
|
|
38
|
+
const PY_WRITE = /\bshutil\.(?:copy\w*|move)\s*\(|\bos\.(?:rename|replace|makedirs|mkdir|chmod|chown)\s*\(|\.(?:write_text|write_bytes|mkdir|touch)\s*\(|\bopen\s*\(\s*(?:"[^"\n]*"|'[^'\n]*')\s*,\s*["'][wax]/g;
|
|
39
|
+
const PY_NET = /\brequests\.(get|post|put|delete|patch|head)\s*\(|\b(?:urlopen|urlretrieve)\s*\(|\bhttpx\.(?:get|post|put|delete|patch|Client|AsyncClient)\b|\baiohttp\.\w+|\bparamiko\.\w+|\bsmtplib\.\w+/g;
|
|
40
|
+
const PY_EVAL = /\b(?:exec|eval)\s*\(/;
|
|
41
|
+
// --- js / ts ---------------------------------------------------------------
|
|
42
|
+
const JS_EXEC = /(?<![\w.$])(?:execSync|execFileSync|spawnSync|spawn|execFile|exec|fork)\s*\(|\.(?:execSync|execFileSync|spawnSync|spawn|execFile)\s*\(|\b(?:child_process|childProcess|cp)\.exec\s*\(|\bBun\.(?:spawn|spawnSync)\s*\(|\bDeno\.Command\s*\(|\bexeca(?:Sync|Command|CommandSync)?\s*\(|(?<![\w$])\$\s*`|\bshell(?:js)?\.exec\s*\(|\bBun\.\$\s*`/g;
|
|
43
|
+
const JS_DELETE = /\b(?:fs|fsp|promises|fse|fsExtra)\.(?:rmSync|rmdirSync|unlinkSync|rm|rmdir|unlink|remove|removeSync|emptyDir|emptyDirSync)\s*\(|(?<![\w.$])(?:rmSync|unlinkSync|rmdirSync|rimraf|rimrafSync)\s*\(|\.(?:rmSync|unlinkSync|rmdirSync)\s*\(|\brimraf(?:\.sync)?\s*\(|\bDeno\.remove(?:Sync)?\s*\(/g;
|
|
44
|
+
const JS_WRITE = /\b(?:fs|fsp|promises|fse|fsExtra)\.(?:writeFile|writeFileSync|appendFile|appendFileSync|mkdir|mkdirSync|copyFile|copyFileSync|rename|renameSync|cp|cpSync|createWriteStream|chmod|chmodSync|outputFile|outputFileSync)\s*\(|\bDeno\.writeTextFile(?:Sync)?\s*\(|\bBun\.write\s*\(/g;
|
|
45
|
+
const JS_NET = /(?<![\w.$])fetch\s*\(|\baxios(?:\.(get|post|put|delete|patch|head))?\s*\(|\b(?:https?|http2)\.(?:request|get)\s*\(|(?<![\w.$])got(?:\.(get|post|put|delete|patch))?\s*\(|\bnew\s+(?:XMLHttpRequest|WebSocket)\b/g;
|
|
46
|
+
const JS_EVAL = /\b(?:eval|new\s+Function|vm\.runIn\w+)\s*\(/;
|
|
47
|
+
// --- powershell / cmd ------------------------------------------------------
|
|
48
|
+
const PS_DELETE = /(?<![\w-])(?:Remove-Item|Remove-ItemProperty|Remove-\w+|Clear-Disk|Clear-Content|Format-Volume|Initialize-Disk|Stop-Computer|Restart-Computer|Uninstall-\w+|Unregister-\w+|Disable-\w+)(?![\w-])|(?<![\w-])(?:ri|rd|rmdir|del|erase)\s+(?:[-/]\S+\s+)*[^\s/-]|(?<![\w-])(?:reg(?:\.exe)?\s+delete|format\s+[a-z]:|diskpart)\b/gi;
|
|
49
|
+
const PS_FETCH = /(?<![\w-])(?:Invoke-WebRequest|Invoke-RestMethod|Start-BitsTransfer|iwr|irm)(?![\w-])|\bNet\.WebClient\b|\.Download(?:String|File|Data)\s*\(|\bcertutil\b[^\n]*-urlcache/gi;
|
|
50
|
+
const PS_EXEC = /(?<![\w-])(?:iex|Invoke-Expression)(?![\w-])/i;
|
|
51
|
+
const PS_WRITE = /(?<![\w-])(?:Set-Content|Add-Content|Out-File|New-Item|Copy-Item|Move-Item|Rename-Item|Export-\w+|Tee-Object|Start-Process|Invoke-Command)(?![\w-])/gi;
|
|
52
|
+
const PS_ENCODED = /-(?:enc|encodedcommand|e)\b|FromBase64String/i;
|
|
53
|
+
const PS_CLI_LINE = /^\s*(?:git|gh|npm|pnpm|yarn|npx|docker|kubectl|terraform|aws|az|gcloud|curl|wget|ssh|scp|make|cargo|pip3?|python[\d.]*|node|rm|mv|cp|dd|sudo)\b/;
|
|
54
|
+
// --- ruby / perl -----------------------------------------------------------
|
|
55
|
+
const RB_EXEC = /(?<![\w.])(?:system|exec|spawn)\s*\(|(?<![\w.])(?:system|exec|spawn)\s+["']|%x[[{(]|\bIO\.popen\s*\(|\bOpen3\.\w+\s*\(|\bKernel\.(?:system|exec|spawn)\b|\bqx\s*[/{([]|\bopen\s*\(\s*["']\s*\|/g;
|
|
56
|
+
const RB_DELETE = /\b(?:File\.(?:delete|unlink)|FileUtils\.(?:rm|rm_rf|rm_r|rm_f|remove_entry|remove_dir)|Dir\.rmdir|unlink|rmtree)\b/g;
|
|
57
|
+
const RB_NET = /\b(?:Net::HTTP|URI\.open|open-uri|LWP::\w+|HTTP::Tiny)\b/g;
|
|
58
|
+
const RB_BACKTICK = /`([^`\n]+)`/g;
|
|
59
|
+
// --- sql -------------------------------------------------------------------
|
|
60
|
+
const SQL_DESTRUCTIVE = /\b(?:DROP\s+(?:TABLE|DATABASE|SCHEMA|INDEX|USER|ROLE|VIEW|COLLECTION)|TRUNCATE(?:\s+TABLE)?|dropDatabase|FLUSH(?:ALL|DB))\b/i;
|
|
61
|
+
const SQL_WRITE = /\b(?:INSERT\s+INTO|UPDATE\s+\w+\s+SET|ALTER\s+TABLE|CREATE\s+(?:TABLE|DATABASE|USER)|GRANT)\b/i;
|
|
62
|
+
const SQL_DELETE = /\bDELETE\s+FROM\b/i;
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
function pushShellFromCall(hits, line, lineNo, at, matchLen, label) {
|
|
65
|
+
const lits = literalsAfter(line, at + matchLen);
|
|
66
|
+
hits.push({
|
|
67
|
+
command: line.trim(),
|
|
68
|
+
kind: 'local_write',
|
|
69
|
+
line: lineNo,
|
|
70
|
+
shell: lits.length > 0 ? [lits.join(' ')] : undefined,
|
|
71
|
+
reason: label,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
function scanPython(line, no, hits) {
|
|
75
|
+
for (const m of line.matchAll(PY_EXEC))
|
|
76
|
+
pushShellFromCall(hits, line, no, m.index ?? 0, m[0].length, 'python process execution');
|
|
77
|
+
for (const m of line.matchAll(PY_DELETE)) {
|
|
78
|
+
const lit = literalsAfter(line, (m.index ?? 0) + m[0].length, 1)[0];
|
|
79
|
+
hits.push({
|
|
80
|
+
command: line.trim(),
|
|
81
|
+
kind: 'destructive',
|
|
82
|
+
line: no,
|
|
83
|
+
file: { path: lit ?? '(computed path)', operation: 'delete' },
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
for (const m of line.matchAll(PY_WRITE)) {
|
|
87
|
+
const lit = literalsAfter(line, (m.index ?? 0) + m[0].length, 1)[0];
|
|
88
|
+
hits.push({
|
|
89
|
+
command: line.trim(),
|
|
90
|
+
kind: 'local_write',
|
|
91
|
+
line: no,
|
|
92
|
+
file: lit ? { path: lit, operation: 'write' } : undefined,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
for (const m of line.matchAll(PY_NET)) {
|
|
96
|
+
const verb = (m[1] ?? '').toLowerCase();
|
|
97
|
+
const mutates = verb !== '' && verb !== 'get' && verb !== 'head';
|
|
98
|
+
hits.push({
|
|
99
|
+
command: line.trim(),
|
|
100
|
+
kind: verb === 'delete' ? 'destructive' : 'remote',
|
|
101
|
+
line: no,
|
|
102
|
+
network: { tool: 'python', target: hostFromText(line), mutates },
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
if (PY_EVAL.test(line) && FETCH_OR_DECODE_HINT.test(line)) {
|
|
106
|
+
hits.push({
|
|
107
|
+
command: line.trim(),
|
|
108
|
+
kind: 'destructive',
|
|
109
|
+
line: no,
|
|
110
|
+
reason: 'executes fetched or decoded code',
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
function scanJs(line, no, hits) {
|
|
115
|
+
for (const m of line.matchAll(JS_EXEC))
|
|
116
|
+
pushShellFromCall(hits, line, no, m.index ?? 0, m[0].length, 'javascript process execution');
|
|
117
|
+
for (const m of line.matchAll(JS_DELETE)) {
|
|
118
|
+
const lit = literalsAfter(line, (m.index ?? 0) + m[0].length, 1)[0];
|
|
119
|
+
hits.push({
|
|
120
|
+
command: line.trim(),
|
|
121
|
+
kind: 'destructive',
|
|
122
|
+
line: no,
|
|
123
|
+
file: { path: lit ?? '(computed path)', operation: 'delete' },
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
for (const m of line.matchAll(JS_WRITE)) {
|
|
127
|
+
const lit = literalsAfter(line, (m.index ?? 0) + m[0].length, 1)[0];
|
|
128
|
+
hits.push({
|
|
129
|
+
command: line.trim(),
|
|
130
|
+
kind: 'local_write',
|
|
131
|
+
line: no,
|
|
132
|
+
file: lit ? { path: lit, operation: 'write' } : undefined,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
for (const m of line.matchAll(JS_NET)) {
|
|
136
|
+
const verb = (m[1] ?? m[2] ?? '').toLowerCase();
|
|
137
|
+
const explicit = line.match(/method\s*:\s*['"`](POST|PUT|PATCH|DELETE)['"`]/i)?.[1];
|
|
138
|
+
const method = (explicit ?? verb).toLowerCase();
|
|
139
|
+
const mutates = method !== '' && method !== 'get' && method !== 'head';
|
|
140
|
+
hits.push({
|
|
141
|
+
command: line.trim(),
|
|
142
|
+
kind: method === 'delete' ? 'destructive' : 'remote',
|
|
143
|
+
line: no,
|
|
144
|
+
network: { tool: 'javascript', target: hostFromText(line), mutates },
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
if (JS_EVAL.test(line)) {
|
|
148
|
+
const fetched = FETCH_OR_DECODE_HINT.test(line);
|
|
149
|
+
hits.push({
|
|
150
|
+
command: line.trim(),
|
|
151
|
+
kind: fetched ? 'destructive' : 'local_write',
|
|
152
|
+
line: no,
|
|
153
|
+
reason: fetched ? 'executes fetched or decoded code' : 'dynamic code evaluation',
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
function scanPowerShell(line, no, hits, state) {
|
|
158
|
+
let matched = false;
|
|
159
|
+
for (const m of line.matchAll(PS_DELETE)) {
|
|
160
|
+
matched = true;
|
|
161
|
+
const rest = line.slice((m.index ?? 0) + m[0].length);
|
|
162
|
+
const target = rest.match(/(?:-Path\s+)?(["']?)([^\s"'|;-][^\s"'|;]*)\1/)?.[2];
|
|
163
|
+
hits.push({
|
|
164
|
+
command: line.trim(),
|
|
165
|
+
kind: 'destructive',
|
|
166
|
+
line: no,
|
|
167
|
+
file: { path: target ?? '(computed path)', operation: 'delete' },
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
const fetches = [...line.matchAll(PS_FETCH)];
|
|
171
|
+
if (fetches.length > 0) {
|
|
172
|
+
matched = true;
|
|
173
|
+
state.fetched = true;
|
|
174
|
+
const mutates = /-Method\s+(?:POST|PUT|PATCH|DELETE)\b/i.test(line);
|
|
175
|
+
hits.push({
|
|
176
|
+
command: line.trim(),
|
|
177
|
+
kind: 'remote',
|
|
178
|
+
line: no,
|
|
179
|
+
network: { tool: 'powershell', target: hostFromText(line), mutates },
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
if (PS_EXEC.test(line)) {
|
|
183
|
+
matched = true;
|
|
184
|
+
const remoteExec = state.fetched || fetches.length > 0 || PS_ENCODED.test(line);
|
|
185
|
+
hits.push({
|
|
186
|
+
command: line.trim(),
|
|
187
|
+
kind: remoteExec ? 'destructive' : 'local_write',
|
|
188
|
+
line: no,
|
|
189
|
+
reason: remoteExec ? 'executes fetched or decoded code (iex)' : 'dynamic code evaluation',
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
else if (/(?:powershell|pwsh)(?:\.exe)?\b[^\n]*\s-(?:enc|encodedcommand)\b/i.test(line)) {
|
|
193
|
+
matched = true;
|
|
194
|
+
hits.push({
|
|
195
|
+
command: line.trim(),
|
|
196
|
+
kind: 'destructive',
|
|
197
|
+
line: no,
|
|
198
|
+
reason: 'encoded PowerShell command (opaque payload)',
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
for (const _m of line.matchAll(PS_WRITE)) {
|
|
202
|
+
matched = true;
|
|
203
|
+
hits.push({ command: line.trim(), kind: 'local_write', line: no });
|
|
204
|
+
break;
|
|
205
|
+
}
|
|
206
|
+
if (!matched && PS_CLI_LINE.test(line)) {
|
|
207
|
+
hits.push({ command: '', kind: 'read', line: no, shell: [line.trim()] });
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
function scanRubyPerl(line, no, hits) {
|
|
211
|
+
for (const m of line.matchAll(RB_EXEC))
|
|
212
|
+
pushShellFromCall(hits, line, no, m.index ?? 0, m[0].length, 'process execution');
|
|
213
|
+
for (const m of line.matchAll(RB_BACKTICK)) {
|
|
214
|
+
hits.push({
|
|
215
|
+
command: line.trim(),
|
|
216
|
+
kind: 'local_write',
|
|
217
|
+
line: no,
|
|
218
|
+
shell: [m[1]],
|
|
219
|
+
reason: 'backtick process execution',
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
for (const m of line.matchAll(RB_DELETE)) {
|
|
223
|
+
const lit = literalsAfter(line, (m.index ?? 0) + m[0].length, 1)[0];
|
|
224
|
+
hits.push({
|
|
225
|
+
command: line.trim(),
|
|
226
|
+
kind: 'destructive',
|
|
227
|
+
line: no,
|
|
228
|
+
file: { path: lit ?? '(computed path)', operation: 'delete' },
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
for (const _m of line.matchAll(RB_NET)) {
|
|
232
|
+
hits.push({
|
|
233
|
+
command: line.trim(),
|
|
234
|
+
kind: 'remote',
|
|
235
|
+
line: no,
|
|
236
|
+
network: { tool: 'script', target: hostFromText(line), mutates: false },
|
|
237
|
+
});
|
|
238
|
+
break;
|
|
239
|
+
}
|
|
240
|
+
if (/\b(?:eval|instance_eval)\b/.test(line) && FETCH_OR_DECODE_HINT.test(line)) {
|
|
241
|
+
hits.push({
|
|
242
|
+
command: line.trim(),
|
|
243
|
+
kind: 'destructive',
|
|
244
|
+
line: no,
|
|
245
|
+
reason: 'executes fetched or decoded code',
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
function scanSql(line, no, hits) {
|
|
250
|
+
const network = { tool: 'sql', target: 'database', mutates: true };
|
|
251
|
+
if (SQL_DESTRUCTIVE.test(line) || (SQL_DELETE.test(line) && !/\bWHERE\b/i.test(line))) {
|
|
252
|
+
hits.push({ command: line.trim(), kind: 'destructive', line: no, network });
|
|
253
|
+
}
|
|
254
|
+
else if (SQL_DELETE.test(line) || SQL_WRITE.test(line)) {
|
|
255
|
+
hits.push({ command: line.trim(), kind: 'remote', line: no, network });
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
/** `["a", "b"]` exec-form or plain shell-form instruction argument -> one shell command line. */
|
|
259
|
+
function instructionToShell(rest) {
|
|
260
|
+
const t = rest.trim();
|
|
261
|
+
if (t.startsWith('['))
|
|
262
|
+
return literalsAfter(t, 0, 40).join(' ');
|
|
263
|
+
return t;
|
|
264
|
+
}
|
|
265
|
+
function scanDockerfile(line, no, hits) {
|
|
266
|
+
const m = line.match(/^\s*(?:ONBUILD\s+)?(RUN|CMD|ENTRYPOINT|HEALTHCHECK\s+(?:--\S+\s+)*CMD|ADD|COPY)\s+(?:--\S+\s+)*(.*)$/i);
|
|
267
|
+
if (!m)
|
|
268
|
+
return;
|
|
269
|
+
const instr = m[1].toUpperCase();
|
|
270
|
+
const rest = m[2];
|
|
271
|
+
if (instr === 'ADD' || instr === 'COPY') {
|
|
272
|
+
if (/https?:\/\//i.test(rest)) {
|
|
273
|
+
hits.push({
|
|
274
|
+
command: line.trim(),
|
|
275
|
+
kind: 'remote',
|
|
276
|
+
line: no,
|
|
277
|
+
network: { tool: 'docker', target: hostFromText(rest), mutates: false },
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
const shell = instructionToShell(rest);
|
|
283
|
+
hits.push({
|
|
284
|
+
command: line.trim(),
|
|
285
|
+
kind: 'local_write',
|
|
286
|
+
line: no,
|
|
287
|
+
shell: shell ? [shell] : undefined,
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
const YAML_RUN_KEYS = /^(\s*)(?:-\s+)?(run|script|before_script|after_script|command|commands|entrypoint)\s*:\s*(.*)$/;
|
|
291
|
+
function scanYaml(lines, startLine, hits) {
|
|
292
|
+
for (let i = 0; i < lines.length; i++) {
|
|
293
|
+
const m = lines[i].slice(0, exports.MAX_LINE_CHARS).match(YAML_RUN_KEYS);
|
|
294
|
+
if (!m)
|
|
295
|
+
continue;
|
|
296
|
+
const indent = m[1].length;
|
|
297
|
+
const rest = m[3].trim();
|
|
298
|
+
const shell = [];
|
|
299
|
+
if (rest === '' || /^[|>][+-]?\d*$/.test(rest)) {
|
|
300
|
+
// Block scalar or nested list: every more-indented following line is a command.
|
|
301
|
+
let acc = '';
|
|
302
|
+
for (let j = i + 1; j < lines.length; j++) {
|
|
303
|
+
const raw = lines[j].slice(0, exports.MAX_LINE_CHARS);
|
|
304
|
+
if (raw.trim() === '')
|
|
305
|
+
continue;
|
|
306
|
+
const ind = raw.length - raw.trimStart().length;
|
|
307
|
+
if (ind <= indent)
|
|
308
|
+
break;
|
|
309
|
+
const text = raw.trim().replace(/^-\s+/, '');
|
|
310
|
+
if (text.startsWith('#'))
|
|
311
|
+
continue;
|
|
312
|
+
if (/\\\s*$/.test(text)) {
|
|
313
|
+
acc += `${text.replace(/\\\s*$/, '')} `;
|
|
314
|
+
continue;
|
|
315
|
+
}
|
|
316
|
+
shell.push((acc + text).trim());
|
|
317
|
+
acc = '';
|
|
318
|
+
}
|
|
319
|
+
if (acc.trim())
|
|
320
|
+
shell.push(acc.trim());
|
|
321
|
+
}
|
|
322
|
+
else if (!rest.startsWith('#')) {
|
|
323
|
+
shell.push(instructionToShell(rest.replace(/^(["'])(.*)\1$/, '$2')));
|
|
324
|
+
}
|
|
325
|
+
if (shell.length > 0) {
|
|
326
|
+
hits.push({ command: '', kind: 'read', line: startLine + i, shell });
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
/** Extract hits from a non-shell fence. `lines` are raw fence lines; `startLine` is the first line's number. */
|
|
331
|
+
function extractCodeHits(lang, lines, startLine) {
|
|
332
|
+
const hits = [];
|
|
333
|
+
if (lang === 'yaml') {
|
|
334
|
+
scanYaml(lines, startLine, hits);
|
|
335
|
+
return hits;
|
|
336
|
+
}
|
|
337
|
+
const psState = { fetched: false };
|
|
338
|
+
// Dockerfile / python lines joined on `\` continuation keep the first physical line number.
|
|
339
|
+
let acc = '';
|
|
340
|
+
let accLine = 0;
|
|
341
|
+
const flush = (text, no) => {
|
|
342
|
+
const line = text.slice(0, exports.MAX_LINE_CHARS);
|
|
343
|
+
const trimmed = line.trim();
|
|
344
|
+
if (!trimmed)
|
|
345
|
+
return;
|
|
346
|
+
switch (lang) {
|
|
347
|
+
case 'python':
|
|
348
|
+
if (!trimmed.startsWith('#'))
|
|
349
|
+
scanPython(line, no, hits);
|
|
350
|
+
break;
|
|
351
|
+
case 'js':
|
|
352
|
+
if (!trimmed.startsWith('//') && !trimmed.startsWith('*'))
|
|
353
|
+
scanJs(line, no, hits);
|
|
354
|
+
break;
|
|
355
|
+
case 'powershell':
|
|
356
|
+
if (!trimmed.startsWith('#') && !/^(?:rem|::)\b/i.test(trimmed))
|
|
357
|
+
scanPowerShell(line, no, hits, psState);
|
|
358
|
+
break;
|
|
359
|
+
case 'dockerfile':
|
|
360
|
+
if (!trimmed.startsWith('#'))
|
|
361
|
+
scanDockerfile(line, no, hits);
|
|
362
|
+
break;
|
|
363
|
+
case 'ruby':
|
|
364
|
+
case 'perl':
|
|
365
|
+
if (!trimmed.startsWith('#'))
|
|
366
|
+
scanRubyPerl(line, no, hits);
|
|
367
|
+
break;
|
|
368
|
+
case 'sql':
|
|
369
|
+
if (!trimmed.startsWith('--'))
|
|
370
|
+
scanSql(line, no, hits);
|
|
371
|
+
break;
|
|
372
|
+
}
|
|
373
|
+
};
|
|
374
|
+
lines.forEach((raw, idx) => {
|
|
375
|
+
const no = startLine + idx;
|
|
376
|
+
const continues = lang === 'dockerfile' && /\\\s*$/.test(raw);
|
|
377
|
+
if (!acc)
|
|
378
|
+
accLine = no;
|
|
379
|
+
if (continues) {
|
|
380
|
+
acc += `${raw.replace(/\\\s*$/, '')} `;
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
flush(acc + raw, accLine);
|
|
384
|
+
acc = '';
|
|
385
|
+
});
|
|
386
|
+
if (acc.trim())
|
|
387
|
+
flush(acc, accLine);
|
|
388
|
+
return hits;
|
|
389
|
+
}
|
|
390
|
+
//# sourceMappingURL=dry-run-langs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dry-run-langs.js","sourceRoot":"","sources":["../src/dry-run-langs.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;AA8XH,0CAkDC;AAtZD,mGAAmG;AACtF,QAAA,cAAc,GAAG,IAAI,CAAC;AAEnC,MAAM,cAAc,GAAG,4DAA4D,CAAC;AAEpF,2FAA2F;AAC3F,SAAS,aAAa,CAAC,IAAY,EAAE,IAAY,EAAE,GAAG,GAAG,EAAE;IACzD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QAC1D,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC;QAC1D,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG;YAAE,MAAM;IAC/B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,YAAY,CAAC,CAAS;IAC7B,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;AACnC,CAAC;AAED,MAAM,oBAAoB,GACxB,sNAAsN,CAAC;AAEzN,8EAA8E;AAE9E,MAAM,OAAO,GACX,+NAA+N,CAAC;AAClO,MAAM,SAAS,GACb,6GAA6G,CAAC;AAChH,MAAM,QAAQ,GACZ,+LAA+L,CAAC;AAClM,MAAM,MAAM,GACV,6LAA6L,CAAC;AAChM,MAAM,OAAO,GAAG,sBAAsB,CAAC;AAEvC,8EAA8E;AAE9E,MAAM,OAAO,GACX,gVAAgV,CAAC;AACnV,MAAM,SAAS,GACb,iSAAiS,CAAC;AACpS,MAAM,QAAQ,GACZ,oRAAoR,CAAC;AACvR,MAAM,MAAM,GACV,kNAAkN,CAAC;AACrN,MAAM,OAAO,GAAG,6CAA6C,CAAC;AAE9D,8EAA8E;AAE9E,MAAM,SAAS,GACb,iUAAiU,CAAC;AACpU,MAAM,QAAQ,GACZ,4KAA4K,CAAC;AAC/K,MAAM,OAAO,GAAG,+CAA+C,CAAC;AAChE,MAAM,QAAQ,GACZ,uJAAuJ,CAAC;AAC1J,MAAM,UAAU,GAAG,+CAA+C,CAAC;AACnE,MAAM,WAAW,GACf,iJAAiJ,CAAC;AAEpJ,8EAA8E;AAE9E,MAAM,OAAO,GACX,iMAAiM,CAAC;AACpM,MAAM,SAAS,GACb,qHAAqH,CAAC;AACxH,MAAM,MAAM,GAAG,2DAA2D,CAAC;AAC3E,MAAM,WAAW,GAAG,cAAc,CAAC;AAEnC,8EAA8E;AAE9E,MAAM,eAAe,GACnB,8HAA8H,CAAC;AACjI,MAAM,SAAS,GACb,gGAAgG,CAAC;AACnG,MAAM,UAAU,GAAG,oBAAoB,CAAC;AAExC,8EAA8E;AAE9E,SAAS,iBAAiB,CACxB,IAAe,EACf,IAAY,EACZ,MAAc,EACd,EAAU,EACV,QAAgB,EAChB,KAAa;IAEb,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,EAAE,EAAE,GAAG,QAAQ,CAAC,CAAC;IAChD,IAAI,CAAC,IAAI,CAAC;QACR,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;QACpB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;QACrD,MAAM,EAAE,KAAK;KACd,CAAC,CAAC;AACL,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,EAAU,EAAE,IAAe;IAC3D,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QACpC,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;IAC3F,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpE,IAAI,CAAC,IAAI,CAAC;YACR,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;YACpB,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,EAAE;YACR,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,IAAI,iBAAiB,EAAE,SAAS,EAAE,QAAQ,EAAE;SAC9D,CAAC,CAAC;IACL,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpE,IAAI,CAAC,IAAI,CAAC;YACR,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;YACpB,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,EAAE;YACR,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS;SAC1D,CAAC,CAAC;IACL,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,MAAM,CAAC;QACjE,IAAI,CAAC,IAAI,CAAC;YACR,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;YACpB,IAAI,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ;YAClD,IAAI,EAAE,EAAE;YACR,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE;SACjE,CAAC,CAAC;IACL,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1D,IAAI,CAAC,IAAI,CAAC;YACR,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;YACpB,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,EAAE;YACR,MAAM,EAAE,kCAAkC;SAC3C,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CAAC,IAAY,EAAE,EAAU,EAAE,IAAe;IACvD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QACpC,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,8BAA8B,CAAC,CAAC;IAC/F,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpE,IAAI,CAAC,IAAI,CAAC;YACR,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;YACpB,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,EAAE;YACR,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,IAAI,iBAAiB,EAAE,SAAS,EAAE,QAAQ,EAAE;SAC9D,CAAC,CAAC;IACL,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpE,IAAI,CAAC,IAAI,CAAC;YACR,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;YACpB,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,EAAE;YACR,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS;SAC1D,CAAC,CAAC;IACL,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,iDAAiD,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACpF,MAAM,MAAM,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,KAAK,EAAE,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM,CAAC;QACvE,IAAI,CAAC,IAAI,CAAC;YACR,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;YACpB,IAAI,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ;YACpD,IAAI,EAAE,EAAE;YACR,OAAO,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE;SACrE,CAAC,CAAC;IACL,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,CAAC;YACR,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;YACpB,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa;YAC7C,IAAI,EAAE,EAAE;YACR,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC,yBAAyB;SACjF,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,IAAY,EAAE,EAAU,EAAE,IAAe,EAAE,KAA2B;IAC5F,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,OAAO,GAAG,IAAI,CAAC;QACf,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,8CAA8C,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/E,IAAI,CAAC,IAAI,CAAC;YACR,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;YACpB,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,EAAE;YACR,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,IAAI,iBAAiB,EAAE,SAAS,EAAE,QAAQ,EAAE;SACjE,CAAC,CAAC;IACL,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC7C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,IAAI,CAAC;QACf,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;QACrB,MAAM,OAAO,GAAG,wCAAwC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpE,IAAI,CAAC,IAAI,CAAC;YACR,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;YACpB,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,EAAE;YACR,OAAO,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE;SACrE,CAAC,CAAC;IACL,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,IAAI,CAAC;QACf,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChF,IAAI,CAAC,IAAI,CAAC;YACR,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;YACpB,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa;YAChD,IAAI,EAAE,EAAE;YACR,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,wCAAwC,CAAC,CAAC,CAAC,yBAAyB;SAC1F,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,mEAAmE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1F,OAAO,GAAG,IAAI,CAAC;QACf,IAAI,CAAC,IAAI,CAAC;YACR,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;YACpB,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,EAAE;YACR,MAAM,EAAE,6CAA6C;SACtD,CAAC,CAAC;IACL,CAAC;IACD,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzC,OAAO,GAAG,IAAI,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACnE,MAAM;IACR,CAAC;IACD,IAAI,CAAC,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,EAAU,EAAE,IAAe;IAC7D,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QACpC,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IACpF,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC3C,IAAI,CAAC,IAAI,CAAC;YACR,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;YACpB,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,EAAE;YACR,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACb,MAAM,EAAE,4BAA4B;SACrC,CAAC,CAAC;IACL,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpE,IAAI,CAAC,IAAI,CAAC;YACR,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;YACpB,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,EAAE;YACR,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,IAAI,iBAAiB,EAAE,SAAS,EAAE,QAAQ,EAAE;SAC9D,CAAC,CAAC;IACL,CAAC;IACD,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC;YACR,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;YACpB,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,EAAE;YACR,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE;SACxE,CAAC,CAAC;QACH,MAAM;IACR,CAAC;IACD,IAAI,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/E,IAAI,CAAC,IAAI,CAAC;YACR,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;YACpB,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,EAAE;YACR,MAAM,EAAE,kCAAkC;SAC3C,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,IAAY,EAAE,EAAU,EAAE,IAAe;IACxD,MAAM,OAAO,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACnE,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACtF,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9E,CAAC;SAAM,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACzD,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IACzE,CAAC;AACH,CAAC;AAED,iGAAiG;AACjG,SAAS,kBAAkB,CAAC,IAAY;IACtC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACtB,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChE,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,cAAc,CAAC,IAAY,EAAE,EAAU,EAAE,IAAe;IAC/D,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAClB,uGAAuG,CACxG,CAAC;IACF,IAAI,CAAC,CAAC;QAAE,OAAO;IACf,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAClB,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACxC,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,IAAI,CAAC;gBACR,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;gBACpB,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,EAAE;gBACR,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE;aACxE,CAAC,CAAC;QACL,CAAC;QACD,OAAO;IACT,CAAC;IACD,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC,IAAI,CAAC;QACR,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;QACpB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,EAAE;QACR,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;KACnC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,aAAa,GACjB,gGAAgG,CAAC;AAEnG,SAAS,QAAQ,CAAC,KAAe,EAAE,SAAiB,EAAE,IAAe;IACnE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,sBAAc,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACjE,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC3B,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzB,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,IAAI,KAAK,EAAE,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/C,gFAAgF;YAChF,IAAI,GAAG,GAAG,EAAE,CAAC;YACb,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC1C,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,sBAAc,CAAC,CAAC;gBAC9C,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE;oBAAE,SAAS;gBAChC,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC;gBAChD,IAAI,GAAG,IAAI,MAAM;oBAAE,MAAM;gBACzB,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBAC7C,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;oBAAE,SAAS;gBACnC,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACxB,GAAG,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,CAAC;oBACxC,SAAS;gBACX,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBAChC,GAAG,GAAG,EAAE,CAAC;YACX,CAAC;YACD,IAAI,GAAG,CAAC,IAAI,EAAE;gBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;aAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;AACH,CAAC;AAED,gHAAgH;AAChH,SAAgB,eAAe,CAAC,IAAc,EAAE,KAAe,EAAE,SAAiB;IAChF,MAAM,IAAI,GAAc,EAAE,CAAC;IAC3B,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,OAAO,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACnC,4FAA4F;IAC5F,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAU,EAAE,EAAE;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,sBAAc,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,QAAQ;gBACX,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;oBAAE,UAAU,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;gBACzD,MAAM;YACR,KAAK,IAAI;gBACP,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;oBAAE,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;gBAClF,MAAM;YACR,KAAK,YAAY;gBACf,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;oBAC7D,cAAc,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;gBAC1C,MAAM;YACR,KAAK,YAAY;gBACf,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;oBAAE,cAAc,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;gBAC7D,MAAM;YACR,KAAK,MAAM,CAAC;YACZ,KAAK,MAAM;gBACT,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;oBAAE,YAAY,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;gBAC3D,MAAM;YACR,KAAK,KAAK;gBACR,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;oBAAE,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;gBACvD,MAAM;QACV,CAAC;IACH,CAAC,CAAC;IACF,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACzB,MAAM,EAAE,GAAG,SAAS,GAAG,GAAG,CAAC;QAC3B,MAAM,SAAS,GAAG,IAAI,KAAK,YAAY,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9D,IAAI,CAAC,GAAG;YAAE,OAAO,GAAG,EAAE,CAAC;QACvB,IAAI,SAAS,EAAE,CAAC;YACd,GAAG,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,CAAC;YACvC,OAAO;QACT,CAAC;QACD,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,OAAO,CAAC,CAAC;QAC1B,GAAG,GAAG,EAAE,CAAC;IACX,CAAC,CAAC,CAAC;IACH,IAAI,GAAG,CAAC,IAAI,EAAE;QAAE,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACpC,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/dry-run.d.ts
CHANGED
|
@@ -28,6 +28,8 @@ export interface DryRunCommand {
|
|
|
28
28
|
recognized: boolean;
|
|
29
29
|
/** 1-based line within the dossier body. */
|
|
30
30
|
line: number;
|
|
31
|
+
/** Why this command was escalated beyond its plain classification (e.g. remote code execution). */
|
|
32
|
+
reason?: string;
|
|
31
33
|
}
|
|
32
34
|
export interface DryRunFile {
|
|
33
35
|
path: string;
|
|
@@ -76,6 +78,18 @@ export interface DryRunPlan {
|
|
|
76
78
|
risk_score: number;
|
|
77
79
|
level: DryRunLevel;
|
|
78
80
|
score_breakdown: DryRunScoreComponent[];
|
|
81
|
+
/** Declared risk_level vs what the code blocks actually do; `mismatch` when observed outranks declared. */
|
|
82
|
+
declared_vs_observed: {
|
|
83
|
+
declared_level: string | null;
|
|
84
|
+
observed_level: DryRunLevel;
|
|
85
|
+
mismatch: boolean;
|
|
86
|
+
note: string;
|
|
87
|
+
};
|
|
88
|
+
/** Code fences in a language the analyzer has no extractor for (their content is NOT reflected in the score). */
|
|
89
|
+
unanalyzed_fences: Array<{
|
|
90
|
+
lang: string;
|
|
91
|
+
line: number;
|
|
92
|
+
}>;
|
|
79
93
|
}
|
|
80
94
|
/** Base points for the dossier's declared risk_level. */
|
|
81
95
|
export declare const SCORE_BASE: Record<string, number>;
|
package/dist/dry-run.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dry-run.d.ts","sourceRoot":"","sources":["../src/dry-run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"dry-run.d.ts","sourceRoot":"","sources":["../src/dry-run.ts"],"names":[],"mappings":"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"}
|