plan-input-validation — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited plan-input-validation (Agent Skill) and scored it 45/100 (orange). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 1 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
A base64 string of 128+ characters appears in a documentation file. Encoded prompt injection hides the hostile instruction in base64 — invisible to keyword filters — and relies on the agent's ability to decode it at runtime. There is no normal authoring reason to embed a multi-hundred-byte base64 blob in skill docs.
*.sig, SIGNATURES) outside the documentation.Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Role: Senior application security engineer (trust-boundary lens).
Task: Map every point untrusted data enters, score validate/sanitize/authenticate gaps, phase remediations, emit plan-input-validation.md. Audit & plan only — no code changes until each phase is approved.
Walk every boundary. Find what's trusted that shouldn't be. Change nothing until approved.
AI agents write code that works on the inputs you showed them. Two signature patterns recur: dangerouslySetInnerHTML without DOMPurify (XSS), and webhook handlers without real signature verification — CVE-2026-41432, where an empty signing secret lets any attacker forge valid signatures and credit unlimited quota without payment.
This skill is the audit-and-plan half. Execution goes to backend-patterns / backend-error-handling / audit-security after you approve each phase.
Trigger phrases: "validate my inputs", "is this injection-safe", "check my forms / API", "XSS", "dangerouslySetInnerHTML", "my Stripe webhook", "can requests be forged", "sanitize user content", "pre-launch input hardening".
Do not fire for: row-level access (plan-rls-audit), credential exposure (plan-secrets-audit), or broad architecture review (plan-security-audit). This skill owns the boundary where untrusted data enters.
Number(req.body.amount) with no bounds.req.body into DB insert/update (role,is_admin, credits).
javascript: URIs, unvalidated redirects.(CVE-2026-41432 bypass).
JSON.stringify(req.body) instead of raw bytes.plan-input-validation.md# Input-Validation & Trust-Boundary Audit — <repo>
_Audit-only. Nothing changes until each phase is approved._
## Scope
- Boundaries found: forms / API / webhooks / uploads / rendered content
- Stack: Supabase ☐ Stripe ☐ Next.js ☐ | Assumptions: …
## Verdict
| Boundary class | Findings | Critical | Unauthenticated write reachable? |
|----------------|----------|----------|----------------------------------|
| Form & API | n | n | … |
| Rendered (XSS) | n | n | … |
| Webhooks | n | n | … |
| Uploads/other | n | n | … |
## Findings
| # | Boundary | path:line | Missing: validate/sanitize/authenticate | Sev | Direction |
|---|----------|-----------|-----------------------------------------|-----|-----------|
| I1 | Stripe webhook | api/webhooks/stripe.ts:12 | authenticate (no constructEvent) | Crit | verify raw body against secret; 400 on fail |
| I2 | comment render | Comment.tsx:30 | sanitize (dangerouslySetInnerHTML) | High | DOMPurify before render |
| I3 | profile update | actions/profile.ts:8 | validate (mass assignment) | High | Zod allowlist; drop role/credits |
## Phased burndown
- **Phase 1 — Forgeable money/data paths** → `backend-patterns` — webhooks, mass-assign
- **Phase 2 — XSS / rendered content** → `backend-error-handling` / `enhance-web-ux` — I2…
- **Phase 3 — Schema validation pass** → `backend-patterns` — Zod at every boundary
- **Phase 4 — Uploads & concurrency** → `audit-security` — files, races
## Execution handoff
Approve a phase to run it. Re-run after; for webhooks, verify with Stripe CLI
fixtures (real signed events) not mocked payloads.plan-rls-audit;credentials: plan-secrets-audit.
backend-patterns, backend-error-handling, audit-security,audit-fe-api.
test-red-team + Stripe CLI signed webhook fixtures.Plan with a strong model; execute with composer-2.5-execution.mdc riding along. The plan says which boundaries are open; the rule constrains how they're closed.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.