Back to skill

Security audit

ACMG Variant Classifier

Security checks for vulnerabilities and agentic risk

Overview

This is a transparent ACMG review workflow with a local classifier helper, but its outputs should be manually checked because conflict handling depends on correct use.

Install only as review support, not as an autonomous clinical classifier. Avoid identifiable patient data unless your environment is approved for it, and manually review any pathogenic/benign conflict instead of relying on the helper script's default behavior.

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/classifier.py:7
Finding

Fail-Open Handling of Contradictory ACMG Evidence

Content
View full analysis
str: pv = pathogenic.get("very_strong", 0) ps = pathogenic.get("strong", 0) pm = pathogenic.get("moderate", 0) pp = pathogenic.get("supporting", 0) ba = benign.get("standalone", 0) bs = benign.get("strong", 0) bp = benign.get("supporting", 0) if conflict and (pv or ps or pm or pp) and (ba or bs or bp): return "VUS" if ba >= 1: return "Benign" if bs >= 2: return "Benign" ``` ### Technical Analysis The classifier receives pathogenic and benign evidence simultaneously but does not derive the presence of a conflict from those inputs. Instead, conflict handling depends on the caller supplying a separate `conflict` Boolean, which defaults to `False`. If the flag is omitted or incorrectly set to `False`, the VUS safeguard is bypassed even when both evidence groups contain nonzero criteria. The function then evaluates benign rules first and pathogenic rules later, allowing contradictory evidence to produce an overconfident `Benign`, `Pathogenic`, or `Likely Pathogenic` result. This behavior conflicts with the documented workflow, which requires explicit conflict analysis and states that unresolved conflicts should generally remain VUS. It is also a fail-open design: an omitted safety signal permits a more definitive classification rather than a conservative result. ### Attack Path 1. Provide input containing at least one pathogenic criterion and at least one benign criterion. 2. Omit the optional `conflict` argument or explicitly set it to `False`. 3. The condition on lines 16–17 is not activated. 4. Classification proceeds using ordinary precedence rules. 5. For example, a nonzero `benign[" ...[truncated 946 chars]
Remediation
View remediation
0 for value in (pv, ps, pm, pp)) has_benign = any(value > 0 for value in (ba, bs, bp)) if has_pathogenic and has_benign: return "VUS" ``` 2. If resolved conflicts must be supported, replace the Boolean with a structured resolution record that identifies which criteria were rejected or downgraded and why. Recalculate classification only from the remaining accepted criteria. 3. Validate all evidence counts before classification: - Require integers. - Reject Boolean values, negative numbers, strings, and unexpected keys. - Define reasonable upper bounds where appropriate. 4. Add regression tests covering: - BA1 combined with any pathogenic evidence. - Strong benign evidence combined with pathogenic evidence. - Contradictory evidence when the conflict argument is omitted. - Contradictory evidence when the conflict argument is explicitly false. - Properly resolved conflicts after unsupported criteria are removed. 5. Return structured output containing the classification, detected conflicts, applied rules, and evidence counts so reviewers can verify how the result was reached. 6. Preserve the documented requirement for expert manual review and ensure downstream systems cannot treat the provisional result as an unsupervised clinical diagnosis. ]]>
Vulnerability Patterns
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • 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 (2)

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The declared description presents a broader end-to-end ACMG/AMP workflow: guided evidence intake, criteria assignment, conflict handling, and generation of a structured review-ready summary. The actual code does not perform that workflow. It assumes evidence has already been translated into numeric counts by strength category, then applies hard-coded decision logic to return a classification label. While this is related to ACMG/AMP classification and includes a limited conflict override, it lacks the described evidence collection, criteria derivation, and summary-generation functionality. Therefore the description materially overstates what the code chunk actually does.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding

Without declared permissions the skill's intent is opaque and cannot be validated.

Content

No source excerpt is available for this finding.