@guardbee/mcp-reverse-shield 0.1.0 → 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.
Files changed (76) hide show
  1. package/README.md +39 -9
  2. package/TR.md +39 -9
  3. package/ZH.md +8 -3
  4. package/dist/__tests__/baseline.test.d.ts +2 -0
  5. package/dist/__tests__/baseline.test.d.ts.map +1 -0
  6. package/dist/__tests__/baseline.test.js +130 -0
  7. package/dist/__tests__/baseline.test.js.map +1 -0
  8. package/dist/__tests__/fixes.test.d.ts +2 -0
  9. package/dist/__tests__/fixes.test.d.ts.map +1 -0
  10. package/dist/__tests__/fixes.test.js +163 -0
  11. package/dist/__tests__/fixes.test.js.map +1 -0
  12. package/dist/__tests__/platforms.test.d.ts +2 -0
  13. package/dist/__tests__/platforms.test.d.ts.map +1 -0
  14. package/dist/__tests__/platforms.test.js +207 -0
  15. package/dist/__tests__/platforms.test.js.map +1 -0
  16. package/dist/__tests__/testFixtures.d.ts +16 -0
  17. package/dist/__tests__/testFixtures.d.ts.map +1 -1
  18. package/dist/__tests__/testFixtures.js +71 -0
  19. package/dist/__tests__/testFixtures.js.map +1 -1
  20. package/dist/apk.d.ts +1 -0
  21. package/dist/apk.d.ts.map +1 -1
  22. package/dist/apk.js +44 -10
  23. package/dist/apk.js.map +1 -1
  24. package/dist/baseline.d.ts +36 -0
  25. package/dist/baseline.d.ts.map +1 -0
  26. package/dist/baseline.js +87 -0
  27. package/dist/baseline.js.map +1 -0
  28. package/dist/cli.js +85 -37
  29. package/dist/cli.js.map +1 -1
  30. package/dist/config.d.ts +2 -0
  31. package/dist/config.d.ts.map +1 -1
  32. package/dist/config.js +6 -0
  33. package/dist/config.js.map +1 -1
  34. package/dist/fixes.d.ts +29 -0
  35. package/dist/fixes.d.ts.map +1 -0
  36. package/dist/fixes.js +396 -0
  37. package/dist/fixes.js.map +1 -0
  38. package/dist/frameworks.d.ts +19 -0
  39. package/dist/frameworks.d.ts.map +1 -0
  40. package/dist/frameworks.js +148 -0
  41. package/dist/frameworks.js.map +1 -0
  42. package/dist/index.d.ts +4 -0
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +2 -0
  45. package/dist/index.js.map +1 -1
  46. package/dist/ios.d.ts +24 -0
  47. package/dist/ios.d.ts.map +1 -0
  48. package/dist/ios.js +170 -0
  49. package/dist/ios.js.map +1 -0
  50. package/dist/native.d.ts.map +1 -1
  51. package/dist/native.js +3 -0
  52. package/dist/native.js.map +1 -1
  53. package/dist/plist.d.ts +7 -0
  54. package/dist/plist.d.ts.map +1 -0
  55. package/dist/plist.js +156 -0
  56. package/dist/plist.js.map +1 -0
  57. package/dist/protoxml.d.ts +14 -0
  58. package/dist/protoxml.d.ts.map +1 -0
  59. package/dist/protoxml.js +96 -0
  60. package/dist/protoxml.js.map +1 -0
  61. package/dist/rules.d.ts +1 -1
  62. package/dist/rules.d.ts.map +1 -1
  63. package/dist/rules.js +65 -0
  64. package/dist/rules.js.map +1 -1
  65. package/dist/sarif.d.ts +2 -1
  66. package/dist/sarif.d.ts.map +1 -1
  67. package/dist/sarif.js +4 -1
  68. package/dist/sarif.js.map +1 -1
  69. package/dist/scanner.d.ts.map +1 -1
  70. package/dist/scanner.js +47 -7
  71. package/dist/scanner.js.map +1 -1
  72. package/dist/server.d.ts +2 -1
  73. package/dist/server.d.ts.map +1 -1
  74. package/dist/server.js +28 -5
  75. package/dist/server.js.map +1 -1
  76. package/package.json +6 -3
package/dist/fixes.js ADDED
@@ -0,0 +1,396 @@
1
+ import { existsSync, readFileSync, readdirSync, statSync } from "fs";
2
+ import { basename, join, relative, sep } from "path";
3
+ const MAX_DEPTH = 4;
4
+ const SKIP = new Set(["node_modules", ".git", "dist", "build", "out", ".next", ".gradle", "Pods", "DerivedData", "bin", "obj", ".turbo", "vendor"]);
5
+ function walk(dir, depth, onFile) {
6
+ if (depth > MAX_DEPTH)
7
+ return;
8
+ let entries;
9
+ try {
10
+ entries = readdirSync(dir, { withFileTypes: true });
11
+ }
12
+ catch {
13
+ return;
14
+ }
15
+ for (const e of entries) {
16
+ const full = join(dir, e.name);
17
+ if (e.isDirectory()) {
18
+ if (!SKIP.has(e.name) && !e.name.startsWith("."))
19
+ walk(full, depth + 1, onFile);
20
+ }
21
+ else if (e.isFile()) {
22
+ onFile(full);
23
+ }
24
+ }
25
+ }
26
+ // ── Diff ────────────────────────────────────────────────────────────────────
27
+ function splitLines(text) {
28
+ const finalNewline = text.endsWith("\n");
29
+ const lines = text.split("\n");
30
+ if (finalNewline)
31
+ lines.pop();
32
+ return { lines, finalNewline };
33
+ }
34
+ /** One hunk covering every changed line, with three lines of context; enough for config edits. */
35
+ export function unifiedDiff(file, before, after) {
36
+ if (before === after)
37
+ return "";
38
+ const { lines: a, finalNewline: nlA } = splitLines(before);
39
+ const { lines: b, finalNewline: nlB } = splitLines(after);
40
+ let start = 0;
41
+ while (start < a.length && start < b.length && a[start] === b[start])
42
+ start++;
43
+ let endA = a.length - 1;
44
+ let endB = b.length - 1;
45
+ // Only a newline-at-EOF change: the last line differs in that respect alone.
46
+ const eofOnly = nlA !== nlB;
47
+ while (endA >= start && endB >= start && a[endA] === b[endB] && !(eofOnly && endA === a.length - 1)) {
48
+ endA--;
49
+ endB--;
50
+ }
51
+ const ctxStart = Math.max(0, start - 3);
52
+ const ctxEndA = Math.min(a.length - 1, endA + 3);
53
+ const ctxEndB = Math.min(b.length - 1, endB + 3);
54
+ const out = [];
55
+ const noNl = "\";
56
+ for (let i = ctxStart; i < start; i++)
57
+ out.push(` ${a[i]}`);
58
+ for (let i = start; i <= endA; i++) {
59
+ out.push(`-${a[i]}`);
60
+ if (i === a.length - 1 && !nlA)
61
+ out.push(noNl);
62
+ }
63
+ for (let i = start; i <= endB; i++) {
64
+ out.push(`+${b[i]}`);
65
+ if (i === b.length - 1 && !nlB)
66
+ out.push(noNl);
67
+ }
68
+ for (let i = endA + 1; i <= ctxEndA; i++) {
69
+ out.push(` ${a[i]}`);
70
+ if (i === a.length - 1 && !nlA)
71
+ out.push(noNl);
72
+ }
73
+ const lenA = ctxEndA - ctxStart + 1;
74
+ const lenB = ctxEndB - ctxStart + 1;
75
+ return [`--- a/${file}`, `+++ b/${file}`, `@@ -${ctxStart + 1},${lenA} +${ctxStart + 1},${lenB} @@`, ...out].join("\n") + "\n";
76
+ }
77
+ const fixers = [
78
+ // Vite
79
+ {
80
+ match: (n) => /^vite\.config\.[cm]?[jt]s$/.test(n),
81
+ fix: (text) => {
82
+ const after = text
83
+ .replace(/(\bsourcemap\s*:\s*)(true|["']inline["'])/g, "$1'hidden'")
84
+ .replace(/(\bminify\s*:\s*)false\b/g, "$1'esbuild'");
85
+ if (after === text)
86
+ return null;
87
+ return {
88
+ after,
89
+ ruleIds: ["sourcemap_shipped", "sourcemap_inline", "sourcemap_reference", "unminified_bundle"],
90
+ title: "Vite: hidden source maps and minification for production builds",
91
+ note: "'hidden' still writes .map files for your error tracker; delete them from the deployed output (or do not upload them).",
92
+ };
93
+ },
94
+ },
95
+ // webpack (not dev-only configs)
96
+ {
97
+ match: (n) => /^webpack(\.(prod|production|common|config))*\.config\.[cm]?[jt]s$|^webpack\.(prod|production)\.[cm]?[jt]s$/.test(n),
98
+ fix: (text) => {
99
+ const after = text
100
+ .replace(/(\bdevtool\s*:\s*)(["'])([\w-]{1,60})\2/g, (m, pre, q, value) =>
101
+ // Anything that ships a map or eval-wraps modules; leave hidden-*, false and nosources-* alone.
102
+ !value.startsWith("hidden-") && !value.startsWith("nosources-") && (value.includes("source-map") || value.startsWith("eval")) ? `${pre}${q}hidden-source-map${q}` : m)
103
+ .replace(/(\bminimize\s*:\s*)false\b/g, "$1true");
104
+ if (after === text)
105
+ return null;
106
+ return { after, ruleIds: ["sourcemap_inline", "eval_devtool_bundle", "sourcemap_reference", "unminified_bundle"], title: "webpack: hidden-source-map and minimisation for the production config" };
107
+ },
108
+ },
109
+ // Next.js
110
+ {
111
+ match: (n) => /^next\.config\.[cm]?[jt]s$/.test(n),
112
+ fix: (text) => {
113
+ const after = text.replace(/(\bproductionBrowserSourceMaps\s*:\s*)true\b/g, "$1false");
114
+ return after === text ? null : { after, ruleIds: ["sourcemap_shipped", "sourcemap_publicly_reachable"], title: "Next.js: stop publishing browser source maps" };
115
+ },
116
+ },
117
+ // Angular
118
+ {
119
+ match: (n) => n === "angular.json",
120
+ fix: (text) => {
121
+ const prod = text.indexOf('"production"');
122
+ if (prod === -1)
123
+ return null;
124
+ const block = text.indexOf("}", prod);
125
+ const segment = text.slice(prod, block);
126
+ const fixed = segment.replace(/("sourceMap"\s*:\s*)true\b/, "$1false");
127
+ if (fixed === segment)
128
+ return null;
129
+ return { after: text.slice(0, prod) + fixed + text.slice(block), ruleIds: ["sourcemap_shipped"], title: "Angular: no source maps in the production configuration" };
130
+ },
131
+ },
132
+ // Create React App: GENERATE_SOURCEMAP
133
+ {
134
+ match: (n) => n === "package.json",
135
+ fix: (text, file, project) => {
136
+ if (!/"react-scripts"\s*:/.test(text))
137
+ return null;
138
+ const envProd = join(project, file.replace(/package\.json$/, ""), ".env.production");
139
+ const existing = existsSync(envProd) ? readFileSync(envProd, "utf8") : null;
140
+ if (existing && /^GENERATE_SOURCEMAP\s*=\s*false\s*$/m.test(existing))
141
+ return null;
142
+ return {
143
+ ruleIds: ["sourcemap_shipped"],
144
+ title: "Create React App: set GENERATE_SOURCEMAP=false for production builds",
145
+ note: `Add GENERATE_SOURCEMAP=false to ${relative(project, envProd).split(sep).join("/")}.`,
146
+ };
147
+ },
148
+ },
149
+ // Electron (electron-builder via package.json "build")
150
+ {
151
+ match: (n) => n === "package.json",
152
+ fix: (text) => {
153
+ if (!/"electron-builder"\s*:/.test(text) || /"electronFuses"\s*:/.test(text))
154
+ return null;
155
+ const lines = text.split("\n");
156
+ const i = lines.findIndex((l) => /^\s*"build"\s*:\s*\{\s*$/.test(l));
157
+ if (i === -1)
158
+ return null;
159
+ const indent = (lines[i].match(/^\s*/)?.[0] ?? "") + " ";
160
+ // Flip an existing "asar" in place (removing it could strand a trailing comma); add it otherwise.
161
+ const asarLine = lines.findIndex((l, j) => j > i && /^\s*"asar"\s*:\s*(true|false)\s*,?\s*$/.test(l));
162
+ if (asarLine !== -1)
163
+ lines[asarLine] = lines[asarLine].replace("false", "true");
164
+ const block = [
165
+ ...(asarLine === -1 ? [`${indent}"asar": true,`] : []),
166
+ `${indent}"electronFuses": {`,
167
+ `${indent} "runAsNode": false,`,
168
+ `${indent} "enableCookieEncryption": true,`,
169
+ `${indent} "enableNodeOptionsEnvironmentVariable": false,`,
170
+ `${indent} "enableNodeCliInspectArguments": false,`,
171
+ `${indent} "enableEmbeddedAsarIntegrityValidation": true,`,
172
+ `${indent} "onlyLoadAppFromAsar": true`,
173
+ `${indent}},`,
174
+ ];
175
+ lines.splice(i + 1, 0, ...block);
176
+ return {
177
+ after: lines.join("\n"),
178
+ ruleIds: ["electron_fuse_run_as_node", "electron_fuse_inspect_args", "electron_fuse_node_options", "electron_fuse_asar_integrity_off", "electron_fuse_load_outside_asar", "electron_app_unpacked"],
179
+ title: "electron-builder: package into app.asar and flip the security fuses",
180
+ note: "electronFuses needs electron-builder 24.13 or later. If the app relies on ELECTRON_RUN_AS_NODE (e.g. to spawn helpers), keep runAsNode and use utilityProcess instead first.",
181
+ };
182
+ },
183
+ },
184
+ {
185
+ match: (n) => /^electron-builder\.ya?ml$/.test(n),
186
+ fix: (text) => {
187
+ if (/^electronFuses\s*:/m.test(text) && !/^asar\s*:\s*false/m.test(text))
188
+ return null;
189
+ let after = text.replace(/^asar\s*:\s*false\s*$/m, "asar: true");
190
+ if (!/^electronFuses\s*:/m.test(after)) {
191
+ after = `${after.replace(/\n*$/, "\n")}electronFuses:\n runAsNode: false\n enableCookieEncryption: true\n enableNodeOptionsEnvironmentVariable: false\n enableNodeCliInspectArguments: false\n enableEmbeddedAsarIntegrityValidation: true\n onlyLoadAppFromAsar: true\n`;
192
+ }
193
+ return {
194
+ after,
195
+ ruleIds: ["electron_fuse_run_as_node", "electron_fuse_inspect_args", "electron_fuse_node_options", "electron_fuse_asar_integrity_off", "electron_fuse_load_outside_asar", "electron_app_unpacked"],
196
+ title: "electron-builder: package into app.asar and flip the security fuses",
197
+ note: "electronFuses needs electron-builder 24.13 or later.",
198
+ };
199
+ },
200
+ },
201
+ {
202
+ match: (n) => /^forge\.config\.[cm]?[jt]s$/.test(n),
203
+ fix: (text) => {
204
+ if (/FusesPlugin/.test(text))
205
+ return null;
206
+ return {
207
+ ruleIds: ["electron_fuse_run_as_node", "electron_fuse_inspect_args", "electron_fuse_node_options", "electron_fuse_asar_integrity_off", "electron_fuse_load_outside_asar"],
208
+ title: "Electron Forge: add the fuses plugin",
209
+ note: [
210
+ "Install @electron-forge/plugin-fuses and @electron/fuses, then add to plugins:",
211
+ " new FusesPlugin({ version: FuseVersion.V1, [FuseV1Options.RunAsNode]: false, [FuseV1Options.EnableCookieEncryption]: true,",
212
+ " [FuseV1Options.EnableNodeOptionsEnvironmentVariable]: false, [FuseV1Options.EnableNodeCliInspectArguments]: false,",
213
+ " [FuseV1Options.EnableEmbeddedAsarIntegrityValidation]: true, [FuseV1Options.OnlyLoadAppFromAsar]: true })",
214
+ ].join("\n"),
215
+ };
216
+ },
217
+ },
218
+ // Android Gradle
219
+ {
220
+ match: (n) => n === "build.gradle" || n === "build.gradle.kts",
221
+ fix: (text, file) => {
222
+ if (!/com\.android\.application|android\s*\{/.test(text))
223
+ return null;
224
+ const kts = file.endsWith(".kts");
225
+ const lines = text.split("\n");
226
+ // Only inside buildTypes: signingConfigs usually has a "release" block too.
227
+ const buildTypes = lines.findIndex((l) => /^\s*buildTypes\s*\{\s*$/.test(l));
228
+ if (buildTypes === -1)
229
+ return null;
230
+ const offset = lines.slice(buildTypes + 1).findIndex((l) => /^\s*(getByName\(\s*"release"\s*\)|release)\s*\{\s*$/.test(l));
231
+ if (offset === -1)
232
+ return null;
233
+ const rel = buildTypes + 1 + offset;
234
+ // The release block ends at the first line back at its indentation.
235
+ const indent = lines[rel].match(/^\s*/)?.[0] ?? "";
236
+ let end = rel + 1;
237
+ while (end < lines.length && !(lines[end].startsWith(`${indent}}`) && lines[end].trim() === "}"))
238
+ end++;
239
+ const body = lines.slice(rel + 1, end);
240
+ const inner = `${indent} `;
241
+ const minifyRe = kts ? /^\s*isMinifyEnabled\s*=\s*(true|false)/ : /^\s*minifyEnabled\s*(=\s*)?(true|false)/;
242
+ const debugRe = kts ? /^\s*isDebuggable\s*=\s*true/ : /^\s*debuggable\s*(=\s*)?true/;
243
+ let changed = false;
244
+ const newBody = body
245
+ .filter((l) => {
246
+ if (debugRe.test(l)) {
247
+ changed = true;
248
+ return false;
249
+ }
250
+ return true;
251
+ })
252
+ .map((l) => {
253
+ if (minifyRe.test(l) && /false/.test(l)) {
254
+ changed = true;
255
+ return l.replace("false", "true");
256
+ }
257
+ return l;
258
+ });
259
+ if (!newBody.some((l) => minifyRe.test(l))) {
260
+ changed = true;
261
+ newBody.unshift(kts ? `${inner}isMinifyEnabled = true` : `${inner}minifyEnabled true`, kts ? `${inner}isShrinkResources = true` : `${inner}shrinkResources true`, kts
262
+ ? `${inner}proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")`
263
+ : `${inner}proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'`);
264
+ }
265
+ if (!changed)
266
+ return null;
267
+ return {
268
+ after: [...lines.slice(0, rel + 1), ...newBody, ...lines.slice(end)].join("\n"),
269
+ ruleIds: ["apk_no_obfuscation", "apk_debuggable"],
270
+ title: "Android: R8 on and debuggable off for the release build type",
271
+ note: "Run the release build and its tests after enabling R8; classes used through reflection (serialisation, DI) may need -keep rules in proguard-rules.pro.",
272
+ };
273
+ },
274
+ },
275
+ // React Native: Hermes
276
+ {
277
+ match: (n, p) => n === "gradle.properties" && p.split(sep).includes("android"),
278
+ fix: (text) => {
279
+ const after = text.replace(/^(hermesEnabled\s*=\s*)false\s*$/m, "$1true");
280
+ return after === text ? null : { after, ruleIds: ["apk_js_bundle_plaintext"], title: "React Native: ship the bundle as Hermes bytecode" };
281
+ },
282
+ },
283
+ // AndroidManifest
284
+ {
285
+ match: (n) => n === "AndroidManifest.xml",
286
+ fix: (text, file) => {
287
+ let after = text.replace(/\s+android:debuggable\s*=\s*"true"/g, "");
288
+ // A missing allowBackup only matters in the main manifest; debug/flavor
289
+ // overlays inherit it, so there only an explicit "true" is wrong.
290
+ const isMain = file.includes("/src/main/") || !file.includes("/src/");
291
+ if (/android:allowBackup\s*=\s*"true"/.test(after))
292
+ after = after.replace(/android:allowBackup\s*=\s*"true"/, 'android:allowBackup="false"');
293
+ else if (isMain && /<application\b/.test(after) && !/android:allowBackup\s*=/.test(after)) {
294
+ after = after.replace(/<application\b([^>]*)>/, (m, attrs) => {
295
+ const indent = (attrs.match(/\n(\s+)android:/)?.[1]) ?? " ";
296
+ const sepr = attrs.includes("\n") ? `\n${indent}` : " ";
297
+ return `<application${sepr}android:allowBackup="false"${attrs}>`;
298
+ });
299
+ }
300
+ if (after === text)
301
+ return null;
302
+ return {
303
+ after,
304
+ ruleIds: ["apk_allow_backup", "apk_debuggable"],
305
+ title: "Android manifest: no backup of app data, no hard-coded debuggable",
306
+ note: "If the app relies on Auto Backup, keep it and exclude sensitive files with android:dataExtractionRules instead.",
307
+ };
308
+ },
309
+ },
310
+ // .NET
311
+ {
312
+ match: (n) => /\.(cs|fs|vb)proj$/.test(n) || n === "Directory.Build.props",
313
+ fix: (text) => {
314
+ const after = text
315
+ .replace(/<DebugType>\s*embedded\s*<\/DebugType>/gi, "<DebugType>portable</DebugType>")
316
+ .replace(/<EmbedAllSources>\s*true\s*<\/EmbedAllSources>/gi, "<EmbedAllSources>false</EmbedAllSources>");
317
+ if (after === text)
318
+ return null;
319
+ return {
320
+ after,
321
+ ruleIds: ["dotnet_embedded_pdb"],
322
+ title: ".NET: keep the PDB (and sources) out of the shipped assembly",
323
+ note: "portable writes a separate .pdb; leave it out of the published output, or use <DebugType>none</DebugType> for Release. Obfuscation is a separate step (e.g. Obfuscar in the publish pipeline).",
324
+ };
325
+ },
326
+ },
327
+ // Flutter: build flags, not a config file
328
+ {
329
+ match: (n) => n === "pubspec.yaml",
330
+ fix: (text) => {
331
+ if (!/^\s*flutter\s*:/m.test(text))
332
+ return null;
333
+ return {
334
+ ruleIds: ["native_symbols_not_stripped"],
335
+ title: "Flutter: obfuscate Dart code and split debug info at build time",
336
+ note: "Build releases with: flutter build apk --obfuscate --split-debug-info=build/symbols (same flags for appbundle/ipa). Keep build/symbols private for crash symbolication.",
337
+ };
338
+ },
339
+ },
340
+ ];
341
+ /**
342
+ * Reads a project's build configuration and proposes the changes that close
343
+ * the exposures reverse-shield reports, as diffs to review and apply. It
344
+ * never writes files.
345
+ */
346
+ export function suggestFixes(projectDir) {
347
+ if (!existsSync(projectDir) || !statSync(projectDir).isDirectory())
348
+ throw new Error(`Not a project directory: ${projectDir}`);
349
+ const suggestions = [];
350
+ const inspected = [];
351
+ walk(projectDir, 0, (full) => {
352
+ const name = basename(full);
353
+ const matching = fixers.filter((f) => f.match(name, full));
354
+ if (matching.length === 0)
355
+ return;
356
+ const rel = relative(projectDir, full).split(sep).join("/");
357
+ let text;
358
+ try {
359
+ if (statSync(full).size > 2 * 1024 * 1024)
360
+ return;
361
+ text = readFileSync(full, "utf8");
362
+ }
363
+ catch {
364
+ return;
365
+ }
366
+ inspected.push(rel);
367
+ for (const f of matching) {
368
+ const result = f.fix(text, rel, projectDir);
369
+ if (!result)
370
+ continue;
371
+ const { after, ...rest } = result;
372
+ suggestions.push({ file: rel, diff: after !== undefined ? unifiedDiff(rel, text, after) : "", ...rest });
373
+ }
374
+ });
375
+ return { project: projectDir, suggestions, inspected: inspected.sort() };
376
+ }
377
+ export function formatFixReport(report) {
378
+ if (report.suggestions.length === 0) {
379
+ return `✅ No changes to suggest in ${report.inspected.length} build config file(s)${report.inspected.length ? `: ${report.inspected.join(", ")}` : " (none recognised)"}.`;
380
+ }
381
+ const lines = [`🔧 ${report.suggestions.length} suggested change(s) from ${report.inspected.length} build config file(s). Nothing was modified.`, ""];
382
+ for (const s of report.suggestions) {
383
+ lines.push(`## ${s.title}`, `File: ${s.file}`, `Addresses: ${s.ruleIds.join(", ")}`);
384
+ if (s.diff)
385
+ lines.push("```diff", s.diff.trimEnd(), "```");
386
+ if (s.note)
387
+ lines.push(s.note);
388
+ lines.push("");
389
+ }
390
+ return lines.join("\n");
391
+ }
392
+ /** All diffs concatenated, ready for `git apply`. */
393
+ export function patchOf(report) {
394
+ return report.suggestions.map((s) => s.diff).filter(Boolean).join("");
395
+ }
396
+ //# sourceMappingURL=fixes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixes.js","sourceRoot":"","sources":["../src/fixes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { Finding } from "./finding.js";
2
+ import type { ArtifactFile } from "./web.js";
3
+ export interface FrameworkResult {
4
+ findings: Finding[];
5
+ notes: string[];
6
+ }
7
+ export declare function frameworkChecks(files: ArtifactFile[]): FrameworkResult;
8
+ /**
9
+ * A PyInstaller executable ends with a CArchive whose cookie marks it; the
10
+ * archive holds the app's .pyc files, which extract and decompile with
11
+ * public tools. PyArmor-protected archives carry its runtime module.
12
+ */
13
+ export declare function pyinstallerCheck(buf: Buffer, file: string): FrameworkResult;
14
+ export declare function isJar(path: string): boolean;
15
+ /** Class names in a JAR (plain or Spring Boot) judged like dex: ProGuard leaves one- and two-letter names. */
16
+ export declare function analyzeJar(path: string): FrameworkResult & {
17
+ scannedFiles: number;
18
+ };
19
+ //# sourceMappingURL=frameworks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frameworks.d.ts","sourceRoot":"","sources":["../src/frameworks.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAG7C,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AA6ED,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,eAAe,CAGtE;AAID;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe,CAa3E;AAID,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE3C;AASD,8GAA8G;AAC9G,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,CAwBnF"}
@@ -0,0 +1,148 @@
1
+ import { closeSync, openSync, statSync } from "fs";
2
+ import { assessDexObfuscation } from "./dex.js";
3
+ import { finding } from "./finding.js";
4
+ import { assessDotnetNames, detectNativeFormat, readDotnetStringsHeap } from "./native.js";
5
+ import { extractZipEntry, readZipEntries } from "./zip.js";
6
+ const IL2CPP_METADATA_MAGIC = 0xfab11baf;
7
+ const PYINSTALLER_COOKIE = Buffer.from([0x4d, 0x45, 0x49, 0x0c, 0x0b, 0x0a, 0x0b, 0x0e]); // "MEI\014\013\012\013\016"
8
+ // ── Unity ───────────────────────────────────────────────────────────────────
9
+ /** The .NET #Strings heap of a managed DLL, located the same way analyzeNative does. */
10
+ function dotnetNames(buf) {
11
+ if (detectNativeFormat(buf) !== "pe")
12
+ return null;
13
+ try {
14
+ const peOff = buf.readUInt32LE(0x3c);
15
+ const coff = peOff + 4;
16
+ const nSections = buf.readUInt16LE(coff + 2);
17
+ const optSize = buf.readUInt16LE(coff + 16);
18
+ const opt = coff + 20;
19
+ const dirBase = opt + (buf.readUInt16LE(opt) === 0x20b ? 112 : 96);
20
+ const clrRva = buf.readUInt32LE(dirBase + 14 * 8);
21
+ if (!clrRva)
22
+ return null;
23
+ const toOffset = (rva) => {
24
+ for (let i = 0; i < nSections; i++) {
25
+ const o = opt + optSize + i * 40;
26
+ const va = buf.readUInt32LE(o + 12);
27
+ const size = Math.max(buf.readUInt32LE(o + 8), buf.readUInt32LE(o + 16));
28
+ if (rva >= va && rva < va + size)
29
+ return rva - va + buf.readUInt32LE(o + 20);
30
+ }
31
+ return null;
32
+ };
33
+ const clr = toOffset(clrRva);
34
+ const meta = clr === null ? null : toOffset(buf.readUInt32LE(clr + 8));
35
+ return meta === null ? null : readDotnetStringsHeap(buf, meta);
36
+ }
37
+ catch {
38
+ return null;
39
+ }
40
+ }
41
+ function unity(files) {
42
+ const findings = [];
43
+ const notes = [];
44
+ for (const f of files.filter((x) => x.key.endsWith("/Metadata/global-metadata.dat"))) {
45
+ const head = f.read()?.subarray(0, 8);
46
+ if (!head || head.length < 8)
47
+ continue;
48
+ if (head.readUInt32LE(0) === IL2CPP_METADATA_MAGIC) {
49
+ findings.push(finding("unity_il2cpp_metadata", f.display, { match: `global-metadata.dat v${head.readUInt32LE(4)} with an intact header (${(f.size / 1024 / 1024).toFixed(1)} MiB)` }));
50
+ }
51
+ else {
52
+ notes.push(`Unity IL2CPP metadata at ${f.key} does not start with the standard header (encrypted or protected)`);
53
+ }
54
+ }
55
+ const managed = files.filter((x) => /(^|\/)Managed\/Assembly-CSharp(-firstpass)?\.dll$/.test(x.key));
56
+ for (const f of managed) {
57
+ const buf = f.read();
58
+ const names = buf ? dotnetNames(buf) : null;
59
+ if (!names)
60
+ continue;
61
+ const verdict = assessDotnetNames(names);
62
+ if (verdict.obfuscated)
63
+ notes.push(`${f.key}: ${verdict.summary}`);
64
+ else
65
+ findings.push(finding("unity_mono_assemblies", f.display, { match: verdict.summary }));
66
+ }
67
+ if (findings.length + notes.length > 0)
68
+ notes.unshift("Unity player detected");
69
+ return { findings, notes };
70
+ }
71
+ // ── Flutter ─────────────────────────────────────────────────────────────────
72
+ function flutter(files) {
73
+ const engine = files.some((f) => /(^|\/)libflutter\.so$/.test(f.key) || /(^|\/)Flutter\.framework\/Flutter$/.test(f.key));
74
+ const app = files.find((f) => /(^|\/)libapp\.so$/.test(f.key) || /(^|\/)App\.framework\/App$/.test(f.key));
75
+ if (!engine || !app)
76
+ return { findings: [], notes: [] };
77
+ return {
78
+ findings: [],
79
+ notes: [
80
+ `Flutter app (${app.key}): Dart code ships as an AOT snapshot. reverse-shield does not measure Dart obfuscation; build releases with --obfuscate --split-debug-info=<dir>.`,
81
+ ],
82
+ };
83
+ }
84
+ export function frameworkChecks(files) {
85
+ const results = [unity(files), flutter(files)];
86
+ return { findings: results.flatMap((r) => r.findings), notes: results.flatMap((r) => r.notes) };
87
+ }
88
+ // ── PyInstaller ─────────────────────────────────────────────────────────────
89
+ /**
90
+ * A PyInstaller executable ends with a CArchive whose cookie marks it; the
91
+ * archive holds the app's .pyc files, which extract and decompile with
92
+ * public tools. PyArmor-protected archives carry its runtime module.
93
+ */
94
+ export function pyinstallerCheck(buf, file) {
95
+ // At the very end on Linux/Windows; on macOS the archive sits in its own
96
+ // Mach-O section and the code signature follows, so search the whole file.
97
+ const cookieAt = buf.lastIndexOf(PYINSTALLER_COOKIE);
98
+ if (cookieAt === -1) {
99
+ if (buf.includes("Nuitka") && buf.includes("__compiled__"))
100
+ return { findings: [], notes: [`${file}: compiled with Nuitka (Python compiled to C)`] };
101
+ return { findings: [], notes: [] };
102
+ }
103
+ const python = buf.subarray(cookieAt + 24, cookieAt + 88).toString("latin1").match(/python\d+(?:\.\d+)*/i)?.[0];
104
+ if (buf.includes("pyarmor_runtime") || buf.includes("__pyarmor__")) {
105
+ return { findings: [], notes: [`${file}: PyInstaller bundle protected with PyArmor`] };
106
+ }
107
+ return { findings: [finding("python_pyinstaller_bundle", file, { match: `PyInstaller archive${python ? ` (${python})` : ""}` })], notes: [] };
108
+ }
109
+ // ── Java ────────────────────────────────────────────────────────────────────
110
+ export function isJar(path) {
111
+ return /\.(jar|war)$/i.test(path);
112
+ }
113
+ function manifestValue(manifest, key) {
114
+ // MANIFEST.MF wraps long values onto continuation lines that start with a space.
115
+ const unfolded = manifest.replace(/\r?\n /g, "");
116
+ const line = unfolded.split(/\r?\n/).find((l) => l.startsWith(`${key}:`));
117
+ return line ? line.slice(key.length + 1).trim() : null;
118
+ }
119
+ /** Class names in a JAR (plain or Spring Boot) judged like dex: ProGuard leaves one- and two-letter names. */
120
+ export function analyzeJar(path) {
121
+ const size = statSync(path).size;
122
+ const fd = openSync(path, "r");
123
+ try {
124
+ const entries = readZipEntries(fd, size);
125
+ const mfEntry = entries.find((e) => e.name === "META-INF/MANIFEST.MF");
126
+ const mf = mfEntry ? extractZipEntry(fd, mfEntry)?.toString("utf8") ?? "" : "";
127
+ const main = manifestValue(mf, "Start-Class") ?? manifestValue(mf, "Main-Class");
128
+ const classes = entries
129
+ .filter((e) => e.name.endsWith(".class") && !e.name.startsWith("META-INF/"))
130
+ .map((e) => e.name.replace(/^(BOOT-INF|WEB-INF)\/classes\//, ""));
131
+ const notes = [];
132
+ if (classes.length === 0)
133
+ return { findings: [], notes: [`${path}: no classes in the archive`], scannedFiles: 1 };
134
+ const pkg = main && main.includes(".") ? main.slice(0, main.lastIndexOf(".")) : null;
135
+ if (!pkg)
136
+ return { findings: [], notes: [`${path}: ${classes.length} classes, no Main-Class/Start-Class to locate the application package`], scannedFiles: 1 };
137
+ const verdict = assessDexObfuscation(classes.map((c) => `L${c.slice(0, -".class".length)};`), pkg);
138
+ notes.push(`${pkg}: ${verdict.appClasses} app classes, ${verdict.shortNamed} with 1–2 letter names`);
139
+ const findings = verdict.obfuscated
140
+ ? []
141
+ : [finding("java_not_obfuscated", path, { match: `${verdict.appClasses} classes under ${pkg}, ${verdict.shortNamed} renamed; e.g. ${verdict.sample.join(", ")}` })];
142
+ return { findings, notes, scannedFiles: 1 };
143
+ }
144
+ finally {
145
+ closeSync(fd);
146
+ }
147
+ }
148
+ //# sourceMappingURL=frameworks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frameworks.js","sourceRoot":"","sources":["../src/frameworks.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -13,4 +13,8 @@ export { readAsar } from "./asar.js";
13
13
  export { analyzeElectron, detectElectron, parseFuseWire, readFuseWire, FUSE_SENTINEL } from "./electron.js";
14
14
  export { analyzeNative, detectNativeFormat } from "./native.js";
15
15
  export { registerTools } from "./server.js";
16
+ export { applyIgnores, compareToBaseline, createBaseline, fingerprint, normalizeLocation, readBaseline, writeBaseline } from "./baseline.js";
17
+ export type { Baseline, BaselineDiff } from "./baseline.js";
18
+ export { formatFixReport, patchOf, suggestFixes, unifiedDiff } from "./fixes.js";
19
+ export type { FixReport, FixSuggestion } from "./fixes.js";
16
20
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5C,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC3E,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC5G,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5C,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC3E,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC5G,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,WAAW,EAAE,iBAAiB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC7I,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACjF,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -9,4 +9,6 @@ export { readAsar } from "./asar.js";
9
9
  export { analyzeElectron, detectElectron, parseFuseWire, readFuseWire, FUSE_SENTINEL } from "./electron.js";
10
10
  export { analyzeNative, detectNativeFormat } from "./native.js";
11
11
  export { registerTools } from "./server.js";
12
+ export { applyIgnores, compareToBaseline, createBaseline, fingerprint, normalizeLocation, readBaseline, writeBaseline } from "./baseline.js";
13
+ export { formatFixReport, patchOf, suggestFixes, unifiedDiff } from "./fixes.js";
12
14
  //# sourceMappingURL=index.js.map