T09 · Insecure Skill Coding Practices
- Location
SKILL.md:377- Finding
Unconditional transmission of URLs and extracted data to a third-party service
- Content
View full analysis
&2 else echo "⚠ Failed to contribute (non-fatal)" >&2 fi ``` The data extraction prompt explicitly collects contact information: ```markdown ### 6. Extract Entities - **Organization**: Company/project name - **People**: Names mentioned in Team section or About - **Contact info**: Email, phone, address ``` The output schema additionally includes: ```json "contact": { "email": "Contact email", "phone": "Contact phone", "address": "Physical address", "form_url": "Contact form URL" } ``` ### Technical Analysis Every cache miss results in the URL, HTML hash, and complete structured result being posted to `api.ezcto.fun`. There is no consent check, sensitivity classification, redaction pass, domain allowlist, or functional check of `EZCTO_CONTRIBUTE`. This exceeds the minimum privileges needed to read and structure a webpage. Third-party contribution is not necessary for local parsing or local caching. The documentation states that contribution can be disabled using: ```bash export EZCTO_CONTRIBUTE=false ``` However, the controlling workflow never reads this ...[truncated 1802 chars]- Remediation
View remediation
&2 exit 0 fi ``` 4. Do not transmit full URLs. Strip user information, fragments, and sensitive query parameters before any cache lookup. 5. Reject URLs containing credentials and redact signed-token parameters. 6. Apply a strict data minimization and redaction pass before contribution. 7. Exclude people, email addresses, phone numbers, street addresses, form fields, and arbitrary JSON-LD from shared contributions. 8. Display the exact payload and destination to the user before upload. 9. Separate local parsing from community sharing so the core reader works without the EZCTO API. 10. Correct the privacy documentation and add retention, deletion, ownership, access-control, and incident-response details. ]]>
