Back to skill

Security audit

vet-translator

Security checks for vulnerabilities and agentic risk

Overview

The skill is not malicious, but its veterinary lab interpreter can misread units and invalid numbers while claiming it checks them, so it should be reviewed before installation.

Review before installing if you expect reliable veterinary lab interpretation. Treat outputs as educational only, verify every unit and reference range against the actual lab report, and confirm CKD staging or abnormal results with a veterinarian. The publisher should add unit parsing, finite-value checks, plausible bounds, and remove the unsupported unit-mismatch claim until implemented.

Vulnerability Patterns
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/vet_translator.py:243
Finding

Unvalidated Units and Numeric Values Can Produce Incorrect Veterinary Lab Interpretations

Content
View full analysis
cut else "non-proteinuric")) if bp is not None: if bp < 140: sub = "normotensive" elif bp < 160: sub = "borderline hypertensive" elif bp < 180: sub = "hypertensive" else: sub = "severe hypertensive" substages.append(("blood pressure", sub)) return {"stage": stage, "substages": substages} ``` ```python c = sub.add_parser("ckd", help="IRIS CKD staging") c.add_argument("--species", required=True, choices=["cat", "dog"]) c.add_argument("--crea", required=True, type=float) c.add_argument("--sdma", type=float) c.add_argument("--upc", type=float) c.add_argument("--bp", type=float) ``` ### Technical Analysis Laboratory reference ranges in the application are hard-coded to specific units, such as `mg/dL`, but `parse_results()` extracts only a marker name and an unsigned numeric value. It does not capture, verify, or convert the unit accompanyin ...[truncated 2714 chars]
Remediation
View remediation
Vulnerability Patterns
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (4)

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
86% confidence
Finding

The skill instructs the agent to run local shell commands (python3 scripts/vet_translator.py ...) but does not declare any permissions or allowed-tools scope. That creates an authorization gap: an agent or platform may permit shell execution implicitly or inconsistently, increasing the risk of unintended command execution on user-provided medical text or future skill modifications. In a health-adjacent skill that may process OCR/text from users, undeclared shell access is more sensitive because it expands the trust boundary without explicit user or platform review.

Content

No source excerpt is available for this finding.

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/test_vet_translator.py (reported line 105)May include surrounding context.

python
# ── CLI ──────────────────────────────────────────────────────────────────────
print("cli:")
r = subprocess.run([sys.executable, os.path.join(HERE, "vet_translator.py"),
                    "labs", "--species", "cat", "--results", "CREA 2.4, SDMA 22"],
                   capture_output=True, text=True)
check("labs cmd exits 0", r.returncode == 0, r.stderr)

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/test_vet_translator.py (reported line 112)May include surrounding context.

python
check("labs flags CREA 2.4 HIGH", "CREA" in r.stdout and "HIGH" in r.stdout)
check("labs includes disclaimer", "veterinarian" in r.stdout)

r = subprocess.run([sys.executable, os.path.join(HERE, "vet_translator.py"),
                    "ckd", "--species", "cat", "--crea", "2.4", "--sdma", "22"],
                   capture_output=True, text=True)
check("ckd cmd exits 0", r.returncode == 0, r.stderr)

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/test_vet_translator.py (reported line 119)May include surrounding context.

python
check("ckd shows stage", "STAGE2" in r.stdout)
check("ckd generates questions", "Questions for your vet" in r.stdout)

r = subprocess.run([sys.executable, os.path.join(HERE, "vet_translator.py"), "demo"],
                   capture_output=True, text=True)
check("demo runs clean", r.returncode == 0 and "DEMO 4" in r.stdout)