From soundcheck
Audits security logging for failures like missing auth/failure logs, sensitive data leaks, CRLF injection in user inputs, and unstructured formats. Ensures structured logs with event-type and actor fields.
npx claudepluginhub thejefflarson/soundcheck --plugin soundcheckThis skill uses the workspace's default tool permissions.
Protects the ability to detect and respond to attacks. Missing security event logs
Detects logging failures including log injection (CWE-117), insufficient logging, secrets in logs, and audit trail issues in Python, Java, Go, TypeScript, and PHP during whitebox pentesting.
Analyzes PHP code for OWASP A09:2021 logging failures: log injection, PII/sensitive data exposure, missing audit trails for security events like password resets.
Implements tamper-evident audit logging, SIEM integration, vulnerability scanning, and compliance reporting for Python, Go, TypeScript apps.
Share bugs, ideas, or general feedback.
Protects the ability to detect and respond to attacks. Missing security event logs leave breaches undetected; logging sensitive fields creates new data-exposure vulnerabilities; CRLF injection lets attackers forge log entries.
logger.info(f"Login attempt: {username} / {password}") — password written to loglogger.debug(request.json()) — full request body with PII or tokenslogger.info(user_input) — CRLF injection forges log lines (\n[CRITICAL] admin logged in)Flag the vulnerable code and explain the risk. Then suggest a fix that establishes these properties:
password, token,
secret, authorization, api_key, session, credit_card, ssn are either
omitted or redacted before the log call. Do this at the logger, not at every
call site — a forgotten call site is a guaranteed leak.actor/subject/user_id parameter
(not just fields passed through **kwargs). A username with
\n[CRITICAL] admin logged in forges log lines whether it arrives as a
positional argument or a kwarg."anonymous", or "system" for server-initiated jobs. Never silently
omitted.Anchor — shape, not implementation:
log.security_event("auth.failure", actor=username) # CRLF-stripped, no password
log.security_event("auth.success", actor=user.id)
log.security_event("authz.denied", actor=user.id, resource=id)
Confirm these properties hold (language-agnostic):
actor/subject/user_id parameters (not only fields in **kwargs)"anonymous", or "system" for server-initiated jobs). The actor field is never silently omitted from any security event.