T09 · Insecure Skill Coding Practices
- Location
app.py:217- Finding
Sensitive Medical Records Stored in Plaintext
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is a coherent cardiac rehab web app, but it handles sensitive medical data and gives exercise guidance with safety and privacy gaps that warrant careful review.
Review this before installing or using with real patient data. It should be treated as experimental decision support only, not medical authority. Use a clinician-reviewed symptom vocabulary, fix the emergency matching issue, self-host frontend assets or disclose third-party requests, pin dependencies, and add strong local data protections before deployment with sensitive health records.
app.py:217Sensitive Medical Records Stored in Plaintext
app.py:88Emergency Symptom Detection Does Not Match the Documented User Input
requirements.txt:1Unbounded and Non-Reproducible Third-Party Dependencies
The API spec describes an AI system that ingests sensitive cardiac health data and produces automated risk stratification, exercise prescriptions, medication reminders, and safety warnings, but it provides no warning about the sensitivity of patient data, the limits of automated medical recommendations, or the need for clinician oversight. In a cardiac rehabilitation context, omitted cautions can lead users or integrators to over-trust the system, increasing the chance of unsafe exercise guidance, missed urgent care escalation, or privacy mishandling of health information.
Without declared permissions the skill's intent is opaque and cannot be validated.
The manifest description and the full user-facing SKILL.md content are written in Chinese, and the file does not indicate that the skill is region-specific or that users may choose another language. This can violate a language/locale policy when skills are expected to avoid forcing a specific language without user opt-in.
The entire user-facing guide is written only in Chinese, with no indication that language selection is optional or that the skill is intentionally limited to a Chinese-speaking audience. This creates a natural-language locale policy issue because it imposes a specific language without user opt-in.
The documented privacy assurance is materially inconsistent with actual behavior: external CDN-hosted assets cause outbound requests despite the statement that data is not uploaded to the cloud. In a healthcare-facing app, this mismatch can create privacy, compliance, and trust risks because users may rely on the promise of fully local operation when entering sensitive health information.
The file’s natural-language UI, warnings, and instructions are entirely in Chinese, beginning with the module description and continuing throughout the application. There is no indication that users may choose another language, nor is there a documented justification that this skill is intended only for a Chinese-language or region-specific audience.
The code claims that data stays local and is not uploaded to the cloud, but the HTML template loads Bootstrap and Chart.js from jsDelivr CDNs. Even if patient data is not explicitly sent in requests, browser visits to a third-party CDN disclose metadata such as client IP address, user agent, access timing, and referrer, which is especially sensitive in a medical context because it can reveal use of a cardiac rehab application.
The package description is written entirely in Chinese, which indicates a language-specific presentation in the skill metadata. There is no accompanying indication that the skill is region-specific or that users can opt into this locale, so it may conflict with a language-choice policy.
The dependency is specified as flask>=2.0, which allows any future major or minor release to be installed and makes builds non-reproducible. This increases supply-chain risk and can unexpectedly pull in vulnerable or breaking versions of Flask, which is especially concerning for a healthcare-oriented web application that may process sensitive patient data.
flask>=2.0
Because the manifest does not pin Flask to a specific version, it is impossible to verify whether the deployed package includes fixes for known Flask advisories. In practice, this means the application may install a release affected by denial-of-service or signing-key related issues, creating avoidable uncertainty in a medical web application's security posture.