ramparts 0.8.1 to 0.8.10 skill scanner skips nested .pyc files, passing skill bundles with import-time code (CVE-2026-120202); no fix
TL;DR
ramparts, the open-source scanner for MCP servers and agent skill bundles, passes a skill whose scripts/<subdir>/__pycache__/ holds a .pyc file, because its bundle walk skips nested directories and compiled Python; CPython then runs that bytecode when the skill runs (CVE-2026-120202, VulnCheck, 2026-10-31). No fix exists: the reporter's issue is open with no maintainer reply and crates.io's newest release is still 0.8.10 (2026-10-01). A clean ramparts result does not cover compiled Python, so reject or hand-inspect any skill bundle that ships a .pyc.
What happened
ramparts describes itself as an "MCP & SKILL scanner that scans any mcp server or skills for indirect attack vectors", aligned with the OWASP MCP Top 10 and SKILL Top 10, using YARA rules and LLM analysis; the repository had 98 stars when read on 2026-11-01. A skill, in the Claude Code and OpenClaw sense, is a directory the agent loads by name, and its scripts/ tree is code the agent will execute.
- 2026-10-30. GitHub issue #154 on
highflame-ai/ramparts, "Security:.pycbytecode substitution bypass (scan passes a skill with import-time code execution)", opened by nedlir. The author writes that "ramparts' skill scan can be deterministically bypassed": a skill with a.pycin a__pycache__directory scans to zero findings because the sibling-script walk never reaches it; tested on 0.8.2; described as architectural. As of 2026-11-01 the issue is open, has no comments, no assignee, no label and no linked branch or pull request. - 2026-10-31, 17:25 UTC. VulnCheck, as CNA, publishes CVE-2026-120202, "Highflame ramparts 0.8.1 through 0.8.10 Skill Bundle Scan Bypass via Nested .pyc". The record says the scanner "allows attackers to hide malicious payloads because collect_bundle_siblings and walk_bundle_subdir skip nested directories and .pyc files", and that a distributor can place "an unchecked-hash .pyc under scripts/
/pycache/ that ramparts silently ignores, while CPython executes it when the skill runs." Affected: pkg:cargo/ramparts0.8.1 through 0.8.10 inclusive; the record references issue #154,src/skills.rsline 898 at v0.8.10, the repository and VulnCheck's advisory page. Scores: CVSS 4.0 7.1 (AV:N/AC:L/AT:N/PR:N/UI:P/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N) and CVSS 3.1 6.5 (AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:H/A:N), both VulnCheck's. The GitHub Advisory Database lists it as GHSA-6cmq-892m-x8wh, High, 2026-10-31. - Registry. crates.io shows
ramparts0.8.1 (2026-05-22), 0.8.2 (06-12), 0.8.7 (08-21), 0.8.8 (08-31) and 0.8.10 (2026-10-01) as the newest; no release after the report.
What the scores measure: the scanner's integrity (VI:H), not code execution on a host. The execution comes from the skill the scanner approved, which is why this file rates it high: the tool's one job is to say whether a bundle is safe to load, and for this shape its answer is wrong in a way the reader cannot see. The researcher's issue and the CNA record are the two sources; the vendor has not spoken.
Am I affected?
- You run ramparts 0.8.1 to 0.8.10 (
ramparts --version, orcargo install --list) and have used its skill scan as a gate for installing or publishing skills. - For every skill bundle you accepted on a clean scan, look for compiled Python:
find <skill-dir> -name '*.pyc' -o -name '__pycache__' -type d
A .pyc with no matching .py beside it, or one in a __pycache__ under scripts/<subdir>/, is code the scan did not read. A __pycache__ that Python created on your own machine after you ran the skill is expected; one that arrived inside the bundle is not.
- MCP server scans are not named in the record; the finding is about the skill-bundle walk.
If you are affected
- Treat a skill bundle that shipped a
.pycas unreviewed code. Remove it, or read the bytecode's source if the author provides it, before the agent loads it again. - If such a skill has already run, follow if your local AI agent was exploited: review what the agent's process could reach and rotate the credentials in that environment.
- Watch issue #154 and the crates.io page for a release after 0.8.10; until then do not rely on ramparts alone for skill review.
Prevention
- Strip
__pycache__directories and reject.pycfiles in any skill or plugin bundle before scanning, so every scanner sees source. See package vetting checklist and MCP hygiene. - Run skills in a sandbox that limits what import-time code can reach. See agent sandboxing.
Sources
- highflame-ai/ramparts — issue #154: Security: .pyc bytecode substitution bypass (scan passes a skill with import-time code execution) — fetched 2026-11-01: opened 2026-10-30 by nedlir, open, no comments or linked work, the "deterministically bypassed" and
__pycache__statements, tested on v0.8.2. - CVE Services — CVE-2026-120202 — queried 2026-11-01: VulnCheck CNA, published 2026-10-31 17:25 UTC, the title and description quoted above,
pkg:cargo/ramparts0.8.1 through 0.8.10, both CVSS metrics, the references. - GitHub Advisory Database — ramparts query — fetched 2026-11-01: one row, GHSA-6cmq-892m-x8wh, High, 2026-10-31, listed with CVE-2026-120202.
- highflame-ai/ramparts — fetched 2026-11-01: the description quoted above, 98 stars, README on scanning MCP servers and skill files with YARA, LLM analysis and OWASP tagging; no releases listed on the page as read.
- crates.io — ramparts — queried 2026-11-01:
max_version0.8.10, updated 2026-10-01, the release dates above.