T03 · Remote Payload Retrieval and Execution
- Location
SKILL.md:31- Finding
Mutable Remote Python Payload Downloaded Without Integrity Verification
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This is a coherent web research CLI, but its install and URL-fetching behavior are broader than users should accept without review.
Review before installing. Prefer running the bundled web_research.py instead of the curl command, avoid passing secrets or internal URLs, restrict use to trusted http/https targets, and run it in a low-privilege environment if used by an agent or CI job.
SKILL.md:31Mutable Remote Python Payload Downloaded Without Integrity Verification
web_research.py:32Unrestricted URL Fetching Enables Local-File Disclosure and SSRF
The skill claims citation export but the finding indicates that feature is absent while local file-writing via an output flag exists without declared permissions. Undocumented file writes are risky in agent environments because they can overwrite local files, persist untrusted fetched content, or be chained with other tooling despite users expecting read-only research behavior.
The skill claims citation export but the finding indicates that feature is absent while local file-writing via an output flag exists without declared permissions. Undocumented file writes are risky in agent environments because they can overwrite local files, persist untrusted fetched content, or be chained with other tooling despite users expecting read-only research behavior.
The skill claims citation export but the finding indicates that feature is absent while local file-writing via an output flag exists without declared permissions. Undocumented file writes are risky in agent environments because they can overwrite local files, persist untrusted fetched content, or be chained with other tooling despite users expecting read-only research behavior.
The README explicitly promotes live web search, Wikipedia lookups, and raw URL fetching, but it does not disclose that user queries and supplied URLs will be transmitted to third-party services and remote hosts. In an agent or CI context, this can cause unintentional disclosure of sensitive prompts, internal URLs, tokens embedded in URLs, or reconnaissance targets, especially when operators assume the tool is a local-only research helper.
The skill advertises no explicit tool scope or permissions, yet the associated capability set includes file access, network access, and shell execution. In an agent setting, missing scope declarations can cause users or orchestrators to grant broader access than expected, increasing the chance of unsafe file writes, command execution, or outbound requests without informed consent.
This helper executes arbitrary Python files found in the target product folder by invoking them with a self-test argument. In a CI verification harness, that means untrusted repository code can run during validation, enabling remote code execution on the CI runner or analyst machine if a submitted skill includes a malicious script that returns success and prints PASS.
def has_self_test(fp):
r = subprocess.run([sys.executable, fp, "self-test"], capture_output=True, text=True, timeout=30)
return r.returncode == 0 and "PASS" in r.stdout
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
all_ok &= axis(False, "frontmatter (no SKILL.md)")
all_ok &= axis(False, "docs (no SKILL.md)")
# 3 compiles
comp_ok = all(subprocess.run([sys.executable, "-m", "py_compile", fp],
capture_output=True).returncode == 0 for fp in files)
all_ok &= axis(comp_ok, "compiles (py_compile all .py)")
# 4 self-test (any of 3 valid forms)
This path executes any test_*.py or *_test.py file present in the analyzed folder. Since those files come from the untrusted skill under review, a malicious contributor can place arbitrary code in a test file and have it executed automatically during verification, exposing CI secrets, modifying the workspace, or pivoting further into the environment.
tests = [os.path.join(folder, f) for f in os.listdir(folder)
if (f.startswith("test_") or f.endswith("_test.py")) and f.endswith(".py")]
if tests:
st_ok = all(subprocess.run([sys.executable, t], capture_output=True, text=True,
timeout=30).returncode == 0 for t in tests)
st_note = f"{len(tests)} test_*.py"
elif re.search(r"(?im)^test\s*:", skill_txt):
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
# 7 deploy-ready
ci = os.path.join(os.path.dirname(os.path.abspath(__file__)), "ci_check.py")
if os.path.isfile(ci) and os.path.isfile(skill):
r = subprocess.run([sys.executable, ci], cwd=folder, capture_output=True, text=True)
all_ok &= axis(r.returncode == 0, "deploy-ready (ci/ci_check.py PASS)")
else:
all_ok &= axis(True, "deploy-ready (skipped)")
The search, wiki, and fetch paths send user-provided search terms or URLs to DuckDuckGo, Wikipedia, or arbitrary remote hosts over the network. While network access is core to the tool's purpose, the file does not clearly disclose that user inputs will be transmitted to third-party services, which is a relevant privacy warning for a research utility.
This code performs a file write when --output is provided, but there is no confirmation prompt or cautionary warning about overwriting or modifying local files. Although the module docstring documents the option, it does not warn the user that invoking fetch --output will persist remote content to disk.
The skill supports live URL fetching but does not prominently warn users that it makes outbound network requests to external sites. In agent or CI contexts, this can lead to unintentional data exposure through request metadata, unexpected contact with third-party services, or execution in environments where network access should be tightly controlled.
The code always queries en.wikipedia.org, forcing English-language results regardless of user preference or locale. This is a natural-language policy concern because the skill imposes a specific language without opt-in or a documented justification.
No suspicious patterns detected.