T09 · Insecure Skill Coding Practices
- Location
SKILL.md:118- Finding
Sensitive File Contents Are Transmitted Before User Consent
- Content
View full analysis
Vulnerability Details
File Location:
SKILL.md:118,SKILL.md:358-367,SKILL.md:596
Vulnerability Type: Consent-flow privacy violation and premature transmission of sensitive data
Risk Level: MediumVulnerable Documentation
The documented policy states:
text Bulk file uploads containing sensitive data (email lists, contact databases): always use human-assisted mode regardless of pipeline context. Call with confirmed=false first, show the item count and total cost, and require explicit user approval before transmitting the file.However, the documented quote workflow uses a multipart upload of the complete file:
bash curl -s -X POST "https://deep-validator-production.up.railway.app/validate/emails/file" \ -H "Authorization: Bearer <nvm-access-token>" \ -F "file=@contacts.xlsx" \ --output results.csvThe endpoint documentation further states that
confirmed=falsecauses the remote service to parse the uploaded file:text confirmed=false ... parses the file, counts rows, returns a cost quote — no credits consumed.The agent rules repeat the conflicting consent requirement:
text For bulk file uploads or any operation involving sensitive personal data (email lists, contact databases), always show the item count and cost estimate and require explicit user approval before transmitting data.Technical Analysis
The consent gate protects against billing but does not protect against data disclosure. To obtain the prescribed quote, the agent must send the complete multipart file to the externally operated Railway endpoint. The remote service necessarily receives and parses the file before returning its row count and cost estimate.
Consequently,
confirmed=falsemeans only that credits are not consumed. It does not mean that the data remains local. This directly conflicts with the instruction to obtain approval before transmitting sensitive data.The uploaded tabular file may contain more than ...[truncated 2032 chars]
- Remediation
View remediation
Remediation Suggestions
-
Perform quote preparation locally
- Count rows locally without uploading the file.
- Detect the relevant email or URL column locally.
- Calculate the quote using the documented per-item price.
-
Obtain consent before network transmission
- Clearly identify the third-party service and operator.
- State exactly which fields will be transmitted.
- Obtain explicit approval before uploading any file contents.
-
Minimize transmitted data
- Extract only the selected email or URL column.
- Remove names, telephone numbers, notes, identifiers, and unrelated columns.
- Deduplicate entries locally where appropriate.
- Avoid uploading the original workbook when a minimized list is sufficient.
-
Separate billing consent from privacy consent
- Explain that
confirmed=falseprevents charging but does not prevent data transmission. - Require data-transmission approval before the quote request and billing approval before
confirmed=true.
- Explain that
-
Provide a metadata-only quote endpoint
- Allow clients to submit only an item count and operation type.
- Do not require file contents for price calculation.
- Cryptographically bind the quote to the count if billing integrity is required.
-
Improve documentation
- Remove the contradictory instruction to upload first and consent later.
- Explicitly document that the hosted service receives files sent with
confirmed=false. - Distinguish local preprocessing, external disclosure, and paid validation as separate stages.
-
Add privacy-preserving alternatives
- Support local validation for syntactic checks and classification.
- Permit self-hosting for sensitive datasets.
- Publish verifiable retention, deletion, encryption, access-control, and audit-log policies for the hosted service.
-
