Back to skill

Security audit

Biomedical Reference Verifier

Security checks across malware telemetry and agentic risk

Overview

This skill does what it claims: it verifies biomedical references using public citation services, with privacy considerations users should understand before running verification.

Install this if you are comfortable with verification sending citation identifiers and sometimes reference titles to Crossref, PubMed/NCBI, and OpenAlex. Use format-only mode for private documents, avoid setting personal API keys or USER_EMAIL unless needed, and review generated reports before using the auto-fixed bibliography.

SkillSpector

By NVIDIA
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (13)

Lp3

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding
The skill advertises and instructs use of capabilities including shell execution, file read/write, environment-variable access, and network access, but does not declare corresponding permissions. This creates a trust and policy gap: an orchestrator or reviewer may treat the skill as low-privilege while it can exfiltrate data from inputs or env vars, modify files, and make outbound requests to external services.

Context-Inappropriate Capability

Medium
Confidence
95% confidence
Finding
The script implicitly reads NCBI/OpenAlex API keys and user email from environment variables and then uses them for outbound requests. In an agent-skill setting, that widens the skill’s access to ambient secrets and identity data beyond explicit user input, which is risky because the tool’s core job is bibliography verification, not secret handling, and the same run also transmits data to third-party services.

Missing User Warnings

Low
Confidence
87% confidence
Finding
The policy explicitly authorizes external DOI/PMID verification by default without a user-facing warning or per-run consent. Even though it limits payloads to public identifiers and excludes manuscript text, it still causes autonomous network disclosure and may surprise users operating in restricted, confidential, or air-gapped contexts.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The verification pipeline sends user-supplied titles, DOIs, PMIDs, and search queries to Crossref, PubMed, and OpenAlex, but the call paths do not enforce a user-facing privacy warning or consent checkpoint at transmission time. Reference lists can contain unpublished manuscripts, confidential projects, or sensitive biomedical context, so silent external disclosure creates a real data-exposure risk.

Missing User Warnings

Low
Confidence
90% confidence
Finding
The code reads API keys from environment variables without a nearby disclosure or trust boundary explanation. While not direct exfiltration on its own, in a hosted agent environment this encourages silent credential use and makes it easier for operators to overlook that third-party-authenticated requests will occur.

External Transmission

Medium
Category
Data Exfiltration
Content
return self.crossref_doi_cache[doi]
        try:
            params = urllib.parse.urlencode({"mailto": self.email})
            url = "https://api.crossref.org/works/" + urllib.parse.quote(doi, safe="") + "?" + params
            item = self.get_json(url).get("message", {})
            record = crossref_record(item, score=1.0)
        except Exception:
Confidence
96% confidence
Finding
This Crossref DOI lookup performs external network transmission of identifiers and includes a mailto parameter derived from the environment/CLI email. In a bibliography skill this is expected functionality, but it is still a real security/privacy concern because user content and operator identity are disclosed to a third party.

External Transmission

Medium
Category
Data Exfiltration
Content
"rows": str(limit),
                "mailto": self.email,
            }
            url = "https://api.crossref.org/works?" + urllib.parse.urlencode(params)
            items = self.get_json(url).get("message", {}).get("items", [])
            records = []
            for item in items:
Confidence
96% confidence
Finding
This Crossref title search sends raw query text derived from user references to an external service. Title queries can reveal unpublished or sensitive research topics, making this more privacy-sensitive than exact DOI lookups.

External Transmission

Medium
Category
Data Exfiltration
Content
"select": "id,doi,title,display_name,publication_year,authorships,primary_location,ids",
                }
            )
            url = f"https://api.openalex.org/works/{identifier}?" + urllib.parse.urlencode(params)
            record = openalex_record(self.get_json(url), score=1.0)
        except Exception:
            record = None
Confidence
95% confidence
Finding
This OpenAlex DOI lookup transmits identifiers and optional authenticated parameters to a third-party API. In context, this is functional behavior, but still constitutes external disclosure of user-supplied reference data and service-linked identity.

External Transmission

Medium
Category
Data Exfiltration
Content
"select": "id,doi,title,display_name,publication_year,authorships,primary_location,ids",
                }
            )
            url = f"https://api.openalex.org/works/{identifier}?" + urllib.parse.urlencode(params)
            record = openalex_record(self.get_json(url), score=1.0)
        except Exception:
            record = None
Confidence
95% confidence
Finding
This OpenAlex PMID lookup sends PubMed identifiers to an external provider. Even if PMIDs are public, the submitted set can reveal the user’s document contents, research focus, or confidential workflow.

External Transmission

Medium
Category
Data Exfiltration
Content
"select": "id,doi,title,display_name,publication_year,authorships,primary_location,ids",
                }
            )
            url = "https://api.openalex.org/works?" + urllib.parse.urlencode(params)
            items = self.get_json(url).get("results", [])
            records = [record for item in items if (record := openalex_record(item, score=0.0))]
        except Exception:
Confidence
97% confidence
Finding
This OpenAlex search endpoint receives free-form search queries derived from user reference text, which can expose sensitive titles or topics. Because this is broader than exact-ID lookup, it has higher privacy sensitivity in the biomedical domain.

Env Variable Harvesting

High
Category
Data Exfiltration
Content
parser.add_argument("--pubmed-workers", type=int, default=0, help="Concurrent PubMed DOI corroboration workers; default is 3 without NCBI_API_KEY, 10 with NCBI_API_KEY")
    parser.add_argument("--openalex-workers", type=int, default=OPENALEX_DEFAULT_CONCURRENCY, help="Concurrent OpenAlex DOI/PMID corroboration workers")
    parser.add_argument("--request-timeout", type=int, default=8, help="Per-request network timeout in seconds")
    parser.add_argument("--ncbi-api-key", default=os.environ.get("NCBI_API_KEY") or "", help="Optional NCBI API key; raises PubMed E-utilities rate from 3 to 10 requests/second")
    parser.add_argument("--openalex-api-key", default=os.environ.get("OPENALEX_API_KEY") or "", help="Optional OpenAlex API key")
    parser.add_argument("--max-records", type=int, default=0, help="Limit records for testing")
    parser.add_argument("--email", default=os.environ.get("USER_EMAIL") or os.environ.get("CLAWDBOT_EMAIL") or "anonymous@example.org")
Confidence
96% confidence
Finding
Reading `NCBI_API_KEY` from the environment is ambient secret access: the skill can automatically use credentials present in the execution environment without an explicit handoff from the user. In an agent platform, this is dangerous because secrets intended for other components may become available to a skill that also performs network requests, increasing blast radius if the skill is modified or compromised.

Env Variable Harvesting

High
Category
Data Exfiltration
Content
parser.add_argument("--openalex-workers", type=int, default=OPENALEX_DEFAULT_CONCURRENCY, help="Concurrent OpenAlex DOI/PMID corroboration workers")
    parser.add_argument("--request-timeout", type=int, default=8, help="Per-request network timeout in seconds")
    parser.add_argument("--ncbi-api-key", default=os.environ.get("NCBI_API_KEY") or "", help="Optional NCBI API key; raises PubMed E-utilities rate from 3 to 10 requests/second")
    parser.add_argument("--openalex-api-key", default=os.environ.get("OPENALEX_API_KEY") or "", help="Optional OpenAlex API key")
    parser.add_argument("--max-records", type=int, default=0, help="Limit records for testing")
    parser.add_argument("--email", default=os.environ.get("USER_EMAIL") or os.environ.get("CLAWDBOT_EMAIL") or "anonymous@example.org")
    parser.add_argument("--json", action="store_true", help="Print JSON instead of the chat summary")
Confidence
96% confidence
Finding
Reading `OPENALEX_API_KEY` from the environment creates the same ambient-secret exposure problem as the NCBI key. Even though the current code uses it for a declared provider, hidden credential pickup is risky in shared runtimes and unnecessary for a reference-normalization skill unless the operator explicitly authorizes it.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
## Network risk policy

- Default DOI/PMID verification is low risk and should run without asking the user each time. The payload is limited to public identifiers required for the skill's purpose.
- Default requests must not include `original_text`, manuscript paragraphs, abstracts, local evidence notes, or unpublished claims.
- DOI-missing recovery may send only a short, quality-checked `source.title`.
- Any deep search that sends title plus abstract, surrounding context, or manuscript-derived claims is higher risk and must be separated from default batch verification.
Confidence
90% confidence
Finding
The phrase 'should run without asking the user each time' delegates an autonomous decision to transmit identifiers to external services. In a bibliography-verification skill this is functionally relevant, but it still reduces user control and can violate privacy, compliance, or operator expectations when references themselves are sensitive or reveal research direction.

VirusTotal

65/65 vendors flagged this skill as clean.

View on VirusTotal

Static analysis

No suspicious patterns detected.