From soundcheck
Flags broken access control vulnerabilities including missing ownership checks, IDOR, role enforcement gaps, and insecure middleware. Suggests fixes with gates, middleware, and 404 responses.
npx claudepluginhub thejefflarson/soundcheck --plugin soundcheckThis skill uses the workspace's default tool permissions.
Protects against unauthorized resource access caused by missing ownership checks or
Analyzes PHP code for authorization issues including missing access control, IDOR, privilege escalation, and role-based gaps. Use for security reviews in PHP apps.
Audits Python code for authentication bypass vulnerabilities in permission checks, DRF views, JWT/token validation, decorators, middleware, and SSO/OAuth flows. Covers CWE-285/287/863.
Audits IAM policies, RBAC, ACLs, file permissions, and API authorization for vulnerabilities, privilege escalation paths, and least privilege violations.
Share bugs, ideas, or general feedback.
Protects against unauthorized resource access caused by missing ownership checks or
role enforcement. Exploitation leads to horizontal/vertical privilege escalation.
For SSRF (server-side request forgery), see the dedicated ssrf skill.
resource = db.get(request.params.id) — fetches any record without verifying caller owns itapp.delete("/admin/user/:id", handler) — admin endpoint with no role middlewareif user.id == id: return resource — ownership check placed after the data is already fetched and potentially acted onFlag the vulnerable code and explain the risk. Then suggest a fix that establishes these properties:
if role != "admin" checks inside
handler bodies are brittle — they can be forgotten on a new route and they're
invisible at a glance./admin/*) may still return 403 — the route itself is public
knowledge, so only the instance-level check needs to hide behind 404.Anchor — shape, not implementation:
# resource fetch — ownership gate before returning data
row = db_get(Resource, id)
if row is None or row.owner_id != caller.id:
return 404 # not 403 — hide existence
# privileged route — role gate as route-level middleware
router.delete("/admin/user/:id", require_role("admin"), delete_user)
Confirm these properties hold (language-agnostic):
if checks inside individual handler bodies