T09 · Insecure Skill Coding Practices
- Location
SKILL.md:24- Finding
Plaintext Durable Storage of Customer and Payment Identifiers
- Content
View full analysis
Vulnerability Details
File Location:
SKILL.md, lines 24–37 and 141–161;references/log-only-workflow.md, lines 5–7 and 34–39
Vulnerability Type: Plaintext storage of potentially sensitive customer and transaction data
Risk Level: MediumVulnerable Code Snippets
From
SKILL.md, lines 24–37:md ## Issue Skeleton - Customer Issue: - Reported Symptom: - Product/Plan: - Time First Noticed: - Scope: - Payment/Order Reference: - Customer Identifier: - Current Impact: - Known Signals: - Missing Critical Info: Rules: - Fill from explicit facts when possible.From
SKILL.md, lines 141–161:md ### Option B: log-only management Use log-only management when no issue tracker is available or when a lightweight local workflow is preferred. Recommended log pattern: - store one case record per line in `cases.jsonl`, or one markdown file per day under `cases/` - write the initial Issue Skeleton + Quick Triage when the issue reaches TRIAGED - append follow-up entries for ASSIGNED transitions, no-response checks, and RESOLVED updates - keep a stable case id across updates Suggested JSONL fields: - case_id - created_at - updated_at - source - category - severity - state - title - skeleton - likely_module - primary_owner - backup_owner - next_actions - notesFrom
references/log-only-workflow.md, lines 5–7 and 34–39:md ## Storage options - `cases.jsonl` with one case event per line - `cases/YYYY-MM-DD.md` daily markdown logs - both, if you want machine-readable state plus human-readable summariesmd ## Recording pattern 1. Create a case record when the issue reaches TRIAGED. 2. Append new events for ASSIGNED, no-response follow-up, mitigation, and RESOLVED. 3. Keep a stable case id across all updates. 4. Never overwrite earlier reasoning without leaving a new event. 5. Keep the log factual and operational.Technical Analysis
The mandatory issue skeleton collects a
Payment/Order Referenceand `Customer Identifie ...[truncated 1923 chars]- Remediation
View remediation
Remediation Suggestions
- Do not persist direct customer identifiers or full payment/order references by default.
- Replace sensitive values with opaque case IDs, tokenized identifiers, or masked references such as the final four characters.
- Require explicit user approval before storing sensitive case fields locally.
- Define a field-level allowlist for durable logs and exclude unnecessary free-form customer content.
- Store sensitive records only in an access-controlled tracker or encrypted datastore where available.
- If local logging is necessary, require owner-only file and directory permissions and verify them before writing.
- Add
cases.jsonlandcases/to source-control ignore rules and warn against committing or externally synchronizing these records. - Establish documented retention periods, secure deletion procedures, and a process for removing records on request.
- Separate operational metadata from sensitive identifiers so lifecycle events can be retained without duplicating protected data.
- Add explicit guidance prohibiting authentication secrets, full payment-card data, security codes, passwords, session tokens, and similar credentials from ever being entered into the skeleton.
