Most markdown and reference-link detections are false positives, but the skill has real operational risk. It handles API credentials, writes local setup files, and documents Biomni workflows that can execute LLM-generated code with broad local privileges.
The script reads an existing .env file and merges newly entered credentials. Handling existing secret files expands exposure if the directory is not protected.
Configure API keys (store in `.env` file or environment variables):
The documentation recommends storing API keys in .env or environment variables. That is risky in this skill because generated code may run with access to the workspace.
The troubleshooting guidance points users to a .env file containing API keys. This increases risk if the workspace is shared or agent code can read it.
The report generator places conversation content into HTML elements without escaping or sanitization, which can create script injection in generated reports.
User and assistant message content is converted into HTML strings directly, and I found no escaping step before output.
The script executes a generated test_biomni.py file with the current Python interpreter. That file is built from local inputs and can run Biomni agent code with local privileges.
The script writes collected API keys into a local .env file in plaintext. This can expose credentials to later tools or generated code in the same directory.
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
anthropic_key = input(" Enter ANTHROPIC_API_KEY (or press Enter to skip): ").strip()
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
openai_key = input(" Enter OPENAI_API_KEY (or press Enter to skip): ").strip()
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
google_key = input(" Enter GOOGLE_API_KEY (or press Enter to skip): ").strip()
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
groq_key = input(" Enter GROQ_API_KEY (or press Enter to skip): ").strip()
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
print(f"✓ API keys configured: {', '.join(api_keys.keys())}")
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
The troubleshooting guidance tells users to echo an API key environment variable. Printing secrets can leak credentials into terminal logs or shared screens.
Most markdown and reference-link detections are false positives, but the skill has real operational risk. It handles API credentials, writes local setup files, and documents Biomni workflows that can execute LLM-generated code with broad local privileges.
The script reads an existing .env file and merges newly entered credentials. Handling existing secret files expands exposure if the directory is not protected.
Configure API keys (store in `.env` file or environment variables):
The documentation recommends storing API keys in .env or environment variables. That is risky in this skill because generated code may run with access to the workspace.
The troubleshooting guidance points users to a .env file containing API keys. This increases risk if the workspace is shared or agent code can read it.
The report generator places conversation content into HTML elements without escaping or sanitization, which can create script injection in generated reports.
User and assistant message content is converted into HTML strings directly, and I found no escaping step before output.
The script executes a generated test_biomni.py file with the current Python interpreter. That file is built from local inputs and can run Biomni agent code with local privileges.
The script writes collected API keys into a local .env file in plaintext. This can expose credentials to later tools or generated code in the same directory.
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
anthropic_key = input(" Enter ANTHROPIC_API_KEY (or press Enter to skip): ").strip()
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
openai_key = input(" Enter OPENAI_API_KEY (or press Enter to skip): ").strip()
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
google_key = input(" Enter GOOGLE_API_KEY (or press Enter to skip): ").strip()
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
groq_key = input(" Enter GROQ_API_KEY (or press Enter to skip): ").strip()
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
print(f"✓ API keys configured: {', '.join(api_keys.keys())}")
This setup workflow solicits real LLM API keys and passes them through storage or export paths. Plaintext credential handling can expose secrets to local files, logs, or generated code.
The troubleshooting guidance tells users to echo an API key environment variable. Printing secrets can leak credentials into terminal logs or shared screens.
Static analysis produced many hits, and most Markdown backtick, weak-crypto, C2, and hardcoded-URL detections are false positives from documentation examples. However, the skill intentionally supports autonomous LLM-generated code execution, external MCP tools, local file writes, and API key storage, so it should not be published without strong warnings and sandbox guidance.
6
Files scanned
2,865
Lines analyzed
11
Review items
3
False positives ignored
Capability review items (6)
These are real local capabilities that may be expected for this skill, so they require review but are not counted as confirmed malicious behavior.
The skill describes Biomni as generating and executing analysis code, with code execution enabled by default and sandbox mode disabled unless configured. This is a real high-risk capability because LLM-generated biomedical workflows can execute with the user process privileges.
The documentation explicitly states that Biomni generates and executes code and warns that it runs with full system privileges. This confirms the static execution findings as a real security concern, although not malicious intent.
The setup helper prompts users for LLM provider API keys and can write them into a local .env file. This is legitimate setup behavior, but it increases exposure if run in shared directories or logs are mishandled.
The code directly prompts for named API keys and writes collected values to .env or prints shell export commands. The behavior is clear and intentional, but it is configuration support rather than exfiltration.
The skill documents MCP server configuration that can run external commands and pass API keys into network-enabled tools. This expands the execution and network surface when users enable MCP integrations.
The evidence shows documented command-based MCP servers and API key environment mappings. This is optional and user-configured, so confidence is high for risk surface but lower for immediate exploitability.
The setup script runs conda commands and can create then execute a generated Biomni test script. The subprocess arguments are mostly fixed, so command injection evidence was not found, but running the test can trigger package behavior, data access, and LLM calls.
The subprocess.run calls are real and the generated test file is executed. The arguments are not shell-concatenated user input, which reduces injection likelihood.
The report generator inserts conversation content and titles into HTML without escaping. If untrusted conversation history is converted to HTML and opened in a browser, embedded markup may execute or alter the report.
The converter wraps raw message content into HTML tags without escaping. Exploitability depends on the report input source and how users open generated HTML.
Local Filesystem Writes for Reports, Examples, and Secrets
The skill writes reports, example scripts, data directories, test files, and .env credential files. These writes are user-facing and mostly expected, but they can expose sensitive research data or credentials if paths are shared.
The file writes are explicit and legitimate for setup and reporting. The main risk is accidental disclosure of credentials or biomedical data, not hidden persistence.
Static false positives ignored (3)
These static matches were dismissed by semantic review or matched schema-only tokens, so they are shown for transparency but do not drive the quality score.
Markdown Code Examples Misclassified as Shell Execution
Most external command detections in SKILL.md and references are Markdown fenced code examples, inline model names, or biomedical examples. I did not find evidence that these documentation snippets execute by themselves.
The cited lines are fenced documentation examples rather than Ruby backtick execution. Similar static hits across reference files follow the same Markdown pattern.
Biomedical Text Misclassified as Crypto or C2 Indicators
Static blocker hits for weak cryptography and C2 keywords appear to match biomedical abbreviations, model identifiers, SMILES strings, or example task text. No evidence found of cryptographic implementation, command-and-control behavior, or malicious networking.
The inspected context shows domain content and documentation, not cryptographic code or C2 logic. This supports dismissing those static blocker patterns as false positives.
Hardcoded URLs Are Documentation and Provider Links
Hardcoded URLs point to provider consoles, project documentation, GitHub resources, and local example endpoints. No evidence found that the skill silently sends data to these URLs.
The URLs are visibly documentation, provider setup, or localhost examples. Network access can occur when users configure providers, but these lines do not show covert exfiltration.
The static analysis flagged 415 patterns, but 95% are FALSE POSITIVES from markdown documentation. The backtick patterns are markdown code delimiters, not shell execution. The API key patterns show example environment variable names in documentation, not actual secrets. The skill is a legitimate Stanford SNAP lab biomedical research framework. The code execution + network + credential combination is the intended design for an AI agent that generates bioinformatics analysis code. Proper security warnings are documented recommending sandboxed execution.
The static analysis flagged 415 patterns, but 95% are FALSE POSITIVES from markdown documentation. The backtick patterns are markdown code delimiters, not shell execution. The API key patterns show example environment variable names in documentation, not actual secrets. The skill is a legitimate Stanford SNAP lab biomedical research framework. The code execution + network + credential combination is the intended design for an AI agent that generates bioinformatics analysis code. Proper security warnings are documented recommending sandboxed execution.
Biomni is a legitimate biomedical research framework from Stanford that requires code execution capabilities for its core functionality. While static analysis flags many security patterns, these are necessary for an AI agent that generates and executes analysis code. The skill includes proper security warnings and recommends sandboxed execution.
This skill provides documentation and helper scripts for the biomni biomedical AI framework. The setup script runs external commands (conda) and writes API keys to .env files, which are legitimate setup operations but expand the attack surface. No evidence of obfuscation, credential theft, or malicious network calls.
9
Files scanned
3,185
Lines analyzed
5
Review items
0
False positives ignored
Capability review items (2)
These are real local capabilities that may be expected for this skill, so they require review but are not counted as confirmed malicious behavior.
The setup script executes external binaries and a generated test script using subprocess.run(). Example from line 67-69: "subprocess.run(['conda', 'create', '-n', 'biomni_e1', 'python=3.10', '-y'], check=True)". If a malicious binary is earlier in PATH, an attacker could run arbitrary code under the user account. This is a standard setup pattern but requires PATH hygiene.
API keys are written to disk in plaintext format. From lines 145-149: "with open(env_file, 'w') as f:" followed by "f.write(f\"{key}={value}\\n\")". If the directory is shared, backed up insecurely, or accessed by other users, credentials could be exposed. Users should set restrictive file permissions (chmod 600) on .env files.