Back to skill

Security audit

Genome Report

Security checks for vulnerabilities and agentic risk

Overview

The skill is a local genome report generator, but it needs Review because it handles sensitive DNA and health data with overstated capability claims, weak privacy controls, and unsafe HTML report generation.

Review carefully before installing. Only use this on genome files you are authorized to process, avoid family comparison without consent from each person, do not use the output for medical or medication decisions, and avoid opening generated HTML reports from untrusted genome files until escaping/validation is fixed. Treat the reports as rough educational summaries, not comprehensive ancestry or clinical genetic analysis.

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

Warning
Location
scripts/genome_report.py:184
Finding

Stored HTML Injection in Generated Genome Reports

Content
View full analysis
genotype.""" genotypes = {} with open(filepath) as f: for line in f: line = line.strip() if not line or line.startswith("#"): continue parts = line.split("\t") if len(parts) >= 4: rsid, _chrom, _pos, genotype = parts[0], parts[1], parts[2], parts[3] if rsid.startswith("rs") and genotype != "--": genotypes[rsid] = genotype return genotypes ``` The genotype and input filename are then inserted directly into an HTML document: ```python def output_html(results, scores, filename, output_path=None): cats_html = "" for cat in sorted(scores, key=scores.get, reverse=True): label = CATEGORY_LABELS.get(cat, cat) score = scores[cat] color = risk_color(score) cats_html += f'

{label}

{score}% — {risk_label(score)}
\n' details_html = "" for cat, snps in sorted(results.items()): label = CATEGORY_LABELS.get(cat, cat) rows = "" for s in sorted(snps, key=lambda x: -x["risk_count"]): cls = "risk-high" if s["risk_count"] == 2 else "risk-med" if s["risk_count"] == 1 else "risk-low" rows += f'{s["rsid"]}{s["gene"]}{s["genotype"]}{s["trait"]}{s["effect"]}\n' ...[truncated 3966 chars]
Remediation
View remediation
{escape(str(member), quote=True)}" for member in members ) ``` 3. Validate genome fields before storing them. For ordinary diploid SNP calls, enforce an explicit allowlist: ```python import re if re.fullmatch(r"[ACGT]{1,2}", genotype): genotypes[rsid] = genotype ``` If the supported input format includes insertions, deletions, haploid calls, or other notation, define a documented allowlist that covers only those formats. 4. Prefer a templating system with automatic escaping if external dependencies become acceptable. If string construction remains in use, centralize escaping in a helper so no output field can bypass it. 5. Add a restrictive Content Security Policy as defense in depth, for example: ```html ``` Escaping remains mandatory because a CSP alone does not prevent markup injection or report manipulation. 6. Add regression tests using malicious genotype values and filename stems. Verify that generated reports contain encoded text such as `<img` and never preserve executable elements or event-handler attributes. ]]>
Vulnerability Patterns
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • YARA SignaturesMalware Match, Webshell Match, Cryptominer Match
  • 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
Findings (8)

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

The skill description claims ancestry analysis and 'comprehensive' health reporting, but the underlying behavior is only simple SNP lookup and risk counting. This can mislead users into overtrusting incomplete genetic interpretations, potentially causing harmful health, medication, or family-history decisions based on overstated capabilities.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill processes highly sensitive genetic and family data but does not present a prominent privacy warning, data-handling notice, or consent requirement. Because genomic data is uniquely identifying and can expose health and familial information, the lack of clear privacy guidance materially increases the risk of unsafe disclosure, inappropriate sharing, or uninformed consent.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The cognitive section makes deterministic or value-laden claims about IQ, memory, empathy, social behavior, and Alzheimer's risk proxies from individual SNPs, despite these traits being highly polygenic and environmentally influenced. In this skill's context, those claims could mislead users into believing the tool can reliably infer intelligence or psychological characteristics, causing harm, stigma, or inappropriate self/other assessment.

Content

No source excerpt is available for this finding.

YARA rule 'agent_skill_mcp_tool_poisoning_metadata': MCP/tool metadata poisoning indicators in tool schemas or skill manifests [agent_skills]

High
Category
YARA Match
Confidence
80% confidence
Finding

YARA rule matched a hack tool or exploit indicator (offensive tools, reconnaissance, privilege escalation, or exploit frameworks).

Content

Scanner excerpt · scripts/genome_report.py (reported line 316)May include surrounding context.

python
}
h1{{color:#2c3e50}}
.disclaimer{{background:#fff3cd;border:1px solid #ffc107;padding:12px;border-radius:6px;margin:16px 0}}
table{{width:100%;border-collapse:collapse;background:white;border-radius:8px;overflow:hidden;box-shadow:0 1px 3px rgba(0,0,0,.1);margin:16px 0}}
th{{background:#2c3e50;color:white;padding:10px}} td{{padding:10px;border-bottom:1px solid #eee}}
</style></head><body>
<h1>👨‍👩‍👧‍👦 Family Genome Comparison</h1>
<p>Generated: {datetime.now().strftime('%Y-%m-%d %H:%M')}</p>
<div class="disclaimer">⚠️ This report is for educational purposes only. NOT medical advice.</div>
<table><tr><th>Category</th>{"".join(f"<th>{m}</th>" for m in members)}</tr>
{table_rows}</table>
</body></html>"""
    
    out = Path(genome_dir) / "family_comparison.html"
    with open(out, "w") as f:
        f.write(html)
    print(f"Family comparison saved to: {out}")


def main():
    parser = argparse.ArgumentParser(
        description="Analyze 23andMe raw genome data and

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
88% confidence
Finding

The skill advertises file-processing behavior and HTML output generation but does not declare any explicit tool scope or permissions. In an agent environment, missing scope declarations can allow broader-than-expected file write behavior or make reviewers and orchestrators unable to enforce least privilege, which is especially risky when handling sensitive genome and family data.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The activation text is broad enough to trigger on many ordinary genetics-related requests, which may cause the skill to be invoked when users did not intend to submit highly sensitive DNA data for analysis. In this context, accidental invocation increases privacy risk because genetic and family-comparison workflows involve uniquely sensitive personal information.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The pharmacogenomic and medical risk entries provide direct dosing and efficacy implications such as warfarin dose requirements and clopidogrel effectiveness without embedded warnings that these are not sufficient for clinical decision-making. Because the skill is designed to analyze consumer genome data and generate health reports, users may act on these outputs as medical advice, creating a realistic risk of unsafe medication changes or false reassurance.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The file encodes ethnicity-linked and socially sensitive trait interpretations such as skin pigmentation, eye color, and body odor using deterministic language and ancestry-coded labels. In a genome-analysis skill, this can enable stigmatizing, discriminatory, or overgeneralized inferences about protected or sensitive characteristics, especially when presented without context, uncertainty, or safeguards.

Content

No source excerpt is available for this finding.