@remnux/mcp-server 0.1.54 → 0.1.56

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 (88) hide show
  1. package/README.md +16 -1
  2. package/data/osint-resources.json +546 -0
  3. package/dist/analysis/behavior-prerequisites.d.ts +65 -0
  4. package/dist/analysis/behavior-prerequisites.d.ts.map +1 -0
  5. package/dist/analysis/behavior-prerequisites.js +186 -0
  6. package/dist/analysis/behavior-prerequisites.js.map +1 -0
  7. package/dist/analysis/file-diff.d.ts +59 -0
  8. package/dist/analysis/file-diff.d.ts.map +1 -0
  9. package/dist/analysis/file-diff.js +55 -0
  10. package/dist/analysis/file-diff.js.map +1 -0
  11. package/dist/analysis/index.d.ts +1 -1
  12. package/dist/analysis/index.d.ts.map +1 -1
  13. package/dist/analysis/index.js +1 -1
  14. package/dist/analysis/index.js.map +1 -1
  15. package/dist/analysis/string-usage.d.ts +74 -0
  16. package/dist/analysis/string-usage.d.ts.map +1 -0
  17. package/dist/analysis/string-usage.js +124 -0
  18. package/dist/analysis/string-usage.js.map +1 -0
  19. package/dist/analysis/summarizer.d.ts +22 -0
  20. package/dist/analysis/summarizer.d.ts.map +1 -1
  21. package/dist/analysis/summarizer.js +41 -0
  22. package/dist/analysis/summarizer.js.map +1 -1
  23. package/dist/connectors/docker.d.ts +1 -0
  24. package/dist/connectors/docker.d.ts.map +1 -1
  25. package/dist/connectors/docker.js +39 -5
  26. package/dist/connectors/docker.js.map +1 -1
  27. package/dist/handlers/analyze-file.d.ts.map +1 -1
  28. package/dist/handlers/analyze-file.js +19 -2
  29. package/dist/handlers/analyze-file.js.map +1 -1
  30. package/dist/handlers/check-behavior-prerequisites.d.ts +16 -0
  31. package/dist/handlers/check-behavior-prerequisites.d.ts.map +1 -0
  32. package/dist/handlers/check-behavior-prerequisites.js +132 -0
  33. package/dist/handlers/check-behavior-prerequisites.js.map +1 -0
  34. package/dist/handlers/compare-files.d.ts +10 -0
  35. package/dist/handlers/compare-files.d.ts.map +1 -0
  36. package/dist/handlers/compare-files.js +147 -0
  37. package/dist/handlers/compare-files.js.map +1 -0
  38. package/dist/handlers/extract-iocs.d.ts.map +1 -1
  39. package/dist/handlers/extract-iocs.js +6 -0
  40. package/dist/handlers/extract-iocs.js.map +1 -1
  41. package/dist/handlers/get-tool-help.d.ts.map +1 -1
  42. package/dist/handlers/get-tool-help.js +11 -0
  43. package/dist/handlers/get-tool-help.js.map +1 -1
  44. package/dist/handlers/osint.d.ts +10 -0
  45. package/dist/handlers/osint.d.ts.map +1 -0
  46. package/dist/handlers/osint.js +72 -0
  47. package/dist/handlers/osint.js.map +1 -0
  48. package/dist/handlers/report.d.ts.map +1 -1
  49. package/dist/handlers/report.js +11 -0
  50. package/dist/handlers/report.js.map +1 -1
  51. package/dist/handlers/verify-string-usage.d.ts +10 -0
  52. package/dist/handlers/verify-string-usage.d.ts.map +1 -0
  53. package/dist/handlers/verify-string-usage.js +173 -0
  54. package/dist/handlers/verify-string-usage.js.map +1 -0
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +55 -8
  57. package/dist/index.js.map +1 -1
  58. package/dist/osint/guidance.d.ts +125 -0
  59. package/dist/osint/guidance.d.ts.map +1 -0
  60. package/dist/osint/guidance.js +217 -0
  61. package/dist/osint/guidance.js.map +1 -0
  62. package/dist/osint/index.d.ts +61 -0
  63. package/dist/osint/index.d.ts.map +1 -0
  64. package/dist/osint/index.js +64 -0
  65. package/dist/osint/index.js.map +1 -0
  66. package/dist/parsers/capa.d.ts +8 -1
  67. package/dist/parsers/capa.d.ts.map +1 -1
  68. package/dist/parsers/capa.js +145 -0
  69. package/dist/parsers/capa.js.map +1 -1
  70. package/dist/parsers/imports.d.ts +36 -0
  71. package/dist/parsers/imports.d.ts.map +1 -0
  72. package/dist/parsers/imports.js +67 -0
  73. package/dist/parsers/imports.js.map +1 -0
  74. package/dist/parsers/r2.d.ts +73 -0
  75. package/dist/parsers/r2.d.ts.map +1 -0
  76. package/dist/parsers/r2.js +161 -0
  77. package/dist/parsers/r2.js.map +1 -0
  78. package/dist/parsers/types.d.ts +19 -0
  79. package/dist/parsers/types.d.ts.map +1 -1
  80. package/dist/report/triage-discipline.d.ts +28 -0
  81. package/dist/report/triage-discipline.d.ts.map +1 -0
  82. package/dist/report/triage-discipline.js +49 -0
  83. package/dist/report/triage-discipline.js.map +1 -0
  84. package/dist/schemas/tools.d.ts +56 -3
  85. package/dist/schemas/tools.d.ts.map +1 -1
  86. package/dist/schemas/tools.js +44 -2
  87. package/dist/schemas/tools.js.map +1 -1
  88. package/package.json +2 -1
@@ -0,0 +1,10 @@
1
+ import type { HandlerDeps } from "./types.js";
2
+ import type { CompareFilesArgs } from "../schemas/tools.js";
3
+ export declare function handleCompareFiles(deps: HandlerDeps, args: CompareFilesArgs): Promise<{
4
+ content: Array<{
5
+ type: "text";
6
+ text: string;
7
+ }>;
8
+ isError?: boolean;
9
+ }>;
10
+ //# sourceMappingURL=compare-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare-files.d.ts","sourceRoot":"","sources":["../../src/handlers/compare-files.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAwH5D,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,gBAAgB;;;;;;GA8CjF"}
@@ -0,0 +1,147 @@
1
+ import { validateFilePath } from "../security/blocklist.js";
2
+ import { formatResponse, formatError } from "../response.js";
3
+ import { REMnuxError } from "../errors/remnux-error.js";
4
+ import { toREMnuxError } from "../errors/error-mapper.js";
5
+ import { resolveSamplePath } from "../utils/resolve-sample-path.js";
6
+ import { checkFileExists } from "../utils/check-file-exists.js";
7
+ import { parsePeImports } from "../parsers/imports.js";
8
+ import { parseDiecOutput } from "../parsers/diec.js";
9
+ import { parseCapaOutput } from "../parsers/capa.js";
10
+ import { parseR2Sections } from "../parsers/r2.js";
11
+ import { diffFileMeta } from "../analysis/file-diff.js";
12
+ /** Shannon entropy of the file's bytes, via a one-shot python helper. */
13
+ const ENTROPY_PY = "import sys,math,collections\n" +
14
+ "b=open(sys.argv[1],'rb').read()\n" +
15
+ "n=len(b) or 1\n" +
16
+ "c=collections.Counter(b)\n" +
17
+ "print(round(-sum((v/n)*math.log2(v/n) for v in c.values()),4))";
18
+ function archFromFileType(ft) {
19
+ if (/PE32\+|x86-64|x86_64|64-bit/i.test(ft))
20
+ return "x64";
21
+ if (/PE32\b|Intel 80386|80386|32-bit/i.test(ft))
22
+ return "x86";
23
+ return undefined;
24
+ }
25
+ /** Pull the value after "Type: name" from a diec finding for a given category. */
26
+ function diecValue(diecRaw, category) {
27
+ const parsed = parseDiecOutput(diecRaw);
28
+ const f = parsed.findings.find((x) => x.category === category);
29
+ if (!f)
30
+ return undefined;
31
+ const idx = f.description.indexOf(": ");
32
+ return idx >= 0 ? f.description.slice(idx + 2) : f.description;
33
+ }
34
+ async function num(connector, cmd) {
35
+ try {
36
+ const r = await connector.execute(cmd, { timeout: 30000 });
37
+ const n = parseFloat((r.stdout || "").trim().split(/\s+/)[0]);
38
+ return Number.isFinite(n) ? n : undefined;
39
+ }
40
+ catch {
41
+ return undefined;
42
+ }
43
+ }
44
+ async function gatherFileMeta(connector, filePath, fileArg, runCapa) {
45
+ let fileType = "";
46
+ let sha256 = "";
47
+ try {
48
+ fileType = (await connector.execute(["file", filePath], { timeout: 30000 })).stdout?.trim() ?? "";
49
+ }
50
+ catch { /* best effort */ }
51
+ try {
52
+ sha256 = ((await connector.execute(["sha256sum", filePath], { timeout: 30000 })).stdout || "").trim().split(/\s+/)[0] || "";
53
+ }
54
+ catch { /* best effort */ }
55
+ const size_bytes = (await num(connector, ["stat", "-c", "%s", filePath])) ?? 0;
56
+ const entropy = await (async () => {
57
+ try {
58
+ const r = await connector.execute(["python3", "-c", ENTROPY_PY, filePath], { timeout: 30000 });
59
+ const n = parseFloat((r.stdout || "").trim());
60
+ return Number.isFinite(n) ? n : undefined;
61
+ }
62
+ catch {
63
+ return undefined;
64
+ }
65
+ })();
66
+ let compiler;
67
+ let packer;
68
+ try {
69
+ const diec = (await connector.execute(["diec", "-j", filePath], { timeout: 60000 })).stdout || "";
70
+ compiler = diecValue(diec, "compiler");
71
+ packer = diecValue(diec, "packer") ?? diecValue(diec, "protector");
72
+ }
73
+ catch { /* best effort */ }
74
+ let imports = [];
75
+ try {
76
+ const imp = parsePeImports((await connector.execute(["readpe", "-i", "-f", "json", filePath], { timeout: 60000 })).stdout || "");
77
+ imports = imp.dlls.flatMap((d) => d.functions);
78
+ }
79
+ catch { /* non-PE or failure */ }
80
+ let sections = [];
81
+ try {
82
+ const sec = parseR2Sections((await connector.execute(["r2", "-2", "-q", "-N", "-e", "scr.color=0", "-c", "iSj", filePath], { timeout: 30000 })).stdout || "");
83
+ sections = sec.map((s) => s.name).filter((n) => n.length > 0);
84
+ }
85
+ catch { /* best effort */ }
86
+ let capabilities = [];
87
+ if (runCapa) {
88
+ try {
89
+ const capa = parseCapaOutput((await connector.execute(["capa", "-j", filePath], { timeout: 300000 })).stdout || "");
90
+ capabilities = capa.findings.map((f) => f.description);
91
+ }
92
+ catch { /* best effort */ }
93
+ }
94
+ return {
95
+ file: fileArg,
96
+ file_type: fileType,
97
+ sha256,
98
+ size_bytes,
99
+ arch: archFromFileType(fileType),
100
+ entropy,
101
+ compiler,
102
+ packer,
103
+ imports,
104
+ import_count: imports.length,
105
+ capabilities,
106
+ capa_run: runCapa,
107
+ sections,
108
+ };
109
+ }
110
+ export async function handleCompareFiles(deps, args) {
111
+ const startTime = Date.now();
112
+ try {
113
+ const { connector, config } = deps;
114
+ const depth = args.depth ?? "standard";
115
+ for (const f of [args.file_a, args.file_b]) {
116
+ if (!config.noSandbox) {
117
+ const v = validateFilePath(f, config.samplesDir);
118
+ if (!v.safe) {
119
+ return formatError("compare_files", new REMnuxError(v.error || "Invalid file path", "INVALID_PATH", "validation", "Use a relative path within the samples directory"), startTime);
120
+ }
121
+ }
122
+ }
123
+ const pa = resolveSamplePath(args.file_a, config.samplesDir, config.mode);
124
+ const pb = resolveSamplePath(args.file_b, config.samplesDir, config.mode);
125
+ const ea = await checkFileExists(connector, pa.filePath);
126
+ if (ea)
127
+ return formatError("compare_files", ea, startTime);
128
+ const eb = await checkFileExists(connector, pb.filePath);
129
+ if (eb)
130
+ return formatError("compare_files", eb, startTime);
131
+ const runCapa = depth === "standard";
132
+ const metaA = await gatherFileMeta(connector, pa.filePath, args.file_a, runCapa);
133
+ const metaB = await gatherFileMeta(connector, pb.filePath, args.file_b, runCapa);
134
+ const diff = diffFileMeta(metaA, metaB);
135
+ return formatResponse("compare_files", {
136
+ depth,
137
+ basis: "Structured diff of two files' static properties (size, entropy, architecture, compiler, packer, imports, capabilities, sections). Reuses readpe/diec/capa/radare2; capability diff requires depth='standard'.",
138
+ file_a: { ...diff.file_a, file_type: metaA.file_type, size_bytes: metaA.size_bytes, import_count: metaA.import_count },
139
+ file_b: { ...diff.file_b, file_type: metaB.file_type, size_bytes: metaB.size_bytes, import_count: metaB.import_count },
140
+ diff,
141
+ }, startTime);
142
+ }
143
+ catch (error) {
144
+ return formatError("compare_files", toREMnuxError(error, deps.config.mode), startTime);
145
+ }
146
+ }
147
+ //# sourceMappingURL=compare-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare-files.js","sourceRoot":"","sources":["../../src/handlers/compare-files.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"extract-iocs.d.ts","sourceRoot":"","sources":["../../src/handlers/extract-iocs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAK3D,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,eAAe;;;;;;GAsBtB"}
1
+ {"version":3,"file":"extract-iocs.d.ts","sourceRoot":"","sources":["../../src/handlers/extract-iocs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAK3D,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,eAAe;;;;;;GA6BtB"}
@@ -14,6 +14,12 @@ export async function handleExtractIOCs(_deps, args) {
14
14
  if (args.include_noise) {
15
15
  data.noise = result.noise;
16
16
  }
17
+ // Point the next hop at malware-specific OSINT enrichment for the IOCs just extracted.
18
+ if (result.iocs.length > 0) {
19
+ data.next_step =
20
+ "To enrich these IOCs with external OSINT, call get_osint_guidance for malware-specific triage " +
21
+ "tradecraft (hash-first, disclosure-aware) and a curated catalog of lookup services.";
22
+ }
17
23
  return formatResponse("extract_iocs", data, startTime);
18
24
  }
19
25
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"extract-iocs.js","sourceRoot":"","sources":["../../src/handlers/extract-iocs.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAAkB,EAClB,IAAqB;IAErB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE;YACpC,iBAAiB,EAAE,IAAI,CAAC,mBAAmB;SAC5C,CAAC,CAAC;QAEH,MAAM,IAAI,GAA4B;YACpC,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC;QAEF,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC5B,CAAC;QAED,OAAO,cAAc,CAAC,cAAc,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,cAAc,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC;IACtE,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"extract-iocs.js","sourceRoot":"","sources":["../../src/handlers/extract-iocs.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAAkB,EAClB,IAAqB;IAErB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE;YACpC,iBAAiB,EAAE,IAAI,CAAC,mBAAmB;SAC5C,CAAC,CAAC;QAEH,MAAM,IAAI,GAA4B;YACpC,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC;QAEF,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC5B,CAAC;QAED,uFAAuF;QACvF,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,SAAS;gBACZ,gGAAgG;oBAChG,qFAAqF,CAAC;QAC1F,CAAC;QAED,OAAO,cAAc,CAAC,cAAc,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,cAAc,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC;IACtE,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"get-tool-help.d.ts","sourceRoot":"","sources":["../../src/handlers/get-tool-help.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAS3D,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,eAAe;;;;;;GAmFtB"}
1
+ {"version":3,"file":"get-tool-help.d.ts","sourceRoot":"","sources":["../../src/handlers/get-tool-help.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAS3D,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,eAAe;;;;;;GAmGtB"}
@@ -24,6 +24,9 @@ export async function handleGetToolHelp(deps, args) {
24
24
  : [["--help"], ["-h"]];
25
25
  let output = "";
26
26
  let exitCode = 0;
27
+ // Set when a thrown Docker/OCI exec error indicates the binary is missing
28
+ // (Docker surfaces this instead of the shell's exit code 127).
29
+ let notFound = false;
27
30
  for (const helpArgs of helpInvocations) {
28
31
  try {
29
32
  const result = await connector.execute([resolved, ...helpArgs], { timeout: 10000 });
@@ -43,10 +46,18 @@ export async function handleGetToolHelp(deps, args) {
43
46
  if (/timeout/i.test(msg)) {
44
47
  return formatError("get_tool_help", new REMnuxError(`Timed out running '${tool} ${helpArgs.join(" ")}'`, "COMMAND_TIMEOUT", "timeout", "The tool may require input or not support help flags"), startTime);
45
48
  }
49
+ // Docker/OCI surface a missing executable as a thrown exec error rather
50
+ // than the shell's exit code 127. Mark it so we return NOT_FOUND below.
51
+ if (/executable file not found|not found in \$?PATH|OCI runtime exec failed/i.test(msg)) {
52
+ notFound = true;
53
+ }
46
54
  // Continue to next help invocation
47
55
  }
48
56
  }
49
57
  if (!output) {
58
+ if (notFound) {
59
+ return formatError("get_tool_help", new REMnuxError(`Tool '${tool}' not found. It may not be installed on this REMnux system.`, "NOT_FOUND", "not_found", "Use check_tools to see installed tools, or install with apt/pip"), startTime);
60
+ }
50
61
  return formatError("get_tool_help", new REMnuxError(`No help output from '${tool}'. The tool may not be installed or may not support --help/-h.`, "EMPTY_OUTPUT", "tool_failure", "Check that the tool is installed with check_tools, or try run_tool with a specific command"), startTime);
51
62
  }
52
63
  return formatResponse("get_tool_help", {
@@ -1 +1 @@
1
- {"version":3,"file":"get-tool-help.js","sourceRoot":"","sources":["../../src/handlers/get-tool-help.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,MAAM,YAAY,GAAG,8BAA8B,CAAC;AAEpD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAiB,EACjB,IAAqB;IAErB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAEvB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,OAAO,WAAW,CAAC,eAAe,EAAE,IAAI,WAAW,CACjD,uBAAuB,IAAI,4FAA4F,EACvH,eAAe,EACf,YAAY,EACZ,4DAA4D,CAC7D,EAAE,SAAS,CAAC,CAAC;QAChB,CAAC;QAED,mEAAmE;QACnE,0EAA0E;QAC1E,gEAAgE;QAChE,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,QAAQ,GAAG,GAAG,EAAE,OAAO,IAAI,IAAI,CAAC;QAEtC,+EAA+E;QAC/E,oEAAoE;QACpE,MAAM,eAAe,GAAe,GAAG,EAAE,QAAQ;YAC/C,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;YAChB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QAEzB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,QAAQ,GAAG,CAAC,CAAC;QAEjB,KAAK,MAAM,QAAQ,IAAI,eAAe,EAAE,CAAC;YACvC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,GAAG,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;gBACpF,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;gBAClF,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;gBAE3B,yEAAyE;gBACzE,IAAI,MAAM,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;oBAC5B,OAAO,WAAW,CAAC,eAAe,EAAE,IAAI,WAAW,CACjD,SAAS,IAAI,6DAA6D,EAC1E,WAAW,EACX,WAAW,EACX,iEAAiE,CAClE,EAAE,SAAS,CAAC,CAAC;gBAChB,CAAC;gBAED,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM,GAAG,QAAQ,CAAC;oBAClB,MAAM;gBACR,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACnE,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBACzB,OAAO,WAAW,CAAC,eAAe,EAAE,IAAI,WAAW,CACjD,sBAAsB,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EACnD,iBAAiB,EACjB,SAAS,EACT,sDAAsD,CACvD,EAAE,SAAS,CAAC,CAAC;gBAChB,CAAC;gBACD,mCAAmC;YACrC,CAAC;QACH,CAAC;QAED,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,WAAW,CAAC,eAAe,EAAE,IAAI,WAAW,CACjD,wBAAwB,IAAI,gEAAgE,EAC5F,cAAc,EACd,cAAc,EACd,4FAA4F,CAC7F,EAAE,SAAS,CAAC,CAAC;QAChB,CAAC;QAED,OAAO,cAAc,CAAC,eAAe,EAAE;YACrC,IAAI;YACJ,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,uBAAuB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5D,IAAI,EAAE,MAAM;YACZ,SAAS,EAAE,QAAQ;SACpB,EAAE,SAAS,CAAC,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,eAAe,EAAE,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC;IACzF,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"get-tool-help.js","sourceRoot":"","sources":["../../src/handlers/get-tool-help.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { HandlerDeps } from "./types.js";
2
+ import type { GetOsintGuidanceArgs } from "../schemas/tools.js";
3
+ export declare function handleGetOsintGuidance(_deps: HandlerDeps, args: GetOsintGuidanceArgs): Promise<{
4
+ content: Array<{
5
+ type: "text";
6
+ text: string;
7
+ }>;
8
+ isError?: boolean;
9
+ }>;
10
+ //# sourceMappingURL=osint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"osint.d.ts","sourceRoot":"","sources":["../../src/handlers/osint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AA0ChE,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,oBAAoB;;;;;;GAsC1F"}
@@ -0,0 +1,72 @@
1
+ import { formatResponse, formatError } from "../response.js";
2
+ import { toREMnuxError } from "../errors/error-mapper.js";
3
+ import { OSINT_GUIDANCE } from "../osint/guidance.js";
4
+ import { loadOsintCatalog, condensedCatalog, resourcesForIocType, } from "../osint/index.js";
5
+ const NOTES = "Server-authored, bundled, offline guidance. This tool returns GUIDANCE only — it makes no network calls and " +
6
+ "holds no API keys; run the lookups with your own tools. The resource catalog (data/osint-resources.json) is " +
7
+ "maintained by pull request and curated for free, mostly-stable services. The canonical source lists are " +
8
+ "zeltser.com/automated-malware-analysis, /lookup-malicious-websites, and /malicious-ip-blocklists.";
9
+ /** Select the guidance prose for a topic. The catalog ('resources') is handled separately by ioc_type. */
10
+ function selectGuidance(topic) {
11
+ switch (topic) {
12
+ case "tradecraft":
13
+ return { tradecraft: OSINT_GUIDANCE.tradecraft };
14
+ case "workflow":
15
+ return {
16
+ workflow_by_ioc: OSINT_GUIDANCE.workflow_by_ioc,
17
+ disclosure_legend: OSINT_GUIDANCE.disclosure_legend,
18
+ };
19
+ case "access":
20
+ return { access_guidance: OSINT_GUIDANCE.access_guidance };
21
+ case "resources":
22
+ return {};
23
+ case "all":
24
+ default:
25
+ return {
26
+ tradecraft: OSINT_GUIDANCE.tradecraft,
27
+ access_guidance: OSINT_GUIDANCE.access_guidance,
28
+ workflow_by_ioc: OSINT_GUIDANCE.workflow_by_ioc,
29
+ disclosure_legend: OSINT_GUIDANCE.disclosure_legend,
30
+ };
31
+ }
32
+ }
33
+ export async function handleGetOsintGuidance(_deps, args) {
34
+ const startTime = Date.now();
35
+ try {
36
+ const topic = args.topic ?? "all";
37
+ const iocType = args.ioc_type;
38
+ const data = {
39
+ topic,
40
+ version: OSINT_GUIDANCE.version,
41
+ // Persistent header on EVERY response — leads not verdicts, corroborate, triage not assessment.
42
+ header: OSINT_GUIDANCE.header,
43
+ scope: OSINT_GUIDANCE.scope,
44
+ };
45
+ if (iocType)
46
+ data.ioc_type = iocType;
47
+ // Guidance prose, selected by `topic`.
48
+ Object.assign(data, selectGuidance(topic));
49
+ // Resources, selected by `ioc_type` (full detail) or `topic` (condensed / full / omitted).
50
+ if (iocType) {
51
+ data.resources = resourcesForIocType(iocType);
52
+ }
53
+ else if (topic === "resources") {
54
+ data.resources = loadOsintCatalog().resources;
55
+ }
56
+ else if (topic === "all") {
57
+ data.resources = condensedCatalog();
58
+ data.resources_note =
59
+ "Condensed index. The lean flow for a real sample: call once with topic='all' for the prose plus this " +
60
+ "index, then call topic='resources' with ioc_type=<hash|url|domain|ip|family|host_artifact> per indicator " +
61
+ "type to get full per-entry detail (caveats, both disclosure fields, stability) without re-emitting the " +
62
+ "prose. access_guidance.first_moves lists the fastest keyless move per type.";
63
+ }
64
+ // Prose-only topics with no ioc_type omit `resources` entirely (token hygiene).
65
+ data.notes = NOTES;
66
+ return formatResponse("get_osint_guidance", data, startTime);
67
+ }
68
+ catch (error) {
69
+ return formatError("get_osint_guidance", toREMnuxError(error), startTime);
70
+ }
71
+ }
72
+ //# sourceMappingURL=osint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"osint.js","sourceRoot":"","sources":["../../src/handlers/osint.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,GAEpB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,KAAK,GACT,8GAA8G;IAC9G,8GAA8G;IAC9G,0GAA0G;IAC1G,mGAAmG,CAAC;AAEtG,0GAA0G;AAC1G,SAAS,cAAc,CAAC,KAAa;IACnC,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,YAAY;YACf,OAAO,EAAE,UAAU,EAAE,cAAc,CAAC,UAAU,EAAE,CAAC;QACnD,KAAK,UAAU;YACb,OAAO;gBACL,eAAe,EAAE,cAAc,CAAC,eAAe;gBAC/C,iBAAiB,EAAE,cAAc,CAAC,iBAAiB;aACpD,CAAC;QACJ,KAAK,QAAQ;YACX,OAAO,EAAE,eAAe,EAAE,cAAc,CAAC,eAAe,EAAE,CAAC;QAC7D,KAAK,WAAW;YACd,OAAO,EAAE,CAAC;QACZ,KAAK,KAAK,CAAC;QACX;YACE,OAAO;gBACL,UAAU,EAAE,cAAc,CAAC,UAAU;gBACrC,eAAe,EAAE,cAAc,CAAC,eAAe;gBAC/C,eAAe,EAAE,cAAc,CAAC,eAAe;gBAC/C,iBAAiB,EAAE,cAAc,CAAC,iBAAiB;aACpD,CAAC;IACN,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,KAAkB,EAAE,IAA0B;IACzF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,QAA+B,CAAC;QAErD,MAAM,IAAI,GAA4B;YACpC,KAAK;YACL,OAAO,EAAE,cAAc,CAAC,OAAO;YAC/B,gGAAgG;YAChG,MAAM,EAAE,cAAc,CAAC,MAAM;YAC7B,KAAK,EAAE,cAAc,CAAC,KAAK;SAC5B,CAAC;QACF,IAAI,OAAO;YAAE,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QAErC,uCAAuC;QACvC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;QAE3C,2FAA2F;QAC3F,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,SAAS,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAChD,CAAC;aAAM,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;YACjC,IAAI,CAAC,SAAS,GAAG,gBAAgB,EAAE,CAAC,SAAS,CAAC;QAChD,CAAC;aAAM,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;YAC3B,IAAI,CAAC,SAAS,GAAG,gBAAgB,EAAE,CAAC;YACpC,IAAI,CAAC,cAAc;gBACjB,uGAAuG;oBACvG,2GAA2G;oBAC3G,yGAAyG;oBACzG,6EAA6E,CAAC;QAClF,CAAC;QACD,gFAAgF;QAEhF,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,OAAO,cAAc,CAAC,oBAAoB,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,oBAAoB,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/handlers/report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAyCjE,wBAAsB,uBAAuB,CAAC,KAAK,EAAE,WAAW;;;;;;GAgB/D;AAED,wBAAsB,uBAAuB,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,qBAAqB;;;;;;GAkB5F"}
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/handlers/report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AA0CjE,wBAAsB,uBAAuB,CAAC,KAAK,EAAE,WAAW;;;;;;GAgB/D;AAED,wBAAsB,uBAAuB,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,qBAAqB;;;;;;GAmC5F"}
@@ -1,6 +1,7 @@
1
1
  import { formatResponse, formatError } from "../response.js";
2
2
  import { toREMnuxError } from "../errors/error-mapper.js";
3
3
  import { REPORT_TEMPLATE, GUIDELINES_DIGEST, ATTRIBUTION, SOURCE_META, } from "../report/content.generated.js";
4
+ import { TRIAGE_DISCIPLINE } from "../report/triage-discipline.js";
4
5
  const NOTES = "This report template and writing guidance are bundled with the server and work offline — no network required. " +
5
6
  `The canonical, continuously updated source is ${SOURCE_META.fallbackArticleUrl}. ` +
6
7
  "When online, the zeltser-website MCP server offers richer tools — malware_get_template, malware_get_guidelines, " +
@@ -47,6 +48,16 @@ export async function handleGetReportGuidance(_deps, args) {
47
48
  const startTime = Date.now();
48
49
  try {
49
50
  const topic = args.topic ?? "all";
51
+ // The triage-discipline checklist is server-authored operational guidance,
52
+ // not part of the synced report-writing digest — return it on its own.
53
+ if (topic === "triage_checklist") {
54
+ return formatResponse("get_report_guidance", {
55
+ topic,
56
+ triage_discipline: TRIAGE_DISCIPLINE,
57
+ notes: "Server-authored, bundled, offline operational guidance — distinct from the report-writing " +
58
+ "guidelines (use any other topic, or 'all', for those).",
59
+ }, startTime);
60
+ }
50
61
  return formatResponse("get_report_guidance", {
51
62
  topic,
52
63
  guidelines: selectGuidelines(topic),
@@ -1 +1 @@
1
- {"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/handlers/report.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,WAAW,EACX,WAAW,GACZ,MAAM,gCAAgC,CAAC;AAExC,MAAM,KAAK,GACT,gHAAgH;IAChH,iDAAiD,WAAW,CAAC,kBAAkB,IAAI;IACnF,kHAAkH;IAClH,uFAAuF,CAAC;AAE1F,0FAA0F;AAC1F,MAAM,UAAU,GAA6B;IAC3C,QAAQ,EAAE,CAAC,oBAAoB,EAAE,gBAAgB,EAAE,eAAe,EAAE,qBAAqB,CAAC;IAC1F,UAAU,EAAE,CAAC,YAAY,CAAC;IAC1B,YAAY,EAAE,CAAC,iBAAiB,CAAC;IACjC,eAAe,EAAE,CAAC,eAAe,CAAC;IAClC,aAAa,EAAE,CAAC,cAAc,CAAC;IAC/B,MAAM,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,0BAA0B,CAAC;IAChG,OAAO,EAAE,CAAC,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,iBAAiB,CAAC;IACnG,UAAU,EAAE,CAAC,YAAY,CAAC;IAC1B,QAAQ,EAAE,CAAC,uBAAuB,CAAC;CACpC,CAAC;AAEF,+GAA+G;AAC/G,SAAS,gBAAgB,CAAC,KAAa;IACrC,IAAI,KAAK,KAAK,KAAK,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1C,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IACD,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QAChE,IAAI,GAAG,IAAI,iBAAiB;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,KAAkB;IAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,OAAO,cAAc,CACnB,qBAAqB,EACrB;YACE,QAAQ,EAAE,eAAe;YACzB,WAAW,EAAE,WAAW,CAAC,QAAQ;YACjC,MAAM,EAAE,WAAW;YACnB,KAAK,EAAE,KAAK;SACb,EACD,SAAS,CACV,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,qBAAqB,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,KAAkB,EAAE,IAA2B;IAC3F,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC;QAClC,OAAO,cAAc,CACnB,qBAAqB,EACrB;YACE,KAAK;YACL,UAAU,EAAE,gBAAgB,CAAC,KAAK,CAAC;YACnC,WAAW,EAAE,WAAW,CAAC,UAAU;YACnC,MAAM,EAAE,WAAW;YACnB,KAAK,EAAE,KAAK;SACb,EACD,SAAS,CACV,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,qBAAqB,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/handlers/report.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,WAAW,EACX,WAAW,GACZ,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAEnE,MAAM,KAAK,GACT,gHAAgH;IAChH,iDAAiD,WAAW,CAAC,kBAAkB,IAAI;IACnF,kHAAkH;IAClH,uFAAuF,CAAC;AAE1F,0FAA0F;AAC1F,MAAM,UAAU,GAA6B;IAC3C,QAAQ,EAAE,CAAC,oBAAoB,EAAE,gBAAgB,EAAE,eAAe,EAAE,qBAAqB,CAAC;IAC1F,UAAU,EAAE,CAAC,YAAY,CAAC;IAC1B,YAAY,EAAE,CAAC,iBAAiB,CAAC;IACjC,eAAe,EAAE,CAAC,eAAe,CAAC;IAClC,aAAa,EAAE,CAAC,cAAc,CAAC;IAC/B,MAAM,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,0BAA0B,CAAC;IAChG,OAAO,EAAE,CAAC,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,iBAAiB,CAAC;IACnG,UAAU,EAAE,CAAC,YAAY,CAAC;IAC1B,QAAQ,EAAE,CAAC,uBAAuB,CAAC;CACpC,CAAC;AAEF,+GAA+G;AAC/G,SAAS,gBAAgB,CAAC,KAAa;IACrC,IAAI,KAAK,KAAK,KAAK,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1C,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IACD,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QAChE,IAAI,GAAG,IAAI,iBAAiB;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,KAAkB;IAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,OAAO,cAAc,CACnB,qBAAqB,EACrB;YACE,QAAQ,EAAE,eAAe;YACzB,WAAW,EAAE,WAAW,CAAC,QAAQ;YACjC,MAAM,EAAE,WAAW;YACnB,KAAK,EAAE,KAAK;SACb,EACD,SAAS,CACV,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,qBAAqB,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,KAAkB,EAAE,IAA2B;IAC3F,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC;QAElC,2EAA2E;QAC3E,uEAAuE;QACvE,IAAI,KAAK,KAAK,kBAAkB,EAAE,CAAC;YACjC,OAAO,cAAc,CACnB,qBAAqB,EACrB;gBACE,KAAK;gBACL,iBAAiB,EAAE,iBAAiB;gBACpC,KAAK,EACH,4FAA4F;oBAC5F,wDAAwD;aAC3D,EACD,SAAS,CACV,CAAC;QACJ,CAAC;QAED,OAAO,cAAc,CACnB,qBAAqB,EACrB;YACE,KAAK;YACL,UAAU,EAAE,gBAAgB,CAAC,KAAK,CAAC;YACnC,WAAW,EAAE,WAAW,CAAC,UAAU;YACnC,MAAM,EAAE,WAAW;YACnB,KAAK,EAAE,KAAK;SACb,EACD,SAAS,CACV,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,qBAAqB,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { HandlerDeps } from "./types.js";
2
+ import type { VerifyStringUsageArgs } from "../schemas/tools.js";
3
+ export declare function handleVerifyStringUsage(deps: HandlerDeps, args: VerifyStringUsageArgs): Promise<{
4
+ content: Array<{
5
+ type: "text";
6
+ text: string;
7
+ }>;
8
+ isError?: boolean;
9
+ }>;
10
+ //# sourceMappingURL=verify-string-usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-string-usage.d.ts","sourceRoot":"","sources":["../../src/handlers/verify-string-usage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AA+BjE,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,qBAAqB;;;;;;GA8L3F"}
@@ -0,0 +1,173 @@
1
+ import { validateFilePath } from "../security/blocklist.js";
2
+ import { formatResponse, formatError } from "../response.js";
3
+ import { REMnuxError } from "../errors/remnux-error.js";
4
+ import { toREMnuxError } from "../errors/error-mapper.js";
5
+ import { resolveSamplePath } from "../utils/resolve-sample-path.js";
6
+ import { checkFileExists } from "../utils/check-file-exists.js";
7
+ import { looksObscured } from "./check-behavior-prerequisites.js";
8
+ import { parseR2Strings, parseR2Sections, parseR2Functions, parseR2Xrefs, splitMarkedR2Output, R2_MARKERS, } from "../parsers/r2.js";
9
+ import { selectMatches, classifyMatch } from "../analysis/string-usage.js";
10
+ const BASIS = "Static string enumeration (radare2 izj) plus code cross-reference analysis (aa; aar; axt). 'referenced_from_code' " +
11
+ "means an instruction references the string; 'no_code_xrefs_detected' is a complete-analysis null result and is " +
12
+ "NOT proof the string is unused; 'unknown' means analysis was incomplete/unreliable (packed, timed out, version " +
13
+ "drift) and is never a negative. This is a static check — confirm runtime behavior dynamically.";
14
+ /** Base, non-interactive, hermetic r2 invocation flags. */
15
+ const R2_FLAGS = ["-2", "-q", "-N", "-e", "scr.color=0", "-e", "log.quiet=true"];
16
+ /** Total distinct string addresses fed to the (expensive) xref pass. */
17
+ const VADDR_CAP = 40;
18
+ export async function handleVerifyStringUsage(deps, args) {
19
+ const startTime = Date.now();
20
+ try {
21
+ const { connector, config } = deps;
22
+ if (!args.query) {
23
+ return formatError("verify_string_usage", new REMnuxError("A non-empty 'query' string is required.", "INVALID_ARGUMENT", "validation", "Pass the string to look for."), startTime);
24
+ }
25
+ if (!config.noSandbox) {
26
+ const validation = validateFilePath(args.file, config.samplesDir);
27
+ if (!validation.safe) {
28
+ return formatError("verify_string_usage", new REMnuxError(validation.error || "Invalid file path", "INVALID_PATH", "validation", "Use a relative path within the samples directory"), startTime);
29
+ }
30
+ }
31
+ const { filePath } = resolveSamplePath(args.file, config.samplesDir, config.mode);
32
+ const fileError = await checkFileExists(connector, filePath);
33
+ if (fileError)
34
+ return formatError("verify_string_usage", fileError, startTime);
35
+ let fileType = "";
36
+ try {
37
+ const r = await connector.execute(["file", filePath], { timeout: 30000 });
38
+ fileType = r.stdout?.trim() ?? "";
39
+ }
40
+ catch (error) {
41
+ const mapped = toREMnuxError(error, config.mode);
42
+ if (mapped.code === "CONNECTION_FAILED")
43
+ return formatError("verify_string_usage", mapped, startTime);
44
+ }
45
+ // When the `file` probe failed or returned nothing, do NOT assert this is a
46
+ // non-code file: that would fall through to a confident "not an executable, no
47
+ // code references" — a false negative on what may be a real executable. Treat an
48
+ // unknown type as code-capable so the r2 xref pass runs and the
49
+ // schemaKnown/analysisComplete gating downgrades to UNKNOWN if analysis is degraded.
50
+ const fileTypeKnown = fileType.trim() !== "";
51
+ const isCodeFile = fileTypeKnown
52
+ ? /\bPE32\+?\b|\bELF\b|Mach-O|MS Windows|executable/i.test(fileType)
53
+ : true;
54
+ // Pass 1 — enumerate strings (cheap, no analysis). Try izj (mapped sections),
55
+ // fall back to izzj (whole file). r2 absence is detected here.
56
+ let r2Available = true;
57
+ let strings = parseR2Strings("");
58
+ try {
59
+ const r = await connector.execute([...["r2"], ...R2_FLAGS, "-c", "izj", filePath], { timeout: 30000 });
60
+ if (r.exitCode === 127 || /not found|No such file/i.test(r.stderr || "")) {
61
+ r2Available = false;
62
+ }
63
+ else {
64
+ strings = parseR2Strings(r.stdout || "");
65
+ if (strings.length === 0) {
66
+ const rz = await connector.execute([...["r2"], ...R2_FLAGS, "-c", "izzj", filePath], { timeout: 30000 });
67
+ strings = parseR2Strings(rz.stdout || "");
68
+ }
69
+ }
70
+ }
71
+ catch {
72
+ r2Available = false;
73
+ }
74
+ if (!r2Available) {
75
+ return formatResponse("verify_string_usage", {
76
+ file: args.file, query: args.query, file_type: fileType, engine: "radare2", engine_available: false, basis: BASIS,
77
+ match_count: 0, matches: [],
78
+ note: "radare2 is unavailable on this system; string cross-reference analysis could not run. Status is UNKNOWN — not a 'no xref' result.",
79
+ }, startTime);
80
+ }
81
+ const maxMatches = args.max_matches ?? 50;
82
+ const { groups, truncated } = selectMatches(strings, args.query, maxMatches);
83
+ if (groups.length === 0) {
84
+ return formatResponse("verify_string_usage", {
85
+ file: args.file, query: args.query, file_type: fileType, is_code_file: isCodeFile, engine: "radare2", basis: BASIS,
86
+ match_count: 0, matches: [],
87
+ note: "The query was not found among this file's strings (radare2 izj/izzj). It is not embedded as a contiguous string — it could still be built at runtime or stored encoded/obfuscated.",
88
+ }, startTime);
89
+ }
90
+ // Non-code file: nothing can reference the string in code.
91
+ if (!isCodeFile) {
92
+ const ctx = { isCodeFile: false, fileType, schemaKnown: false, analysisComplete: false, obscured: false };
93
+ const matches = groups.map((g) => classifyMatch(g, [], [], ctx));
94
+ return formatResponse("verify_string_usage", { file: args.file, query: args.query, file_type: fileType, is_code_file: false, engine: "radare2", basis: BASIS, match_count: groups.length, matches_truncated: truncated, matches }, startTime);
95
+ }
96
+ // Detect packing (reused from check_behavior_prerequisites) — a gate for the invariant.
97
+ let obscured = false;
98
+ try {
99
+ const d = await connector.execute(["diec", "-j", filePath], { timeout: 60000 });
100
+ obscured = looksObscured(d.stdout || "");
101
+ }
102
+ catch {
103
+ /* best effort */
104
+ }
105
+ // Select the groups we can afford to xref (bounded), keeping every classified
106
+ // group fully covered so a non-queried vaddr is never read as a negative.
107
+ const queried = new Set();
108
+ const groupsToClassify = [];
109
+ for (const g of groups) {
110
+ const vs = g.vaddrs.map((v) => v.vaddr);
111
+ if (queried.size + vs.length > VADDR_CAP && groupsToClassify.length > 0)
112
+ break;
113
+ vs.forEach((v) => queried.add(v));
114
+ groupsToClassify.push(g);
115
+ }
116
+ const matchesTruncated = truncated || groupsToClassify.length < groups.length;
117
+ // Pass 2 — one analyzed session: version, sections, functions, per-vaddr xrefs.
118
+ const deep = args.depth === "deep";
119
+ const analysisCmd = deep ? "aaa" : "aa; aar";
120
+ const parts = ["?V", analysisCmd, `?e ${R2_MARKERS.sections}`, "iSj", `?e ${R2_MARKERS.functions}`, "aflj"];
121
+ for (const v of queried) {
122
+ const h = "0x" + v.toString(16);
123
+ parts.push(`?e ${R2_MARKERS.xref} ${h}`, `axtj @ ${h}`);
124
+ }
125
+ const soft = deep ? 60 : 20;
126
+ let split;
127
+ try {
128
+ const r = await connector.execute([...["r2"], ...R2_FLAGS, "-e", `anal.timeout=${soft}`, "-c", parts.join("; "), filePath], { timeout: deep ? 120000 : 45000 });
129
+ split = splitMarkedR2Output(r.stdout || "");
130
+ }
131
+ catch {
132
+ /* timeout / kill → unknown below */
133
+ }
134
+ if (!split) {
135
+ const ctx = { isCodeFile: true, fileType, schemaKnown: false, analysisComplete: false, obscured };
136
+ const matches = groupsToClassify.map((g) => classifyMatch(g, [], [], ctx));
137
+ return formatResponse("verify_string_usage", { file: args.file, query: args.query, file_type: fileType, is_code_file: true, engine: "radare2", packer_detected: obscured, analysis_complete: false, timed_out: true, basis: BASIS, match_count: groupsToClassify.length, matches_truncated: matchesTruncated, matches }, startTime);
138
+ }
139
+ const sections = parseR2Sections(split.sectionsJson);
140
+ const functions = parseR2Functions(split.functionsJson);
141
+ const ctx = {
142
+ isCodeFile: true,
143
+ fileType,
144
+ schemaKnown: !!split.version,
145
+ analysisComplete: !split.truncated && functions.length > 0,
146
+ obscured,
147
+ };
148
+ const matches = groupsToClassify.map((g) => {
149
+ const xrefs = [];
150
+ let rawAnomaly = false;
151
+ for (const v of g.vaddrs) {
152
+ const raw = split.xrefsByVaddr.get("0x" + v.vaddr.toString(16));
153
+ if (raw === undefined)
154
+ continue;
155
+ const parsed = parseR2Xrefs(raw);
156
+ const t = raw.trim();
157
+ if (parsed.length === 0 && t !== "" && t !== "[]")
158
+ rawAnomaly = true;
159
+ xrefs.push(...parsed);
160
+ }
161
+ return classifyMatch(g, xrefs, sections, ctx, rawAnomaly);
162
+ });
163
+ return formatResponse("verify_string_usage", {
164
+ file: args.file, query: args.query, file_type: fileType, is_code_file: true, engine: "radare2",
165
+ r2_version: split.version, packer_detected: obscured, analysis_complete: ctx.analysisComplete,
166
+ basis: BASIS, match_count: groupsToClassify.length, matches_truncated: matchesTruncated, matches,
167
+ }, startTime);
168
+ }
169
+ catch (error) {
170
+ return formatError("verify_string_usage", toREMnuxError(error, deps.config.mode), startTime);
171
+ }
172
+ }
173
+ //# sourceMappingURL=verify-string-usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-string-usage.js","sourceRoot":"","sources":["../../src/handlers/verify-string-usage.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAoB,MAAM,yCAAyC,CAAC;AAOtF,OAAO,EAAmB,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAoC9E,MAAM,WAAW,YAAa,SAAQ,eAAe;IACnD,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,YAAY,sBAqVtD;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,YAAY,iBAqCrD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAoB,MAAM,yCAAyC,CAAC;AAOtF,OAAO,EAAmB,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AA4C9E,MAAM,WAAW,YAAa,SAAQ,eAAe;IACnD,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,YAAY,sBAwZtD;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,YAAY,iBAqCrD"}