@remnux/mcp-server 0.1.75 → 0.1.76
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 +3 -3
- package/data/tools-index.json +8 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -293,8 +293,8 @@ claude mcp add remnux --transport http http://REMNUX_IP:3000/mcp \
|
|
|
293
293
|
| `findings` | The tool's parser resolved at least one finding |
|
|
294
294
|
| `clean` | The tool's parser read the output and resolved nothing. A benign verdict needs other evidence |
|
|
295
295
|
| `not_assessed` | No parser reads this tool's output, so the server did not interpret it. Its `key_lines` are raw excerpts |
|
|
296
|
-
| `error` | The tool exited non-zero
|
|
297
|
-
| `timeout` | The tool exited
|
|
296
|
+
| `error` | The tool exited with a failure code (for most tools, any non-zero exit), reported its own failure (`tool_reported_error`), or its parser could not read the output (`parse_failed`) |
|
|
297
|
+
| `timeout` | The tool exited with a failure code and its output mentions a timeout |
|
|
298
298
|
|
|
299
299
|
*Compatibility note:* `not_assessed` is new. Tools without a parser used to report `clean`. A client that switches exhaustively over the status values needs a branch for it.
|
|
300
300
|
|
|
@@ -360,7 +360,7 @@ All three connection modes (docker, ssh, local) execute commands inside a dispos
|
|
|
360
360
|
|
|
361
361
|
**Where `upload_from_host` reads from, and why it matters.** The relevant boundary is **connector mode (`local` vs `docker`/`ssh`), not transport**. In `local` mode (including HTTP transport with the local connector), the AI already has shell-level read on the REMnux box by design: `run_tool` executes arbitrary commands there, so `upload_from_host` reading a file outside the samples directory adds nothing beyond what the model already grants. In `docker`/`ssh` mode, `upload_from_host` is the one tool that reads from the machine where the server runs, the analyst's workstation, via `docker cp` or SFTP. That read happens outside the container/VM isolation that bounds everything else, so a prompt-injected client could stage a host file such as `~/.ssh/id_rsa` or `~/.aws/credentials` into REMnux. Enable `--sandbox` with `--ingest-root=<host staging dir>` to confine that read. In docker/ssh mode, `--ingest-root` is required when `--sandbox` is set, because the samples directory lives inside REMnux rather than on the host.
|
|
362
362
|
|
|
363
|
-
**The server process is part of the trusted computing base.** Container/VM isolation is the boundary, and in docker/ssh mode this server is the control plane that mediates it: it runs on the analyst's workstation, outside that isolation, and it handles paths and filenames that originate inside REMnux. So the code that invokes `docker` is itself security-relevant, independent of anything the container can or cannot do. Every host-side `docker` call is therefore executed as an argument vector (`execFileSync`, no shell), which is what keeps a filename a filename.
|
|
363
|
+
**The server process is part of the trusted computing base.** Container/VM isolation is the boundary, and in docker/ssh mode this server is the control plane that mediates it: it runs on the analyst's workstation, outside that isolation, and it handles paths and filenames that originate inside REMnux. So the code that invokes `docker` is itself security-relevant, independent of anything the container can or cannot do. Every host-side `docker` call is therefore executed as an argument vector (`execFileSync`, no shell), which is what keeps a filename a filename. Before version 0.1.73, the server built its `docker cp` file-transfer calls as shell command strings. POSIX single-quote escaping is inert under `cmd.exe`, so on a Windows workstation a crafted filename reached by `download_file` became host command execution. The mitigation is removing the shell, not escaping better. Escaping is shell-specific and was silently wrong on one platform, and a filter strict enough to be safe under `cmd.exe` would have to reject characters that are legal in filenames analysts really encounter (`%VAR%` alone is expanded before metacharacters are parsed). Argument-vector execution makes the question moot: a filename stays a filename.
|
|
364
364
|
|
|
365
365
|
**Other considerations:** A theoretical TOCTOU race exists between path validation and tool execution; container isolation is the primary mitigation (use immutable sample storage for high-security contexts). The `upload_from_host` confinement closes its own check-vs-read race by reading the realpath it validated. Tool description poisoning is mitigated by using build-time constants rather than runtime lookups from external sources.
|
|
366
366
|
|
package/data/tools-index.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": "1.0.0",
|
|
3
|
-
"updated": "2026-
|
|
3
|
+
"updated": "2026-10-07",
|
|
4
4
|
"tools": [
|
|
5
5
|
{
|
|
6
6
|
"command": "1768",
|
|
@@ -30,6 +30,13 @@
|
|
|
30
30
|
"description": "Find 128-bit and 256-bit AES keys in a memory image.",
|
|
31
31
|
"website": "https://citp.princeton.edu/our-work/memory/"
|
|
32
32
|
},
|
|
33
|
+
{
|
|
34
|
+
"command": "aidebug",
|
|
35
|
+
"name": "AIDebug",
|
|
36
|
+
"category": "Statically Analyze Code: General",
|
|
37
|
+
"description": "AI-assisted malware reverse-engineering debugger with ATT&CK, YARA, IOC, JSON, and analyst report output.",
|
|
38
|
+
"website": "https://github.com/anpa1200/AIDebug"
|
|
39
|
+
},
|
|
33
40
|
{
|
|
34
41
|
"command": "androguard",
|
|
35
42
|
"name": "androguard",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@remnux/mcp-server",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.76",
|
|
4
4
|
"packageManager": "pnpm@10.33.0",
|
|
5
5
|
"description": "MCP server for using the REMnux malware analysis toolkit via AI assistants",
|
|
6
6
|
"type": "module",
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
"node": ">=20.0.0"
|
|
53
53
|
},
|
|
54
54
|
"dependencies": {
|
|
55
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
55
|
+
"@modelcontextprotocol/sdk": "^1.31.0",
|
|
56
56
|
"dockerode": "^5.0.1",
|
|
57
57
|
"ioc-extractor": "^8.2.0",
|
|
58
58
|
"ssh2": "^1.15.0",
|