T03 · Remote Payload Retrieval and Execution
- Location
README.md:36- Finding
Mutable Remote Python Payload Is Downloaded Without Integrity Verification
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The core benchmark script is limited, but the package tells users to run unpinned remote code and includes a verifier that can execute candidate project code during checks.
Before installing, prefer the bundled skill_benchmark.py over the curl command, or only use a pinned release with a verified hash. Do not run ci/verify_product.py on untrusted skill folders on a normal workstation or credentialed CI runner; if dynamic tests are needed, run them in a disposable, secret-free sandbox with restricted filesystem and network access.
README.md:36Mutable Remote Python Payload Is Downloaded Without Integrity Verification
ci/verify_product.py:34Product Verification Harness Executes Python Files from Untrusted Target Folders
ci/ci_check.py:14CI Checker Silently Skips Validation Because It Resolves the Package Root Incorrectly
The script advertises a security check for hardcoded secrets, but it also executes untrusted product code as part of self-test verification. In CI/security tooling context, this contradiction is dangerous because a malicious repository can pass superficial checks while using the verifier itself as an execution path to steal CI secrets or tamper with results.
This code executes an arbitrary product Python file as a subprocess to probe for a self-test mode. Because fp points to untrusted repository content being verified, any top-level code or hostile self-test implementation will run with the CI runner's privileges, turning verification into code execution.
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 executes every discovered test_*.py or *_test.py file directly from the untrusted product directory. Any attacker can place malicious code in a test file and gain code execution in CI or on a developer machine during verification, potentially exfiltrating secrets or modifying 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 FAQ states "Offline? A: Yes," which communicates an offline-oriented intent for the tool. However, the installation section instructs users to download the script via curl from GitHub, which contradicts that claim in the documentation context, even if the runtime tool itself may operate locally afterward.
No suspicious patterns detected.