Back to skill

Security audit

Bio Ontology Mapper

Security checks for vulnerabilities and agentic risk

Overview

The skill is a plausible biomedical ontology mapper, but it overstates its capabilities and can send sensitive clinical terms and an API key to external services in URL query strings.

Review before installing. Use local-only mode for clinical or identifiable data, avoid passing API keys on the command line, and treat the advertised ICD-10/NER/cross-mapping features as unimplemented unless the package is corrected. The evidence does not show malicious behavior, persistence, or hidden exfiltration, but the privacy and install issues are material.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
Findings (2)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/main.py:59
Finding

Sensitive biomedical terms and API credentials are transmitted in URL query strings

Content
View full analysis
List[Dict]: """Search UMLS for concepts.""" if not self.api_key: return [] params = { "string": term, "apiKey": self.api_key, "pageSize": str(page_size) } if sabs: params["sabs"] = ",".join(sabs) response = self._make_request("/search/current", params) ``` ```python def search(self, term: str) -> List[Dict]: """Search MeSH descriptors.""" encoded_term = urllib.parse.quote(term) url = f"{self.BASE_URL}/lookup/descriptor?label={encoded_term}" response = self._make_request(url) ``` ### Technical Analysis The UMLS client places both the user-provided biomedical term and the UMLS API key in an HTTPS URL query string. The MeSH client likewise places the biomedical term in a URL query string. HTTPS protects the request while it is in transit, but query strings can still be recorded by local proxies, enterprise gateways, reverse proxies, monitoring products, browser or HTTP diagnostics, server access logs, and exception telemetry. An API key in a query string therefore has a broader exposure surface than a credential carried in an authorization header. Biomedical terms may also contain protected health information when derived from clinical records. Remote access is explicitly enabled through `--use-api`, and the destinations are fixed official NLM domains. Consequently, this behavior is necessary for the optional external lookup feature and is not covert exfiltration. However, transmitting raw clinica ...[truncated 1539 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
requirements.txt:1
Finding

Unnecessary and unpinned packages create a dependency-confusion and supply-chain risk

Content
View full analysis
Remediation
View remediation
; python_version < "3.7" ``` 4. Do not install an external `difflib` distribution; use the Python standard-library module. 5. For every future third-party dependency: - Pin an audited version. - Use cryptographic hashes. - Generate a lock file from a trusted index. - Run dependency and package-integrity scanning in CI. - Restrict installation to approved package repositories. 6. Install dependencies in an isolated, least-privileged virtual environment rather than under an administrative account. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (10)

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The code substantially aligns with ontology term normalization for SNOMED CT and MeSH, including confidence scoring and optional API-backed lookup. However, the declared description overstates the implemented behavior in two material ways: (1) ICD-10 mapping is not present anywhere in the code, and (2) the code does not extract entities from unstructured biomedical text; it accepts a single term or newline-delimited inputs and maps those strings directly. These are core functional claims rather than minor omissions, so this is a meaningful description-behavior mismatch.

Content

No source excerpt is available for this finding.

Lp1

High
Category
MCP Least Privilege
Confidence
98% confidence
Finding

The code performs outbound network requests via urllib to external biomedical APIs, yet the static finding indicates network capability is not covered by declared permissions. Even though the destinations are legitimate services, undeclared egress increases the risk of unauthorized data transmission and weakens security review of what leaves the environment.

Content

No source excerpt is available for this finding.

Lp1

High
Category
MCP Least Privilege
Confidence
98% confidence
Finding

The code performs outbound network requests via urllib to external biomedical APIs, yet the static finding indicates network capability is not covered by declared permissions. Even though the destinations are legitimate services, undeclared egress increases the risk of unauthorized data transmission and weakens security review of what leaves the environment.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The skill documents external API-based ontology lookups while also acknowledging PHI restrictions, creating a realistic risk that users may send sensitive clinical text to third-party services. In a biomedical context, even accidental transmission of identifiable patient text can create privacy, compliance, and contractual exposure.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
79% confidence
Finding

The manifest describes terminology normalization and code mapping, but the workflow documentation adds a validator step with check_clinical_plausibility=True. Assessing clinical plausibility is not an obvious requirement for mapping text to ontology codes and edges toward clinical reasoning capability that the skill explicitly says should not be used for clinical decision support.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The manifest states the skill maps biomedical text to standardized ontologies including ICD-10, but both the module docstring and the actual code implement only SNOMED CT and MeSH clients and mapping paths. There is no ICD-10 mapping logic, selector, client, or output anywhere in the file, so the implemented behavior falls short of the declared capability.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

When --use-api is enabled, user-supplied biomedical terms are sent to external UMLS and MeSH services without any explicit privacy notice or confirmation at the user interface boundary. Because biomedical text may contain protected health information or other sensitive medical context, silent transmission to third parties can create privacy, compliance, and data-governance risk.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
82% confidence
Finding

The limitations section states 'Best support for English; other languages limited,' which is a natural-language locale constraint. While it is framed as a limitation rather than a hard prohibition, the file does not offer a user language choice or explain a region-specific compliance reason for the constraint.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
60% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · requirements.txt (reported line 1)May include surrounding context.

text
dataclasses
difflib

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
60% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · requirements.txt (reported line 2)May include surrounding context.

text
dataclasses
difflib

Static analysis

No suspicious patterns detected.