@remnux/mcp-server 0.1.65 → 0.1.67
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/README.md +14 -7
- package/data/tools-index.json +16 -2
- package/dist/analysis/summarizer.d.ts.map +1 -1
- package/dist/analysis/summarizer.js +10 -3
- package/dist/analysis/summarizer.js.map +1 -1
- package/dist/catalog/index.d.ts.map +1 -1
- package/dist/catalog/index.js +7 -0
- package/dist/catalog/index.js.map +1 -1
- package/dist/file-type-mappings.d.ts.map +1 -1
- package/dist/file-type-mappings.js +16 -0
- package/dist/file-type-mappings.js.map +1 -1
- package/dist/handlers/analyze-file.d.ts +7 -0
- package/dist/handlers/analyze-file.d.ts.map +1 -1
- package/dist/handlers/analyze-file.js +35 -25
- package/dist/handlers/analyze-file.js.map +1 -1
- package/dist/handlers/get-server-info.d.ts +9 -0
- package/dist/handlers/get-server-info.d.ts.map +1 -0
- package/dist/handlers/get-server-info.js +52 -0
- package/dist/handlers/get-server-info.js.map +1 -0
- package/dist/handlers/output-spill.d.ts +29 -0
- package/dist/handlers/output-spill.d.ts.map +1 -0
- package/dist/handlers/output-spill.js +48 -0
- package/dist/handlers/output-spill.js.map +1 -0
- package/dist/handlers/run-tool.d.ts +15 -0
- package/dist/handlers/run-tool.d.ts.map +1 -1
- package/dist/handlers/run-tool.js +285 -14
- package/dist/handlers/run-tool.js.map +1 -1
- package/dist/handlers/suggest-tools.d.ts.map +1 -1
- package/dist/handlers/suggest-tools.js +10 -0
- package/dist/handlers/suggest-tools.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -6
- package/dist/index.js.map +1 -1
- package/dist/schemas/tools.d.ts +2 -0
- package/dist/schemas/tools.d.ts.map +1 -1
- package/dist/schemas/tools.js +12 -2
- package/dist/schemas/tools.js.map +1 -1
- package/dist/tools/definitions.d.ts.map +1 -1
- package/dist/tools/definitions.js +28 -0
- package/dist/tools/definitions.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { formatResponse } from "../response.js";
|
|
2
|
+
/**
|
|
3
|
+
* get_server_info — report the MCP server version, how it reaches REMnux
|
|
4
|
+
* (connector mode + transport), and the REMnux distro version on the target.
|
|
5
|
+
*
|
|
6
|
+
* The REMnux version is best-effort. /etc/remnux-version is the authoritative
|
|
7
|
+
* source (the distro's own CLI reads it); `remnux version` is only a fallback,
|
|
8
|
+
* and its output can carry banner or help text ahead of the version, so each
|
|
9
|
+
* source is scanned for a bare version line or a "remnux-version X" line rather
|
|
10
|
+
* than trusting the first line. Any failure or non-version output yields remnux_version: null
|
|
11
|
+
* rather than an error, because the server-side facts are still useful.
|
|
12
|
+
*/
|
|
13
|
+
// A line that IS a version ("7.0.9"), or the CLI's "remnux-version 7.0.9" line.
|
|
14
|
+
// Anything else (banners, help text, the CLI's own version) is not the distro version.
|
|
15
|
+
const BARE_VERSION_LINE = /^v?(\d+(?:\.\d+)+)$/;
|
|
16
|
+
const LABELED_VERSION_LINE = /\bremnux-version\s*[:=]?\s*v?(\d+(?:\.\d+)+)\b/i;
|
|
17
|
+
function extractVersion(stdout) {
|
|
18
|
+
for (const raw of (stdout || "").split("\n")) {
|
|
19
|
+
const line = raw.trim();
|
|
20
|
+
const m = line.match(BARE_VERSION_LINE) ?? line.match(LABELED_VERSION_LINE);
|
|
21
|
+
if (m)
|
|
22
|
+
return m[1];
|
|
23
|
+
}
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
async function readRemnuxVersion(deps) {
|
|
27
|
+
const probes = ["cat /etc/remnux-version 2>/dev/null", "remnux version 2>/dev/null"];
|
|
28
|
+
for (const cmd of probes) {
|
|
29
|
+
try {
|
|
30
|
+
const result = await deps.connector.executeShell(cmd, { timeout: 10000 });
|
|
31
|
+
const version = extractVersion(result.stdout);
|
|
32
|
+
if (version)
|
|
33
|
+
return version;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// try the next source
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
export async function handleGetServerInfo(deps, serverVersion) {
|
|
42
|
+
const startTime = Date.now();
|
|
43
|
+
const { config } = deps;
|
|
44
|
+
const remnuxVersion = await readRemnuxVersion(deps);
|
|
45
|
+
return formatResponse("get_server_info", {
|
|
46
|
+
server_version: serverVersion,
|
|
47
|
+
connector_mode: config.mode,
|
|
48
|
+
transport: config.transport ?? "stdio",
|
|
49
|
+
remnux_version: remnuxVersion,
|
|
50
|
+
}, startTime);
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=get-server-info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-server-info.js","sourceRoot":"","sources":["../../src/handlers/get-server-info.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;;;;;;;;;GAUG;AACH,gFAAgF;AAChF,uFAAuF;AACvF,MAAM,iBAAiB,GAAG,qBAAqB,CAAC;AAChD,MAAM,oBAAoB,GAAG,iDAAiD,CAAC;AAE/E,SAAS,cAAc,CAAC,MAAc;IACpC,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC5E,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,IAAiB;IAChD,MAAM,MAAM,GAAG,CAAC,qCAAqC,EAAE,4BAA4B,CAAC,CAAC;IACrF,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YAC1E,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC9C,IAAI,OAAO;gBAAE,OAAO,OAAO,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAiB,EAAE,aAAqB;IAChF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAExB,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAEpD,OAAO,cAAc,CAAC,iBAAiB,EAAE;QACvC,cAAc,EAAE,aAAa;QAC7B,cAAc,EAAE,MAAM,CAAC,IAAI;QAC3B,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,OAAO;QACtC,cAAc,EAAE,aAAa;KAC9B,EAAE,SAAS,CAAC,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Connector } from "../connectors/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Cap on what the server will write to the output directory when a tool's
|
|
4
|
+
* output exceeds a response budget (UTF-8 bytes). Bounds disk use per
|
|
5
|
+
* oversized run; larger output is left to the agent's own redirect recipe.
|
|
6
|
+
*/
|
|
7
|
+
export declare const MAX_SAVED_OUTPUT_SIZE: number;
|
|
8
|
+
/** A write that has not settled by then is treated as failed (stalled SFTP/docker cp). */
|
|
9
|
+
export declare const DEFAULT_SPILL_TIMEOUT_MS = 30000;
|
|
10
|
+
export type SpillResult = {
|
|
11
|
+
saved: true;
|
|
12
|
+
path: string;
|
|
13
|
+
} | {
|
|
14
|
+
saved: false;
|
|
15
|
+
reason: "no_output_dir" | "bad_name" | "too_large" | "write_failed";
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Save oversized tool output to `<outputDir>/<name>` so the agent can query
|
|
19
|
+
* the part that did not fit in the response (grep, sed -n, download_file)
|
|
20
|
+
* without re-running the tool. Never throws and never hangs: a failed or
|
|
21
|
+
* stalled write degrades to `saved: false` and the caller falls back to a
|
|
22
|
+
* re-run recipe. `name` must be a plain, caller-sanitized filename (tool name
|
|
23
|
+
* plus sanitized sample name, or tool name plus command hash); anything else
|
|
24
|
+
* is refused here as defense in depth.
|
|
25
|
+
*/
|
|
26
|
+
export declare function saveOversizedOutput(connector: Pick<Connector, "writeFile">, outputDir: string | undefined, name: string, text: string, opts?: {
|
|
27
|
+
timeoutMs?: number;
|
|
28
|
+
}): Promise<SpillResult>;
|
|
29
|
+
//# sourceMappingURL=output-spill.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-spill.d.ts","sourceRoot":"","sources":["../../src/handlers/output-spill.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,QAAa,CAAC;AAEhD,0FAA0F;AAC1F,eAAO,MAAM,wBAAwB,QAAS,CAAC;AAK/C,MAAM,MAAM,WAAW,GACnB;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,eAAe,GAAG,UAAU,GAAG,WAAW,GAAG,cAAc,CAAA;CAAE,CAAC;AAE1F;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EACvC,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAChC,OAAO,CAAC,WAAW,CAAC,CAqBtB"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cap on what the server will write to the output directory when a tool's
|
|
3
|
+
* output exceeds a response budget (UTF-8 bytes). Bounds disk use per
|
|
4
|
+
* oversized run; larger output is left to the agent's own redirect recipe.
|
|
5
|
+
*/
|
|
6
|
+
export const MAX_SAVED_OUTPUT_SIZE = 500 * 1024; // 500 KiB
|
|
7
|
+
/** A write that has not settled by then is treated as failed (stalled SFTP/docker cp). */
|
|
8
|
+
export const DEFAULT_SPILL_TIMEOUT_MS = 30_000;
|
|
9
|
+
/** Plain filenames only: no separators, no traversal, no leading dot, no spaces. */
|
|
10
|
+
const SAFE_NAME = /^[A-Za-z0-9_][A-Za-z0-9._-]{0,254}$/;
|
|
11
|
+
/**
|
|
12
|
+
* Save oversized tool output to `<outputDir>/<name>` so the agent can query
|
|
13
|
+
* the part that did not fit in the response (grep, sed -n, download_file)
|
|
14
|
+
* without re-running the tool. Never throws and never hangs: a failed or
|
|
15
|
+
* stalled write degrades to `saved: false` and the caller falls back to a
|
|
16
|
+
* re-run recipe. `name` must be a plain, caller-sanitized filename (tool name
|
|
17
|
+
* plus sanitized sample name, or tool name plus command hash); anything else
|
|
18
|
+
* is refused here as defense in depth.
|
|
19
|
+
*/
|
|
20
|
+
export async function saveOversizedOutput(connector, outputDir, name, text, opts = {}) {
|
|
21
|
+
if (!outputDir)
|
|
22
|
+
return { saved: false, reason: "no_output_dir" };
|
|
23
|
+
if (!SAFE_NAME.test(name) || name === "." || name === "..")
|
|
24
|
+
return { saved: false, reason: "bad_name" };
|
|
25
|
+
const bytes = Buffer.from(text, "utf-8");
|
|
26
|
+
if (bytes.length > MAX_SAVED_OUTPUT_SIZE)
|
|
27
|
+
return { saved: false, reason: "too_large" };
|
|
28
|
+
const path = `${outputDir}/${name}`;
|
|
29
|
+
const timeoutMs = opts.timeoutMs ?? DEFAULT_SPILL_TIMEOUT_MS;
|
|
30
|
+
let timer;
|
|
31
|
+
try {
|
|
32
|
+
await Promise.race([
|
|
33
|
+
connector.writeFile(path, bytes),
|
|
34
|
+
new Promise((_, reject) => {
|
|
35
|
+
timer = setTimeout(() => reject(new Error("spill timed out")), timeoutMs);
|
|
36
|
+
}),
|
|
37
|
+
]);
|
|
38
|
+
return { saved: true, path };
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return { saved: false, reason: "write_failed" };
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
if (timer)
|
|
45
|
+
clearTimeout(timer);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=output-spill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-spill.js","sourceRoot":"","sources":["../../src/handlers/output-spill.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,UAAU;AAE3D,0FAA0F;AAC1F,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC;AAE/C,oFAAoF;AACpF,MAAM,SAAS,GAAG,qCAAqC,CAAC;AAMxD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,SAAuC,EACvC,SAA6B,EAC7B,IAAY,EACZ,IAAY,EACZ,OAA+B,EAAE;IAEjC,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IACjE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IACxG,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACzC,IAAI,KAAK,CAAC,MAAM,GAAG,qBAAqB;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACvF,MAAM,IAAI,GAAG,GAAG,SAAS,IAAI,IAAI,EAAE,CAAC;IACpC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,wBAAwB,CAAC;IAC7D,IAAI,KAAgD,CAAC;IACrD,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,IAAI,CAAC;YACjB,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC;YAChC,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;gBAC/B,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YAC5E,CAAC,CAAC;SACH,CAAC,CAAC;QACH,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IAClD,CAAC;YAAS,CAAC;QACT,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;AACH,CAAC"}
|
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
import type { HandlerDeps } from "./types.js";
|
|
2
2
|
import type { RunToolArgs } from "../schemas/tools.js";
|
|
3
|
+
/**
|
|
4
|
+
* Detect a `head` or `tail` stage that reads from a pipe (any stage after the
|
|
5
|
+
* first; `tail -n 50 file` with no pipe before it is deliberate paging).
|
|
6
|
+
* Excluded: `tail -f/-F/--follow` (streams rather than limits) and
|
|
7
|
+
* `tail -n +1` (returns every line). Such a stage discards producer output the
|
|
8
|
+
* server would otherwise have returned whole, with exit 0 and no other
|
|
9
|
+
* signal — the model-side mirror of server truncation, and an upstream
|
|
10
|
+
* `head -500 | grep` caps the producer just as a terminal one does. Returns
|
|
11
|
+
* the first such stage's text (whitespace-normalized, trailing redirects and
|
|
12
|
+
* operators dropped, length-capped) and which limiter it is, or undefined.
|
|
13
|
+
*/
|
|
14
|
+
export declare function detectPipedLimiter(command: string): {
|
|
15
|
+
limiter: "head" | "tail";
|
|
16
|
+
stage: string;
|
|
17
|
+
} | undefined;
|
|
3
18
|
export declare function handleRunTool(deps: HandlerDeps, args: RunToolArgs): Promise<{
|
|
4
19
|
content: Array<{
|
|
5
20
|
type: "text";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-tool.d.ts","sourceRoot":"","sources":["../../src/handlers/run-tool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"run-tool.d.ts","sourceRoot":"","sources":["../../src/handlers/run-tool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AA6GvD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,GACd;IAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAuBzD;AA4ND,wBAAsB,aAAa,CACjC,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,WAAW;;;;;;GAgNlB"}
|
|
@@ -6,6 +6,8 @@ import { parseToolOutput, hasParser } from "../parsers/index.js";
|
|
|
6
6
|
import { toolRegistry } from "../tools/registry.js";
|
|
7
7
|
import { filterStderrNoise } from "../utils/stderr-filter.js";
|
|
8
8
|
import { OUTPUT_SENTINEL } from "../tools/invoker.js";
|
|
9
|
+
import { createHash } from "crypto";
|
|
10
|
+
import { saveOversizedOutput } from "./output-spill.js";
|
|
9
11
|
const DISCOURAGED_PATTERNS = [
|
|
10
12
|
{
|
|
11
13
|
pattern: /^yara\s/,
|
|
@@ -32,9 +34,218 @@ const ADVISORY_PATTERNS = [
|
|
|
32
34
|
"Other files → also run 'strings -el <file>' for Unicode (little-endian 16-bit).",
|
|
33
35
|
},
|
|
34
36
|
];
|
|
37
|
+
/**
|
|
38
|
+
* Split a shell command on unquoted, unescaped single `|` characters (pipe
|
|
39
|
+
* stages). `||` is a control operator, not a pipe, and `|` inside quotes or
|
|
40
|
+
* after a backslash is literal text, so none of those split. This is not a
|
|
41
|
+
* full shell parser; it only needs to find the pipeline's last stage.
|
|
42
|
+
*/
|
|
43
|
+
function splitPipeline(command) {
|
|
44
|
+
const stages = [];
|
|
45
|
+
let current = "";
|
|
46
|
+
let quote = null;
|
|
47
|
+
for (let i = 0; i < command.length; i++) {
|
|
48
|
+
const ch = command[i];
|
|
49
|
+
if (quote) {
|
|
50
|
+
current += ch;
|
|
51
|
+
if (ch === "\\" && quote === '"' && i + 1 < command.length) {
|
|
52
|
+
current += command[++i];
|
|
53
|
+
}
|
|
54
|
+
else if (ch === quote) {
|
|
55
|
+
quote = null;
|
|
56
|
+
}
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if (ch === "\\" && i + 1 < command.length) {
|
|
60
|
+
current += ch + command[++i];
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (ch === "'" || ch === '"') {
|
|
64
|
+
quote = ch;
|
|
65
|
+
current += ch;
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (ch === "#" && (i === 0 || /\s/.test(command[i - 1]))) {
|
|
69
|
+
break; // the rest of the line is a shell comment
|
|
70
|
+
}
|
|
71
|
+
if (ch === "|") {
|
|
72
|
+
if (command[i + 1] === "|") {
|
|
73
|
+
current += "||";
|
|
74
|
+
i++;
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (command[i + 1] === "&")
|
|
78
|
+
i++; // `|&` pipes stderr too; still a pipe
|
|
79
|
+
stages.push(current);
|
|
80
|
+
current = "";
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
current += ch;
|
|
84
|
+
}
|
|
85
|
+
stages.push(current);
|
|
86
|
+
return stages;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Detect a `head` or `tail` stage that reads from a pipe (any stage after the
|
|
90
|
+
* first; `tail -n 50 file` with no pipe before it is deliberate paging).
|
|
91
|
+
* Excluded: `tail -f/-F/--follow` (streams rather than limits) and
|
|
92
|
+
* `tail -n +1` (returns every line). Such a stage discards producer output the
|
|
93
|
+
* server would otherwise have returned whole, with exit 0 and no other
|
|
94
|
+
* signal — the model-side mirror of server truncation, and an upstream
|
|
95
|
+
* `head -500 | grep` caps the producer just as a terminal one does. Returns
|
|
96
|
+
* the first such stage's text (whitespace-normalized, trailing redirects and
|
|
97
|
+
* operators dropped, length-capped) and which limiter it is, or undefined.
|
|
98
|
+
*/
|
|
99
|
+
export function detectPipedLimiter(command) {
|
|
100
|
+
const stages = splitPipeline(command);
|
|
101
|
+
for (let n = 1; n < stages.length; n++) {
|
|
102
|
+
// Keep only the command word and its arguments: drop anything after a
|
|
103
|
+
// redirect or control operator that follows the limiter.
|
|
104
|
+
const text = stages[n].trim().split(/\s*(?:\d*[<>]|&&|;)/)[0].trim();
|
|
105
|
+
const words = text.split(/\s+/).filter(Boolean);
|
|
106
|
+
if (words.length === 0)
|
|
107
|
+
continue;
|
|
108
|
+
const cmd = words[0].replace(/^.*\//, "");
|
|
109
|
+
if (cmd !== "head" && cmd !== "tail")
|
|
110
|
+
continue;
|
|
111
|
+
if (cmd === "tail") {
|
|
112
|
+
const args = words.slice(1);
|
|
113
|
+
const follows = args.some((w) => w === "--follow" || w.startsWith("--follow=") || /^-[A-Za-z]*[fF][A-Za-z]*$/.test(w));
|
|
114
|
+
if (follows)
|
|
115
|
+
continue;
|
|
116
|
+
// `tail -n +1` / `tail +1` / `--lines=+1` print from line 1: nothing is dropped
|
|
117
|
+
const fromStart = args.some((w, k) => w === "+1" || w === "--lines=+1" || (w === "-n" && args[k + 1] === "+1"));
|
|
118
|
+
if (fromStart)
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
return { limiter: cmd, stage: text.replace(/\s+/g, " ").slice(0, 60) };
|
|
122
|
+
}
|
|
123
|
+
return undefined;
|
|
124
|
+
}
|
|
125
|
+
// Response budgets (JS string length): 100 KiB of stdout, 50 KiB of stderr.
|
|
126
|
+
const STDOUT_CAP_CHARS = 100 * 1024;
|
|
127
|
+
const MAX_STDERR_RESPONSE = 50 * 1024;
|
|
128
|
+
// Parsers run on captured stdout (not just the returned slice) up to this
|
|
129
|
+
// bound, mirroring analyze_file's IOC_SCAN_CAP, so a finding past the response
|
|
130
|
+
// cap is still reported rather than silently lost.
|
|
131
|
+
const PARSE_CAP_CHARS = 512 * 1024;
|
|
132
|
+
// Parsers can emit one finding per line, so the response carries at most this
|
|
133
|
+
// many; findings_total reports the parsed count when capped.
|
|
134
|
+
const MAX_FINDINGS = 500;
|
|
135
|
+
function limiterAdvisory(l) {
|
|
136
|
+
const part = l.limiter === "head" ? "leading" : "trailing";
|
|
137
|
+
return (`PARTIAL: the pipeline stage '${l.stage}' keeps only the ${part} part of its input; anything past that ` +
|
|
138
|
+
`point is discarded with no signal, and a pipeline's exit status is its last stage's, not the producer's. ` +
|
|
139
|
+
`run_tool returns stdout whole up to ${STDOUT_CAP_CHARS.toLocaleString("en-US")} characters and says so when ` +
|
|
140
|
+
`it has to cut, so drop the ${l.limiter} stage, or select by content with grep.`);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Collect every matching command advisory (newline-joined) so a command like
|
|
144
|
+
* `strings x | head` carries both the INCOMPLETE and the PARTIAL guidance.
|
|
145
|
+
*/
|
|
35
146
|
function getCommandAdvisory(command) {
|
|
36
|
-
const
|
|
37
|
-
|
|
147
|
+
const advisories = ADVISORY_PATTERNS.filter((p) => p.match(command)).map((p) => p.advisory);
|
|
148
|
+
const limiter = detectPipedLimiter(command);
|
|
149
|
+
if (limiter)
|
|
150
|
+
advisories.push(limiterAdvisory(limiter));
|
|
151
|
+
return advisories.length > 0 ? advisories.join("\n") : undefined;
|
|
152
|
+
}
|
|
153
|
+
/** Count lines the way `wc -l` would, plus one for a final unterminated line. */
|
|
154
|
+
function countLines(text) {
|
|
155
|
+
if (text.length === 0)
|
|
156
|
+
return 0;
|
|
157
|
+
let n = 0;
|
|
158
|
+
for (let i = 0; i < text.length; i++)
|
|
159
|
+
if (text.charCodeAt(i) === 10)
|
|
160
|
+
n++;
|
|
161
|
+
return text.endsWith("\n") ? n : n + 1;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Deterministic, sanitized filename for the redirect-to-file recovery recipe:
|
|
165
|
+
* derived only from the registry tool name (or the sanitized command word) and
|
|
166
|
+
* a hash of the full command, so re-running the same command maps to the same
|
|
167
|
+
* file and no untrusted text reaches the filename.
|
|
168
|
+
*/
|
|
169
|
+
function suggestedOutputFilename(fullCommand, toolName) {
|
|
170
|
+
const firstWord = fullCommand.trim().split(/\s/)[0]?.replace(/^.*\//, "") ?? "";
|
|
171
|
+
const base = (toolName ?? firstWord).replace(/[^A-Za-z0-9._-]/g, "_").slice(0, 32) || "cmd";
|
|
172
|
+
const hash = createHash("sha256").update(fullCommand).digest("hex").slice(0, 12);
|
|
173
|
+
return `run_tool-${base}-${hash}.stdout.txt`;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Per-stream truncation notice. Names the omitted line range with
|
|
177
|
+
* server-computed integers and gives a recovery recipe that can actually reach
|
|
178
|
+
* the tail; `head` is never offered as a remedy (it returns another prefix).
|
|
179
|
+
*/
|
|
180
|
+
function buildTruncationNotice(args) {
|
|
181
|
+
const parts = [];
|
|
182
|
+
const fmt = (n) => String(n); // raw integers: copy-safe into sed ranges
|
|
183
|
+
const cap = STDOUT_CAP_CHARS.toLocaleString("en-US");
|
|
184
|
+
// Quoted so an output directory with spaces still resolves (substitution is textual).
|
|
185
|
+
const outPath = `'${OUTPUT_SENTINEL}${args.outFile}'`;
|
|
186
|
+
const errPath = `'${OUTPUT_SENTINEL}${args.outFile.replace(/\.stdout\.txt$/, ".stderr.txt")}'`;
|
|
187
|
+
if (args.stdoutTruncated && args.stdoutReturnedLines === 0) {
|
|
188
|
+
// Not even one complete line fits: line ranges cannot help, so offer
|
|
189
|
+
// content and chunking recipes instead. (`cut -c` slices per line, not
|
|
190
|
+
// the stream, so it is not offered.)
|
|
191
|
+
parts.push(`stdout: ${fmt(args.stdoutCapturedLines)} line(s) captured (${fmt(args.stdoutCapturedLength)} characters); ` +
|
|
192
|
+
`the first line alone fills the ${cap}-character limit, so line ranges cannot help. Narrow by content ` +
|
|
193
|
+
`(e.g. \`<command> | grep -oE '<pattern>'\`) or chunk it: ` +
|
|
194
|
+
(args.savedFile
|
|
195
|
+
? `the captured stdout is saved as ${outPath}; run_tool \`fold -w 1000 ${outPath} | sed -n '103,$p'\` ` +
|
|
196
|
+
`(chunks of 1000 characters from character 102001 to the end; repeat with a later start if still cut). `
|
|
197
|
+
: args.outputDirSet
|
|
198
|
+
? `re-run with \` > ${outPath}\` appended, then \`fold -w 1000 ${outPath} | sed -n '103,$p'\` ` +
|
|
199
|
+
`(chunks of 1000 characters from character 102001 to the end; repeat with a later start if still cut). `
|
|
200
|
+
: `\`<command> | fold -w 1000 | sed -n '103,$p'\` (chunks of 1000 characters from character 102001; ` +
|
|
201
|
+
`repeat with a later start if still cut). `) +
|
|
202
|
+
"'head' returns another prefix and cannot recover the omitted part.");
|
|
203
|
+
}
|
|
204
|
+
else if (args.stdoutTruncated) {
|
|
205
|
+
const from = args.stdoutReturnedLines + 1;
|
|
206
|
+
// Open-ended range: the line count describes captured stdout, which the
|
|
207
|
+
// connector trims and caps (10 MiB), so a fixed end could miss the tail.
|
|
208
|
+
const range = `${from},$p`;
|
|
209
|
+
let msg = `stdout: ${fmt(args.stdoutCapturedLines)} lines captured (${fmt(args.stdoutCapturedLength)} characters); ` +
|
|
210
|
+
`lines 1-${fmt(args.stdoutReturnedLines)} returned in full, the rest omitted (the cut can fall mid-line, ` +
|
|
211
|
+
`so the range below re-reads the cut line whole). `;
|
|
212
|
+
if (args.savedFile) {
|
|
213
|
+
msg +=
|
|
214
|
+
`The captured stdout is saved as ${outPath} (the server resolves %OUTPUT% to the output directory): ` +
|
|
215
|
+
`read the omitted part with run_tool \`sed -n '${range}' ${outPath}\`, grep that file for specifics, ` +
|
|
216
|
+
`or fetch it with download_file '${args.outFile}'. `;
|
|
217
|
+
}
|
|
218
|
+
else if (args.outputDirSet) {
|
|
219
|
+
msg +=
|
|
220
|
+
`To read the omitted part: re-run the same command with \` > ${outPath}\` appended ` +
|
|
221
|
+
`(the server resolves %OUTPUT% to the output directory), then run_tool \`sed -n '${range}' ${outPath}\` ` +
|
|
222
|
+
`(grep that file for specifics; download_file fetches '${args.outFile}'). If re-running is cheap, ` +
|
|
223
|
+
`\`<command> | sed -n '${range}'\` does it in one call. `;
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
msg +=
|
|
227
|
+
`To read the omitted part, re-run as \`<command> | sed -n '${range}'\` (repeat with a later start if that ` +
|
|
228
|
+
`is still over the limit), or narrow by content with grep. `;
|
|
229
|
+
}
|
|
230
|
+
msg += "'head' returns another prefix and cannot recover the omitted tail.";
|
|
231
|
+
parts.push(msg);
|
|
232
|
+
}
|
|
233
|
+
if (args.stderrTruncated) {
|
|
234
|
+
let msg = `stderr: ${fmt(args.stderrCapturedLength)} characters captured (after noise filtering), the first ` +
|
|
235
|
+
`${fmt(MAX_STDERR_RESPONSE)} returned` +
|
|
236
|
+
(args.stdoutTruncated ? ". " : "; stdout is complete. ");
|
|
237
|
+
if (args.outputDirSet) {
|
|
238
|
+
msg +=
|
|
239
|
+
`To keep all of stderr, re-run as \`( <command> ) 2> ${errPath}\` (the parentheses matter for a pipeline: ` +
|
|
240
|
+
`a bare 2> covers only its last stage; use \`( <command> ) > ${outPath} 2>&1\` for both streams) and ` +
|
|
241
|
+
`query that file with grep or sed -n.`;
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
msg += "To see more of it, re-run as `( <command> ) 2>&1 | grep -i error` or with a similar filter.";
|
|
245
|
+
}
|
|
246
|
+
parts.push(msg);
|
|
247
|
+
}
|
|
248
|
+
return parts.join("\n");
|
|
38
249
|
}
|
|
39
250
|
// An actual js_unshroud capture invocation: the executable (wrapper, full or
|
|
40
251
|
// quoted path, or raw js_unshroud-linux-x64 binary) followed by the `run`
|
|
@@ -142,8 +353,7 @@ export async function handleRunTool(deps, args) {
|
|
|
142
353
|
}, startTime);
|
|
143
354
|
}
|
|
144
355
|
}
|
|
145
|
-
const MAX_STDOUT_RESPONSE =
|
|
146
|
-
const MAX_STDERR_RESPONSE = 50 * 1024;
|
|
356
|
+
const MAX_STDOUT_RESPONSE = STDOUT_CAP_CHARS; // 100KB — fits in LLM context
|
|
147
357
|
try {
|
|
148
358
|
const execOptions = {
|
|
149
359
|
timeout: (args.timeout || config.timeout) * 1000,
|
|
@@ -156,27 +366,67 @@ export async function handleRunTool(deps, args) {
|
|
|
156
366
|
let stdout = result.stdout || "";
|
|
157
367
|
let stderr = result.stderr || "";
|
|
158
368
|
stderr = filterStderrNoise(stderr);
|
|
159
|
-
let truncated = false;
|
|
160
369
|
const fullStdoutLength = stdout.length;
|
|
161
|
-
|
|
370
|
+
const stderrCapturedLength = stderr.length; // after noise filtering
|
|
371
|
+
const stdoutTruncated = stdout.length > MAX_STDOUT_RESPONSE;
|
|
372
|
+
const stderrTruncated = stderr.length > MAX_STDERR_RESPONSE;
|
|
373
|
+
const truncated = stdoutTruncated || stderrTruncated;
|
|
374
|
+
// Line accounting only on the (rare) truncated path; the returned stdout
|
|
375
|
+
// stays an exact slice with nothing appended, so a forged marker inside
|
|
376
|
+
// the sample's output cannot masquerade as server metadata.
|
|
377
|
+
let stdoutCapturedLines = 0;
|
|
378
|
+
let stdoutReturnedLines = 0;
|
|
379
|
+
if (stdoutTruncated) {
|
|
380
|
+
stdoutCapturedLines = countLines(stdout);
|
|
162
381
|
stdout = stdout.slice(0, MAX_STDOUT_RESPONSE);
|
|
163
|
-
|
|
382
|
+
// complete lines inside the slice; a trailing partial line is re-read by the recipe
|
|
383
|
+
for (let i = 0; i < stdout.length; i++)
|
|
384
|
+
if (stdout.charCodeAt(i) === 10)
|
|
385
|
+
stdoutReturnedLines++;
|
|
164
386
|
}
|
|
165
|
-
if (
|
|
387
|
+
if (stderrTruncated) {
|
|
166
388
|
stderr = stderr.slice(0, MAX_STDERR_RESPONSE);
|
|
167
|
-
truncated = true;
|
|
168
389
|
}
|
|
169
|
-
// Auto-parse output if command matches a known tool with a parser
|
|
390
|
+
// Auto-parse output if command matches a known tool with a parser. Parse
|
|
391
|
+
// the CAPTURED stdout (bounded), not just the returned slice, so a finding
|
|
392
|
+
// past the response cap is still reported; findings_scope says which.
|
|
170
393
|
let findings;
|
|
394
|
+
let findingsTotal;
|
|
171
395
|
let parsedMetadata;
|
|
396
|
+
let findingsScope;
|
|
172
397
|
const toolName = detectToolName(fullCommand);
|
|
173
|
-
|
|
174
|
-
|
|
398
|
+
const capturedStdout = result.stdout || "";
|
|
399
|
+
if (toolName && hasParser(toolName) && capturedStdout) {
|
|
400
|
+
const parseInput = stdoutTruncated ? capturedStdout.slice(0, PARSE_CAP_CHARS) : stdout;
|
|
401
|
+
const parsed = parseToolOutput(toolName, parseInput);
|
|
175
402
|
if (parsed.parsed) {
|
|
176
403
|
findings = parsed.findings;
|
|
177
404
|
parsedMetadata = parsed.metadata;
|
|
405
|
+
if (findings.length > MAX_FINDINGS) {
|
|
406
|
+
findingsTotal = findings.length;
|
|
407
|
+
findings = findings.slice(0, MAX_FINDINGS);
|
|
408
|
+
}
|
|
409
|
+
// The agent's own head/tail limited the producer: that loss is
|
|
410
|
+
// upstream of anything the server captured, so it takes precedence.
|
|
411
|
+
if (detectPipedLimiter(fullCommand)) {
|
|
412
|
+
findingsScope = "pipeline_limited";
|
|
413
|
+
}
|
|
414
|
+
else if (stdoutTruncated) {
|
|
415
|
+
findingsScope = capturedStdout.length > PARSE_CAP_CHARS ? "captured_prefix" : "captured_stdout";
|
|
416
|
+
}
|
|
178
417
|
}
|
|
179
418
|
}
|
|
419
|
+
// Spill the captured stdout to the output directory (bounded, hash-named,
|
|
420
|
+
// idempotent per command) so the omitted tail can be read without
|
|
421
|
+
// re-running the tool. Non-fatal: on failure the notice carries the
|
|
422
|
+
// re-run recipe instead.
|
|
423
|
+
const outFile = suggestedOutputFilename(fullCommand, toolName);
|
|
424
|
+
let stdoutSavedFile;
|
|
425
|
+
if (stdoutTruncated) {
|
|
426
|
+
const spill = await saveOversizedOutput(connector, config.outputDir, outFile, capturedStdout);
|
|
427
|
+
if (spill.saved)
|
|
428
|
+
stdoutSavedFile = outFile;
|
|
429
|
+
}
|
|
180
430
|
// Check for advisory (non-blocking guidance)
|
|
181
431
|
const advisory = getCommandAdvisory(fullCommand);
|
|
182
432
|
// Output-conditioned advisory (tools that exit 0 on failure); scans the
|
|
@@ -194,10 +444,31 @@ export async function handleRunTool(deps, args) {
|
|
|
194
444
|
exit_code: result.exitCode,
|
|
195
445
|
truncated,
|
|
196
446
|
...(truncated && {
|
|
197
|
-
truncation_notice:
|
|
198
|
-
|
|
447
|
+
truncation_notice: buildTruncationNotice({
|
|
448
|
+
stdoutTruncated,
|
|
449
|
+
stderrTruncated,
|
|
450
|
+
stdoutCapturedLength: fullStdoutLength,
|
|
451
|
+
stdoutCapturedLines,
|
|
452
|
+
stdoutReturnedLines,
|
|
453
|
+
stderrCapturedLength,
|
|
454
|
+
outputDirSet: Boolean(config.outputDir),
|
|
455
|
+
outFile,
|
|
456
|
+
savedFile: Boolean(stdoutSavedFile),
|
|
457
|
+
}),
|
|
458
|
+
full_stdout_length: fullStdoutLength, // legacy alias of stdout_captured_length
|
|
459
|
+
stdout_truncated: stdoutTruncated,
|
|
460
|
+
stderr_truncated: stderrTruncated,
|
|
461
|
+
stdout_captured_length: fullStdoutLength,
|
|
462
|
+
stderr_captured_length: stderrCapturedLength,
|
|
463
|
+
...(stdoutTruncated && {
|
|
464
|
+
stdout_captured_lines: stdoutCapturedLines,
|
|
465
|
+
stdout_returned_lines: stdoutReturnedLines,
|
|
466
|
+
}),
|
|
467
|
+
...(stdoutSavedFile && { stdout_saved_file: stdoutSavedFile }),
|
|
199
468
|
}),
|
|
200
469
|
...(findings && { findings, parsed_metadata: parsedMetadata }),
|
|
470
|
+
...(findingsTotal !== undefined && { findings_total: findingsTotal }),
|
|
471
|
+
...(findings && findingsScope && { findings_scope: findingsScope }),
|
|
201
472
|
...(advisory && { advisory }),
|
|
202
473
|
...(outputAdvisory && { output_advisory: outputAdvisory }),
|
|
203
474
|
}, startTime);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-tool.js","sourceRoot":"","sources":["../../src/handlers/run-tool.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"run-tool.js","sourceRoot":"","sources":["../../src/handlers/run-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"suggest-tools.d.ts","sourceRoot":"","sources":["../../src/handlers/suggest-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"suggest-tools.d.ts","sourceRoot":"","sources":["../../src/handlers/suggest-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAoR5D,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,gBAAgB;;;;;;GAiJvB"}
|
|
@@ -144,6 +144,16 @@ const BASE_HINTS = {
|
|
|
144
144
|
"Look for resolved API names, network connections, file system access, and registry modifications in emulation output. " +
|
|
145
145
|
"For deep analysis, qltool (Qiling) provides multi-platform emulation and tracesc traces execution via Wine. " +
|
|
146
146
|
"Use strings and xorsearch for static indicators before emulation.",
|
|
147
|
+
ETL: "Windows Event Trace Log (ETL) detected. Start with etl2xml to convert the trace to XML, " +
|
|
148
|
+
"then inspect the events. This build decodes AMSI traces: search the XML for AmsiScript " +
|
|
149
|
+
"(TraceLogging captures) or Microsoft_Antimalware_Scan_Interface (manifest/logman captures) " +
|
|
150
|
+
"to recover the script content the antimalware engine scanned — an empty result means the " +
|
|
151
|
+
"trace holds no AMSI events, not that it is clean. etl2pcap extracts network packets when " +
|
|
152
|
+
"the trace contains Microsoft-Windows-NDIS-PacketCapture events (a 24-byte header-only pcap " +
|
|
153
|
+
"means none were present); to continue with the network toolchain, run tshark or capinfos " +
|
|
154
|
+
"on it directly via run_tool (e.g. run_tool command='capinfos %OUTPUT%/etl2pcap.pcap'), or " +
|
|
155
|
+
"copy it into the samples directory to use analyze_file. Note that `file` misidentifies some ETL variants " +
|
|
156
|
+
"(e.g. as an Apple HFS resource fork) — the .etl extension is the reliable signal.",
|
|
147
157
|
Memory: "Memory image detected. Start with vol3-info to identify OS and kernel version. " +
|
|
148
158
|
"vol3-pslist and vol3-pstree reveal running processes. " +
|
|
149
159
|
"vol3-netscan shows network connections. vol3-psscan finds hidden/unlinked processes. " +
|