T09 · Insecure Skill Coding Practices
Warning
- Location
- SKILL.md:26
- Finding
- Plaintext Storage of Customer and Financially Sensitive Data<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:26-50` **Additional Location**: `SKILL.md:167-192` **Vulnerability Type**: Plaintext storage of sensitive customer and financial records **Risk Level**: Medium The skill instructs agents to maintain customer information in workspace YAML files: ```yaml # clients.yaml clients: - id: "CLI-001" name: "Acme Corp" contact: "Jane Smith" email: "jane@acme.com" address: line1: "123 Business Ave" line2: "Suite 400" city: "New York" state: "NY" zip: "10001" country: "US" tax_id: "US-EIN-12-3456789" payment_terms: "net-30" # net-15, net-30, net-45, net-60, due-on-receipt, custom preferred_currency: "USD" default_tax_rate: 0 # 0 for B2B cross-border, local rate for domestic notes: "PO required for invoices > $5,000" created: "2026-01-15" lifetime_revenue: 12500.00 invoices_sent: 3 invoices_paid: 2 avg_days_to_pay: 22 ``` It separately directs agents to store invoice amounts, payment status, and transaction records in another YAML ledger: ```yaml # invoices.yaml invoices: - number: "INV-2026.02.001" client_id: "CLI-001" status: "sent" issue_date: "2026-02-13" due_date: "2026-03-15" currency: "USD" subtotal: 5000.00 discount: 0 tax: 0 total: 5000.00 amount_paid: 0 balance_due: 5000.00 payment_terms: "net-30" line_items: - description: "AI Integration Consulting — February" qty: 20 rate: 250.00 amount: 5000.00 payments: [] notes: "" sent_date: "2026-02-13" reminders_sent: 0 created: "2026-02-13T10:30:00Z" ``` ### Technical Analysis The prescribed storage design places personally identifiable information, tax identifiers, billing addresses, commercial history, outstanding balances, and payment metadata in ordinary plaintext workspace files. The skill specifies no encryption, restrictive file per ...[truncated 2231 chars]
- Remediation
- <![CDATA[ ## Remediation Suggestions 1. Store customer and invoice records in an encrypted, access-controlled datastore rather than unrestricted workspace YAML files. 2. If local files are necessary, create them with owner-only permissions and document the required permission mode. 3. Encrypt sensitive fields or the complete datastore at rest, with keys held outside the project directory and agent memory. 4. Minimize collected data. Do not retain tax identifiers, full addresses, or payment references unless they are operationally required. 5. Separate customer identity data, invoice data, and payment data so access can be granted according to least privilege. 6. Require explicit user confirmation before persisting customer information or enabling recurring automation. 7. Prevent customer details, tax identifiers, invoice contents, and payment references from being copied into daily memory, diagnostic logs, or general chat history. 8. Apply redaction to exports and reports by default, revealing full sensitive fields only when explicitly requested by an authorized user. 9. Define retention periods and provide secure archival and deletion procedures. 10. Document backup encryption, synchronization restrictions, access auditing, and breach-response requirements. 11. Avoid storing complete bank account details, payment credentials, API tokens, or authentication secrets in invoice templates or YAML records. ]]>
