@q32/signal-scanner 0.1.1 → 0.2.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/COPYING +674 -0
- package/COPYING.LESSER +165 -0
- package/README.md +57 -9
- package/dist/cli.d.ts +26 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +592 -0
- package/dist/cli.js.map +1 -0
- package/dist/render-isolate/entry.d.ts +2 -0
- package/dist/render-isolate/entry.d.ts.map +1 -0
- package/dist/render-isolate/entry.js +3 -0
- package/dist/render-isolate/entry.js.map +1 -0
- package/dist/render-isolate/polyfills.d.ts +2 -0
- package/dist/render-isolate/polyfills.d.ts.map +1 -0
- package/dist/render-isolate/polyfills.js +41 -0
- package/dist/render-isolate/polyfills.js.map +1 -0
- package/dist/render-isolate/run.d.ts +3 -0
- package/dist/render-isolate/run.d.ts.map +1 -0
- package/dist/render-isolate/run.js +88 -0
- package/dist/render-isolate/run.js.map +1 -0
- package/package.json +19 -8
- package/scripts/check-coverage.ts +0 -33
- package/scripts/eval.ts +0 -311
- package/scripts/render-isolate/entry.ts +0 -2
- package/scripts/render-isolate/polyfills.ts +0 -33
- package/scripts/render-isolate/run.ts +0 -63
- package/scripts/scan.ts +0 -612
package/dist/cli.js
ADDED
|
@@ -0,0 +1,592 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import { createReadStream } from "node:fs";
|
|
4
|
+
import { readdir, stat } from "node:fs/promises";
|
|
5
|
+
import { join, resolve } from "node:path";
|
|
6
|
+
import { fileURLToPath } from "node:url";
|
|
7
|
+
import { createScanner, dispositionForScore, normalizeUrl, scoreFindings } from "./index.js";
|
|
8
|
+
import { behaviorFindings, discoveredUrlsFromBehavior } from "./dynamic.js";
|
|
9
|
+
import { renderAndScan } from "./render.js";
|
|
10
|
+
import { renderInIsolate } from "./render-isolate/run.js";
|
|
11
|
+
// Render the page in a real DOM (linkedom), running inline AND external scripts,
|
|
12
|
+
// then fold the rendered-DOM findings + recorded behaviors (exfil/redirect/eval
|
|
13
|
+
// + surfaced URLs) back into the page report. Catches externally-injected forms
|
|
14
|
+
// that inline-only analysis can't see.
|
|
15
|
+
// Returns forced-navigation targets (location.href/assign/replace) the page
|
|
16
|
+
// performs at render time — the crawler follows these even cross-origin.
|
|
17
|
+
async function applyDynamicAnalysis(report, chunks, url, options) {
|
|
18
|
+
if (report.contentKind !== "html")
|
|
19
|
+
return [];
|
|
20
|
+
const total = chunks.reduce((n, c) => n + c.byteLength, 0);
|
|
21
|
+
const merged = new Uint8Array(total);
|
|
22
|
+
let offset = 0;
|
|
23
|
+
for (const chunk of chunks) {
|
|
24
|
+
merged.set(chunk, offset);
|
|
25
|
+
offset += chunk.byteLength;
|
|
26
|
+
}
|
|
27
|
+
const html = new TextDecoder("utf-8", { fatal: false }).decode(merged);
|
|
28
|
+
const fetchScript = async (src) => {
|
|
29
|
+
const controller = new AbortController();
|
|
30
|
+
const timer = setTimeout(() => controller.abort(), options.timeoutMs);
|
|
31
|
+
try {
|
|
32
|
+
const response = await fetch(src, { headers: { "user-agent": options.userAgent }, redirect: "follow", signal: controller.signal });
|
|
33
|
+
return response.ok ? await response.text() : null;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
finally {
|
|
39
|
+
clearTimeout(timer);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
let rendered;
|
|
43
|
+
let behavior;
|
|
44
|
+
try {
|
|
45
|
+
const result = await renderAndScan(html, { url, fetchScript, invoke: renderInIsolate });
|
|
46
|
+
rendered = result.html;
|
|
47
|
+
behavior = result.report;
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return []; // rendering failure never breaks the scan
|
|
51
|
+
}
|
|
52
|
+
// Re-scan the post-render DOM with the static rules.
|
|
53
|
+
const renderedScanner = createScanner({ source: { url, finalUrl: url, contentType: "text/html" } });
|
|
54
|
+
renderedScanner.feed(new TextEncoder().encode(rendered));
|
|
55
|
+
const renderedReport = renderedScanner.finish();
|
|
56
|
+
// Feed rendered-DOM links + behavior-surfaced URLs into the crawl frontier.
|
|
57
|
+
const knownUrls = new Set(report.urls.map((u) => u.normalized));
|
|
58
|
+
const addUrl = (raw) => {
|
|
59
|
+
const normalized = normalizeUrl(raw, url);
|
|
60
|
+
if (normalized && !knownUrls.has(normalized.normalized)) {
|
|
61
|
+
report.urls.push(normalized);
|
|
62
|
+
knownUrls.add(normalized.normalized);
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
for (const extracted of renderedReport.urls)
|
|
66
|
+
addUrl(extracted.normalized);
|
|
67
|
+
for (const raw of discoveredUrlsFromBehavior(behavior, url))
|
|
68
|
+
addUrl(raw);
|
|
69
|
+
// Merge findings: original static + rendered-DOM + recorded behaviors, deduped.
|
|
70
|
+
const seen = new Set(report.findings.map((f) => `${f.ruleId}:${f.locationValue}`));
|
|
71
|
+
for (const finding of [...renderedReport.findings, ...behaviorFindings(behavior, url)]) {
|
|
72
|
+
const key = `${finding.ruleId}:${finding.locationValue}`;
|
|
73
|
+
if (!seen.has(key)) {
|
|
74
|
+
report.findings.push(finding);
|
|
75
|
+
seen.add(key);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
report.score = scoreFindings(report.findings);
|
|
79
|
+
report.disposition = dispositionForScore(report.score);
|
|
80
|
+
// Forced navigations: the page sent the visitor here (location.href/assign/
|
|
81
|
+
// replace). Return them so the crawler can follow cross-origin.
|
|
82
|
+
const navs = new Set();
|
|
83
|
+
for (const raw of behavior.redirects) {
|
|
84
|
+
const normalized = normalizeUrl(raw, url);
|
|
85
|
+
if (normalized)
|
|
86
|
+
navs.add(normalized.normalized);
|
|
87
|
+
}
|
|
88
|
+
return [...navs];
|
|
89
|
+
}
|
|
90
|
+
const MAX_FETCH_BYTES = 512 * 1024;
|
|
91
|
+
const MAX_CRAWL_URLS = 128;
|
|
92
|
+
const MAX_CRAWL_DEPTH = 2;
|
|
93
|
+
const MAX_FILE_BYTES = 512 * 1024;
|
|
94
|
+
const MAX_TOTAL_BYTES = 32 * 1024 * 1024;
|
|
95
|
+
const MAX_SITEMAP_URLS = 512;
|
|
96
|
+
const REQUEST_TIMEOUT_MS = 10_000;
|
|
97
|
+
const DEFAULT_PARALLEL = 10;
|
|
98
|
+
// A real browser UA so cloaking kits (which serve benign pages to obvious
|
|
99
|
+
// scanners) reveal their actual content.
|
|
100
|
+
const USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36";
|
|
101
|
+
// Reusable defaults so other scripts (e.g. the eval harness) can build
|
|
102
|
+
// CrawlOptions without re-deriving them.
|
|
103
|
+
export const DEFAULT_CRAWL_OPTIONS = {
|
|
104
|
+
parallel: DEFAULT_PARALLEL,
|
|
105
|
+
maxUrls: MAX_CRAWL_URLS,
|
|
106
|
+
maxDepth: MAX_CRAWL_DEPTH,
|
|
107
|
+
maxBytes: MAX_FETCH_BYTES,
|
|
108
|
+
maxTotalBytes: MAX_TOTAL_BYTES,
|
|
109
|
+
maxSitemapUrls: MAX_SITEMAP_URLS,
|
|
110
|
+
timeoutMs: REQUEST_TIMEOUT_MS,
|
|
111
|
+
robots: true,
|
|
112
|
+
userAgent: USER_AGENT
|
|
113
|
+
};
|
|
114
|
+
async function main() {
|
|
115
|
+
const args = parseArgs(process.argv.slice(2));
|
|
116
|
+
if (!args) {
|
|
117
|
+
console.error([
|
|
118
|
+
"usage: signal-scanner crawl [options] <url...>",
|
|
119
|
+
" signal-scanner files [options] <path...>",
|
|
120
|
+
"",
|
|
121
|
+
"crawl options:",
|
|
122
|
+
" --no-robots do not fetch or obey robots.txt",
|
|
123
|
+
" --parallel, -n <count> concurrent fetches, default 10",
|
|
124
|
+
" --max-urls <count> max globally deduped crawl URLs, default 128",
|
|
125
|
+
" --max-depth <count> max link-follow depth, default 2",
|
|
126
|
+
" --max-bytes <bytes> max bytes per response, default 524288",
|
|
127
|
+
" --max-total-bytes <bytes> max bytes across crawl, default 33554432",
|
|
128
|
+
" --max-sitemap-urls <count> max URLs accepted from sitemaps, default 512",
|
|
129
|
+
" --timeout-ms <ms> request timeout, default 10000",
|
|
130
|
+
" --user-agent <value> custom user-agent",
|
|
131
|
+
"",
|
|
132
|
+
"file options:",
|
|
133
|
+
" --max-file-bytes <bytes> max bytes per file, default 524288"
|
|
134
|
+
].join("\n"));
|
|
135
|
+
process.exit(2);
|
|
136
|
+
}
|
|
137
|
+
const reports = args.mode === "crawl"
|
|
138
|
+
? await crawlTargets(args.targets, args.crawl)
|
|
139
|
+
: await scanFileTargets(args.targets, args.files);
|
|
140
|
+
printSummary(reports);
|
|
141
|
+
}
|
|
142
|
+
export async function crawlTargets(startUrls, options) {
|
|
143
|
+
const reports = [];
|
|
144
|
+
const queue = [];
|
|
145
|
+
const queued = new Set();
|
|
146
|
+
const seen = new Set();
|
|
147
|
+
const seenFinal = new Set();
|
|
148
|
+
const allowedDomains = new Set(startUrls.map((url) => normalizeUrl(url)?.registrableDomain).filter((domain) => !!domain));
|
|
149
|
+
const allowedHosts = new Set(startUrls.map((url) => hostFor(url)).filter((host) => !!host));
|
|
150
|
+
const robotsByDomain = new Map();
|
|
151
|
+
let totalBytes = 0;
|
|
152
|
+
const enqueue = (url, depth, source) => {
|
|
153
|
+
const normalized = normalizeUrl(url);
|
|
154
|
+
if (!normalized)
|
|
155
|
+
return;
|
|
156
|
+
// A forced navigation (redirect) is the page sending the visitor onward —
|
|
157
|
+
// follow it even cross-origin. Content links stay within the start scope.
|
|
158
|
+
if (source !== "redirect" && !isAllowed(normalized.normalized, allowedDomains, allowedHosts))
|
|
159
|
+
return;
|
|
160
|
+
if (queued.has(normalized.normalized) || seen.has(normalized.normalized))
|
|
161
|
+
return;
|
|
162
|
+
if (queued.size + seen.size >= options.maxUrls)
|
|
163
|
+
return;
|
|
164
|
+
queue.push({ url: normalized.normalized, depth, source });
|
|
165
|
+
queued.add(normalized.normalized);
|
|
166
|
+
};
|
|
167
|
+
for (const start of startUrls)
|
|
168
|
+
enqueue(start, 0, "start");
|
|
169
|
+
for (const start of startUrls) {
|
|
170
|
+
const normalized = normalizeUrl(start);
|
|
171
|
+
if (!normalized || !isAllowed(normalized.normalized, allowedDomains, allowedHosts))
|
|
172
|
+
continue;
|
|
173
|
+
const origin = new URL(normalized.normalized).origin;
|
|
174
|
+
const robots = options.robots ? await fetchRobots(origin, options) : { sitemaps: [], disallows: [] };
|
|
175
|
+
robotsByDomain.set(boundKey(normalized.normalized), robots);
|
|
176
|
+
for (const sitemapUrl of await discoverSitemapEntries(origin, robots.sitemaps, allowedDomains, allowedHosts, options))
|
|
177
|
+
enqueue(sitemapUrl, 0, "sitemap");
|
|
178
|
+
}
|
|
179
|
+
async function worker() {
|
|
180
|
+
while (queue.length && seen.size < options.maxUrls && totalBytes < options.maxTotalBytes) {
|
|
181
|
+
const item = queue.shift();
|
|
182
|
+
queued.delete(item.url);
|
|
183
|
+
if (seen.has(item.url))
|
|
184
|
+
continue;
|
|
185
|
+
seen.add(item.url);
|
|
186
|
+
const normalized = normalizeUrl(item.url);
|
|
187
|
+
// "redirect" items are forced navigations — scanned even when off the start
|
|
188
|
+
// scope (and exempt from robots, like the start URL).
|
|
189
|
+
if (!normalized || (item.source !== "redirect" && !isAllowed(normalized.normalized, allowedDomains, allowedHosts)))
|
|
190
|
+
continue;
|
|
191
|
+
if (options.robots && item.source !== "start" && item.source !== "redirect" && isDisallowed(item.url, robotsByDomain.get(boundKey(normalized.normalized))))
|
|
192
|
+
continue;
|
|
193
|
+
const targetReport = await scanUrl(item.url, options);
|
|
194
|
+
totalBytes += targetReport.bytes;
|
|
195
|
+
const finalNormalized = normalizeUrl(targetReport.target)?.normalized;
|
|
196
|
+
if (finalNormalized && seenFinal.has(finalNormalized))
|
|
197
|
+
continue;
|
|
198
|
+
if (finalNormalized)
|
|
199
|
+
seenFinal.add(finalNormalized);
|
|
200
|
+
reports.push(targetReport);
|
|
201
|
+
if (targetReport.error || item.depth >= options.maxDepth)
|
|
202
|
+
continue;
|
|
203
|
+
// Forced navigations first — follow them even cross-origin (cloaking
|
|
204
|
+
// bouncers hop to the host that actually serves the credential kit).
|
|
205
|
+
for (const nav of targetReport.forcedNavUrls ?? []) {
|
|
206
|
+
if (seen.size + queued.size >= options.maxUrls)
|
|
207
|
+
break;
|
|
208
|
+
enqueue(nav, item.depth + 1, "redirect");
|
|
209
|
+
}
|
|
210
|
+
for (const extracted of targetReport.report.urls) {
|
|
211
|
+
if (seen.size + queued.size >= options.maxUrls)
|
|
212
|
+
break;
|
|
213
|
+
enqueue(extracted.normalized, item.depth + 1, "page");
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
await Promise.all(Array.from({ length: Math.max(1, options.parallel) }, () => worker()));
|
|
218
|
+
return reports;
|
|
219
|
+
}
|
|
220
|
+
async function scanUrl(url, options) {
|
|
221
|
+
const controller = new AbortController();
|
|
222
|
+
const timeout = setTimeout(() => controller.abort(), options.timeoutMs);
|
|
223
|
+
const scanner = createScanner({ source: { url } });
|
|
224
|
+
let bytes = 0;
|
|
225
|
+
try {
|
|
226
|
+
const response = await fetch(url, {
|
|
227
|
+
redirect: "follow",
|
|
228
|
+
headers: { "user-agent": options.userAgent },
|
|
229
|
+
signal: controller.signal
|
|
230
|
+
});
|
|
231
|
+
const responseScanner = createScanner({
|
|
232
|
+
source: {
|
|
233
|
+
url,
|
|
234
|
+
finalUrl: response.url || url,
|
|
235
|
+
contentType: response.headers.get("content-type")
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
const reader = response.body?.getReader();
|
|
239
|
+
const collected = [];
|
|
240
|
+
if (reader) {
|
|
241
|
+
while (bytes < options.maxBytes) {
|
|
242
|
+
const next = await reader.read();
|
|
243
|
+
if (next.done)
|
|
244
|
+
break;
|
|
245
|
+
const chunk = next.value.slice(0, Math.max(0, options.maxBytes - bytes));
|
|
246
|
+
bytes += chunk.byteLength;
|
|
247
|
+
responseScanner.feed(chunk);
|
|
248
|
+
collected.push(chunk);
|
|
249
|
+
if (chunk.byteLength < next.value.byteLength)
|
|
250
|
+
break;
|
|
251
|
+
}
|
|
252
|
+
await reader.cancel().catch(() => undefined);
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
const body = new Uint8Array(await response.arrayBuffer());
|
|
256
|
+
const chunk = body.slice(0, options.maxBytes);
|
|
257
|
+
bytes = chunk.byteLength;
|
|
258
|
+
responseScanner.feed(chunk);
|
|
259
|
+
collected.push(chunk);
|
|
260
|
+
}
|
|
261
|
+
const finalUrl = response.url || url;
|
|
262
|
+
const report = responseScanner.finish();
|
|
263
|
+
const forcedNavUrls = await applyDynamicAnalysis(report, collected, finalUrl, options);
|
|
264
|
+
return { target: finalUrl, kind: "url", status: response.status, bytes, report, forcedNavUrls };
|
|
265
|
+
}
|
|
266
|
+
catch (error) {
|
|
267
|
+
return {
|
|
268
|
+
target: url,
|
|
269
|
+
kind: "url",
|
|
270
|
+
bytes,
|
|
271
|
+
report: scanner.finish(),
|
|
272
|
+
error: error instanceof Error ? `${error.name}: ${error.message}` : String(error)
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
finally {
|
|
276
|
+
clearTimeout(timeout);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
async function scanFileTargets(paths, options) {
|
|
280
|
+
const files = [];
|
|
281
|
+
for (const path of paths)
|
|
282
|
+
await collectFiles(resolve(path), files);
|
|
283
|
+
const reports = [];
|
|
284
|
+
for (const file of files)
|
|
285
|
+
reports.push(await scanFile(file, options));
|
|
286
|
+
return reports;
|
|
287
|
+
}
|
|
288
|
+
async function collectFiles(path, output) {
|
|
289
|
+
const info = await stat(path);
|
|
290
|
+
if (info.isDirectory()) {
|
|
291
|
+
for (const entry of await readdir(path)) {
|
|
292
|
+
if (/^(?:node_modules|\.git|dist|coverage)$/.test(entry))
|
|
293
|
+
continue;
|
|
294
|
+
await collectFiles(join(path, entry), output);
|
|
295
|
+
}
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
if (!/\.(?:ts|tsx|js|mjs|cjs|json|html|css|svg|md|txt|yml|yaml)$/.test(path))
|
|
299
|
+
return;
|
|
300
|
+
output.push(path);
|
|
301
|
+
}
|
|
302
|
+
async function scanFile(path, options) {
|
|
303
|
+
const scanner = createScanner({ source: { filename: path } });
|
|
304
|
+
let bytes = 0;
|
|
305
|
+
await new Promise((resolvePromise, reject) => {
|
|
306
|
+
const stream = createReadStream(path, { highWaterMark: 64 * 1024 });
|
|
307
|
+
stream.on("data", (chunk) => {
|
|
308
|
+
if (bytes >= options.maxFileBytes)
|
|
309
|
+
return;
|
|
310
|
+
const view = chunk.subarray(0, Math.max(0, options.maxFileBytes - bytes));
|
|
311
|
+
bytes += view.byteLength;
|
|
312
|
+
scanner.feed(view);
|
|
313
|
+
if (view.byteLength < chunk.byteLength)
|
|
314
|
+
stream.destroy();
|
|
315
|
+
});
|
|
316
|
+
stream.on("error", reject);
|
|
317
|
+
stream.on("close", resolvePromise);
|
|
318
|
+
stream.on("end", resolvePromise);
|
|
319
|
+
});
|
|
320
|
+
return { target: path, kind: "file", bytes, report: scanner.finish() };
|
|
321
|
+
}
|
|
322
|
+
function printSummary(reports) {
|
|
323
|
+
const aggregate = scoreAggregate(reports);
|
|
324
|
+
console.log(JSON.stringify({
|
|
325
|
+
aggregate,
|
|
326
|
+
scanned: reports.length,
|
|
327
|
+
summary: summarizeReports(reports),
|
|
328
|
+
targets: reports.map((item) => ({
|
|
329
|
+
target: item.target,
|
|
330
|
+
kind: item.kind,
|
|
331
|
+
status: item.status,
|
|
332
|
+
bytes: item.bytes,
|
|
333
|
+
error: item.error,
|
|
334
|
+
contentKind: item.report.contentKind,
|
|
335
|
+
score: item.report.score,
|
|
336
|
+
disposition: item.report.disposition,
|
|
337
|
+
findings: summarizeFindings(item.report.findings)
|
|
338
|
+
}))
|
|
339
|
+
}, null, 2));
|
|
340
|
+
}
|
|
341
|
+
function summarizeReports(reports) {
|
|
342
|
+
const dispositions = {};
|
|
343
|
+
const contentKinds = {};
|
|
344
|
+
const errors = {};
|
|
345
|
+
const rules = {};
|
|
346
|
+
for (const report of reports) {
|
|
347
|
+
dispositions[report.report.disposition] = (dispositions[report.report.disposition] ?? 0) + 1;
|
|
348
|
+
contentKinds[report.report.contentKind] = (contentKinds[report.report.contentKind] ?? 0) + 1;
|
|
349
|
+
if (report.error)
|
|
350
|
+
errors[report.error.split(":")[0]] = (errors[report.error.split(":")[0]] ?? 0) + 1;
|
|
351
|
+
for (const finding of report.report.findings)
|
|
352
|
+
rules[finding.ruleId] = (rules[finding.ruleId] ?? 0) + 1;
|
|
353
|
+
}
|
|
354
|
+
return { dispositions, contentKinds, errors, rules };
|
|
355
|
+
}
|
|
356
|
+
function summarizeFindings(findings) {
|
|
357
|
+
const groups = new Map();
|
|
358
|
+
for (const finding of findings) {
|
|
359
|
+
const key = `${finding.ruleId}:${finding.severity}:${finding.confidence}`;
|
|
360
|
+
const group = groups.get(key);
|
|
361
|
+
if (group)
|
|
362
|
+
group.count += 1;
|
|
363
|
+
else
|
|
364
|
+
groups.set(key, { finding, count: 1 });
|
|
365
|
+
}
|
|
366
|
+
return [...groups.values()]
|
|
367
|
+
.sort((left, right) => right.finding.score - left.finding.score || right.count - left.count)
|
|
368
|
+
.slice(0, 12)
|
|
369
|
+
.map(({ finding, count }) => ({
|
|
370
|
+
ruleId: finding.ruleId,
|
|
371
|
+
severity: finding.severity,
|
|
372
|
+
confidence: finding.confidence,
|
|
373
|
+
count,
|
|
374
|
+
sample: finding.locationValue.slice(0, 160)
|
|
375
|
+
}));
|
|
376
|
+
}
|
|
377
|
+
function scoreAggregate(reports) {
|
|
378
|
+
const findings = reports.flatMap((item) => item.report.findings);
|
|
379
|
+
const baseScore = Math.max(...reports.map((item) => item.report.score), 0);
|
|
380
|
+
const bonusScore = Math.min(100, baseScore + (baseScore >= 50 && new Set(findings.map((finding) => finding.ruleId)).size >= 4 ? 8 : 0));
|
|
381
|
+
const score = baseScore >= 75 ? bonusScore : Math.min(74, bonusScore);
|
|
382
|
+
const disposition = score >= 75 ? "block" : score >= 50 ? "review" : score >= 25 ? "warn" : "allow";
|
|
383
|
+
const sha256 = createHash("sha256").update(JSON.stringify(reports.map((item) => [item.target, item.report.score, item.report.findings.map((finding) => finding.ruleId)]))).digest("hex");
|
|
384
|
+
return { score, disposition, sha256 };
|
|
385
|
+
}
|
|
386
|
+
async function fetchRobots(origin, options) {
|
|
387
|
+
const text = await fetchTextBounded(`${origin}/robots.txt`, options, 128 * 1024).catch(() => "");
|
|
388
|
+
return parseRobots(text);
|
|
389
|
+
}
|
|
390
|
+
function parseRobots(text) {
|
|
391
|
+
const sitemaps = [];
|
|
392
|
+
const disallows = [];
|
|
393
|
+
let active = false;
|
|
394
|
+
for (const rawLine of text.split(/\r?\n/)) {
|
|
395
|
+
const line = rawLine.replace(/#.*/, "").trim();
|
|
396
|
+
const [rawKey, ...rest] = line.split(":");
|
|
397
|
+
if (!rawKey || rest.length === 0)
|
|
398
|
+
continue;
|
|
399
|
+
const key = rawKey.trim().toLowerCase();
|
|
400
|
+
const value = rest.join(":").trim();
|
|
401
|
+
if (key === "sitemap" && value)
|
|
402
|
+
sitemaps.push(value);
|
|
403
|
+
if (key === "user-agent")
|
|
404
|
+
active = value === "*" || value.toLowerCase() === USER_AGENT.toLowerCase();
|
|
405
|
+
if (active && key === "disallow" && value)
|
|
406
|
+
disallows.push(value);
|
|
407
|
+
}
|
|
408
|
+
return { sitemaps, disallows };
|
|
409
|
+
}
|
|
410
|
+
async function discoverSitemapEntries(origin, robotsSitemaps, allowedDomains, allowedHosts, options) {
|
|
411
|
+
const sitemapUrls = new Set([
|
|
412
|
+
...robotsSitemaps,
|
|
413
|
+
`${origin}/sitemap.xml`,
|
|
414
|
+
`${origin}/sitemap_index.xml`,
|
|
415
|
+
`${origin}/sitemap-index.xml`
|
|
416
|
+
]);
|
|
417
|
+
const discovered = new Set();
|
|
418
|
+
const pending = [...sitemapUrls];
|
|
419
|
+
const seenSitemaps = new Set();
|
|
420
|
+
while (pending.length && discovered.size < options.maxSitemapUrls) {
|
|
421
|
+
const sitemap = pending.shift();
|
|
422
|
+
const normalizedSitemap = normalizeUrl(sitemap);
|
|
423
|
+
if (!normalizedSitemap || seenSitemaps.has(normalizedSitemap.normalized))
|
|
424
|
+
continue;
|
|
425
|
+
if (!isAllowed(normalizedSitemap.normalized, allowedDomains, allowedHosts))
|
|
426
|
+
continue;
|
|
427
|
+
seenSitemaps.add(normalizedSitemap.normalized);
|
|
428
|
+
const text = await fetchTextBounded(normalizedSitemap.normalized, options, options.maxBytes).catch(() => "");
|
|
429
|
+
for (const loc of extractSitemapLocs(text)) {
|
|
430
|
+
const normalized = normalizeUrl(loc, normalizedSitemap.normalized);
|
|
431
|
+
if (!normalized || !isAllowed(normalized.normalized, allowedDomains, allowedHosts))
|
|
432
|
+
continue;
|
|
433
|
+
if (/sitemap/i.test(new URL(normalized.normalized).pathname) && seenSitemaps.size < 32)
|
|
434
|
+
pending.push(normalized.normalized);
|
|
435
|
+
else
|
|
436
|
+
discovered.add(normalized.normalized);
|
|
437
|
+
if (discovered.size >= options.maxSitemapUrls)
|
|
438
|
+
break;
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
return [...discovered];
|
|
442
|
+
}
|
|
443
|
+
async function fetchTextBounded(url, options, maxBytes) {
|
|
444
|
+
const controller = new AbortController();
|
|
445
|
+
const timeout = setTimeout(() => controller.abort(), options.timeoutMs);
|
|
446
|
+
try {
|
|
447
|
+
const response = await fetch(url, {
|
|
448
|
+
redirect: "follow",
|
|
449
|
+
headers: { "user-agent": options.userAgent },
|
|
450
|
+
signal: controller.signal
|
|
451
|
+
});
|
|
452
|
+
const reader = response.body?.getReader();
|
|
453
|
+
const chunks = [];
|
|
454
|
+
let bytes = 0;
|
|
455
|
+
if (!reader)
|
|
456
|
+
return "";
|
|
457
|
+
while (bytes < maxBytes) {
|
|
458
|
+
const next = await reader.read();
|
|
459
|
+
if (next.done)
|
|
460
|
+
break;
|
|
461
|
+
const chunk = next.value.slice(0, Math.max(0, maxBytes - bytes));
|
|
462
|
+
bytes += chunk.byteLength;
|
|
463
|
+
chunks.push(chunk);
|
|
464
|
+
if (chunk.byteLength < next.value.byteLength)
|
|
465
|
+
break;
|
|
466
|
+
}
|
|
467
|
+
await reader.cancel().catch(() => undefined);
|
|
468
|
+
const merged = new Uint8Array(bytes);
|
|
469
|
+
let offset = 0;
|
|
470
|
+
for (const chunk of chunks) {
|
|
471
|
+
merged.set(chunk, offset);
|
|
472
|
+
offset += chunk.byteLength;
|
|
473
|
+
}
|
|
474
|
+
return new TextDecoder().decode(merged);
|
|
475
|
+
}
|
|
476
|
+
finally {
|
|
477
|
+
clearTimeout(timeout);
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
function extractSitemapLocs(text) {
|
|
481
|
+
const locs = [];
|
|
482
|
+
for (const match of text.matchAll(/<loc>\s*([^<]+?)\s*<\/loc>/gi))
|
|
483
|
+
locs.push(decodeXml(match[1].trim()));
|
|
484
|
+
return locs;
|
|
485
|
+
}
|
|
486
|
+
function isDisallowed(url, policy) {
|
|
487
|
+
if (!policy?.disallows.length)
|
|
488
|
+
return false;
|
|
489
|
+
const path = new URL(url).pathname;
|
|
490
|
+
return policy.disallows.some((rule) => rule === "/" || path.startsWith(rule));
|
|
491
|
+
}
|
|
492
|
+
function decodeXml(value) {
|
|
493
|
+
return value
|
|
494
|
+
.replace(/&/g, "&")
|
|
495
|
+
.replace(/</g, "<")
|
|
496
|
+
.replace(/>/g, ">")
|
|
497
|
+
.replace(/"/g, "\"")
|
|
498
|
+
.replace(/'/g, "'");
|
|
499
|
+
}
|
|
500
|
+
function isAllowed(url, allowedDomains, allowedHosts) {
|
|
501
|
+
const normalized = normalizeUrl(url);
|
|
502
|
+
if (!normalized)
|
|
503
|
+
return false;
|
|
504
|
+
const host = hostFor(normalized.normalized);
|
|
505
|
+
return (!!normalized.registrableDomain && allowedDomains.has(normalized.registrableDomain)) || (!!host && allowedHosts.has(host));
|
|
506
|
+
}
|
|
507
|
+
function hostFor(url) {
|
|
508
|
+
try {
|
|
509
|
+
return new URL(url).hostname.toLowerCase();
|
|
510
|
+
}
|
|
511
|
+
catch {
|
|
512
|
+
return null;
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
function boundKey(url) {
|
|
516
|
+
return normalizeUrl(url)?.registrableDomain ?? hostFor(url) ?? url;
|
|
517
|
+
}
|
|
518
|
+
function parseArgs(argv) {
|
|
519
|
+
if (argv.includes("--help") || argv.includes("-h"))
|
|
520
|
+
return null;
|
|
521
|
+
const mode = argv.shift();
|
|
522
|
+
if (mode !== "crawl" && mode !== "files")
|
|
523
|
+
return null;
|
|
524
|
+
const crawl = {
|
|
525
|
+
parallel: DEFAULT_PARALLEL,
|
|
526
|
+
maxUrls: MAX_CRAWL_URLS,
|
|
527
|
+
maxDepth: MAX_CRAWL_DEPTH,
|
|
528
|
+
maxBytes: MAX_FETCH_BYTES,
|
|
529
|
+
maxTotalBytes: MAX_TOTAL_BYTES,
|
|
530
|
+
maxSitemapUrls: MAX_SITEMAP_URLS,
|
|
531
|
+
timeoutMs: REQUEST_TIMEOUT_MS,
|
|
532
|
+
robots: true,
|
|
533
|
+
userAgent: USER_AGENT
|
|
534
|
+
};
|
|
535
|
+
const files = { maxFileBytes: MAX_FILE_BYTES };
|
|
536
|
+
const targets = [];
|
|
537
|
+
for (let index = 0; index < argv.length; index += 1) {
|
|
538
|
+
const arg = argv[index];
|
|
539
|
+
const next = () => {
|
|
540
|
+
const value = argv[index + 1];
|
|
541
|
+
if (!value)
|
|
542
|
+
throw new Error(`Missing value for ${arg}`);
|
|
543
|
+
index += 1;
|
|
544
|
+
return value;
|
|
545
|
+
};
|
|
546
|
+
if (arg === "--no-robots")
|
|
547
|
+
crawl.robots = false;
|
|
548
|
+
else if (arg === "--parallel" || arg === "-n")
|
|
549
|
+
crawl.parallel = positiveInt(next(), arg);
|
|
550
|
+
else if (arg === "--max-urls")
|
|
551
|
+
crawl.maxUrls = positiveInt(next(), arg);
|
|
552
|
+
else if (arg === "--max-depth")
|
|
553
|
+
crawl.maxDepth = nonNegativeInt(next(), arg);
|
|
554
|
+
else if (arg === "--max-bytes")
|
|
555
|
+
crawl.maxBytes = positiveInt(next(), arg);
|
|
556
|
+
else if (arg === "--max-total-bytes")
|
|
557
|
+
crawl.maxTotalBytes = positiveInt(next(), arg);
|
|
558
|
+
else if (arg === "--max-sitemap-urls")
|
|
559
|
+
crawl.maxSitemapUrls = nonNegativeInt(next(), arg);
|
|
560
|
+
else if (arg === "--timeout-ms")
|
|
561
|
+
crawl.timeoutMs = positiveInt(next(), arg);
|
|
562
|
+
else if (arg === "--user-agent")
|
|
563
|
+
crawl.userAgent = next();
|
|
564
|
+
else if (arg === "--max-file-bytes")
|
|
565
|
+
files.maxFileBytes = positiveInt(next(), arg);
|
|
566
|
+
else
|
|
567
|
+
targets.push(arg);
|
|
568
|
+
}
|
|
569
|
+
if (targets.length === 0)
|
|
570
|
+
return null;
|
|
571
|
+
return { mode, targets, crawl, files };
|
|
572
|
+
}
|
|
573
|
+
function positiveInt(value, name) {
|
|
574
|
+
const parsed = Number.parseInt(value, 10);
|
|
575
|
+
if (!Number.isFinite(parsed) || parsed <= 0)
|
|
576
|
+
throw new Error(`${name} must be a positive integer`);
|
|
577
|
+
return parsed;
|
|
578
|
+
}
|
|
579
|
+
function nonNegativeInt(value, name) {
|
|
580
|
+
const parsed = Number.parseInt(value, 10);
|
|
581
|
+
if (!Number.isFinite(parsed) || parsed < 0)
|
|
582
|
+
throw new Error(`${name} must be a non-negative integer`);
|
|
583
|
+
return parsed;
|
|
584
|
+
}
|
|
585
|
+
// Only run the CLI when invoked directly, not when imported (e.g. by eval.ts).
|
|
586
|
+
if (process.argv[1] && fileURLToPath(import.meta.url) === resolve(process.argv[1])) {
|
|
587
|
+
main().catch((error) => {
|
|
588
|
+
console.error(error);
|
|
589
|
+
process.exit(1);
|
|
590
|
+
});
|
|
591
|
+
}
|
|
592
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../../src/render-isolate/entry.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entry.js","sourceRoot":"","sources":["../../src/render-isolate/entry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACxC,UAAkB,CAAC,eAAe,GAAG,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"polyfills.d.ts","sourceRoot":"","sources":["../../src/render-isolate/polyfills.ts"],"names":[],"mappings":"AAEA,OAAO,oBAAoB,CAAC"}
|