T09 · Insecure Skill Coding Practices
- Location
main.py:28- Finding
Fabricated BLAST identification results are presented as genuine
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill uploads sequence data to NCBI and writes reports, but its strain-identification output appears hard-coded rather than based on completed BLAST results.
Do not rely on this skill for real strain identification as written. Before installing, require actual BLAST result polling and parsing, explicit consent before uploading sequences to NCBI, input path and file-size limits, user-controlled report output, and pinned reviewed dependencies.
main.py:28Fabricated BLAST identification results are presented as genuine
main.py:13Unrestricted file paths and unbounded input processing permit local-file disclosure and denial of service
requirements.txt:1Open-ended dependency constraints make installations non-reproducible
The code sends raw biological sequence data to the external NCBI BLAST service via an HTTP request without any consent prompt, warning, configuration gate, or redaction option. Even though NCBI uses HTTPS, sequence data may still be sensitive, proprietary, or regulated, so undisclosed transmission to a third party creates a real confidentiality and compliance risk.
The skill uses a generic "text" trigger with no visible scope restrictions, invocation constraints, or authorization context. That increases the chance the skill can be invoked unexpectedly or by overly broad inputs, which is risky because the described workflow performs file handling, external BLAST lookups, DingTalk table updates, and document generation.
The skill explicitly states it will perform online NCBI BLAST comparisons on user-provided sequencing files, which implies local file contents are transmitted to an external service. Because the description does not clearly warn users about this outbound data transfer, users may unknowingly disclose potentially sensitive biological or customer-associated sample data, making this a real privacy and data-handling issue.
User-visible messages such as return values and report labels are hardcoded in Chinese, and there is no indication that the skill supports user language selection or is intentionally limited to a Chinese-speaking context. This can violate language/locale policy when a skill forces a specific language without user opt-in.
The skill writes a Word report to disk automatically using a default filename, without warning the user or allowing control over storage location and retention. This can expose sample identifiers and identification results to other local users, backups, shared directories, or later unintended disclosure on multi-user or managed systems.
The dependency is specified with a lower-bound constraint instead of an exact pinned version, which makes builds non-reproducible and can cause different environments to install different releases. This increases supply-chain risk and makes it harder to verify whether a known-vulnerable or unexpectedly breaking version is being pulled in.
biopython>=1.81
python-docx>=0.8.11
requests>=2.31.0
Biopython has known advisories, and because the manifest does not pin an exact version, it is impossible to determine from this file alone whether deployment will install an affected release. This uncertainty is dangerous because vulnerable versions may be selected silently depending on resolver behavior and environment state.
Using an unpinned minimum version for python-docx allows dependency resolution to drift over time, reducing reproducibility and weakening assurance about what code is actually installed. That uncertainty can expose deployments to newly introduced vulnerable or malicious releases in the dependency chain.
biopython>=1.81
python-docx>=0.8.11
requests>=2.31.0
Python-docx has known XXE-related advisories, and the unpinned requirement makes it unverifiable whether a safe or vulnerable version will be installed. If this package is used to process attacker-controlled documents, a vulnerable version could enable XML external entity attacks and related file disclosure or SSRF-style behavior.
Requests is declared with only a minimum version, so future installs may resolve to different versions with different security properties. Because requests is network-facing and has a history of advisories, leaving it unpinned increases the chance of pulling an affected release or creating inconsistent security behavior across environments.
biopython>=1.81
python-docx>=0.8.11
requests>=2.31.0
Requests has many known advisories, and without exact version pinning there is no reliable way to verify that installations avoid affected releases. Since this library handles outbound HTTP behavior and credentials-related functionality, installing a vulnerable version can create meaningful exposure such as information leakage or unsafe request handling.
The natural-language description is entirely in Chinese and describes a fixed workflow using Chinese-language systems and outputs, but it does not indicate that the user can choose another language or locale. This can violate language or locale policy when a skill implicitly enforces one language without explicit opt-in.
The user-facing instructions, parameters, and notes are presented in Chinese without any indication of language selection or opt-in. This can violate language or locale policy where skills should not force a specific language without user choice or explicit documentation.
No suspicious patterns detected.