| name | database-security |
| description | Examines all database interactions for injection, access control, encryption, and data-exposure risks. Use when auditing database and data-layer security. |
| license | CC0-1.0 |
| metadata | {"category":"security"} |
| allowed-tools | Read Grep Glob Write |
| disable-model-invocation | true |
| argument-hint | [path or scope] |
Target: $ARGUMENTS
If no target path is given above, review the entire codebase.
Database Security Audit
Examine ALL database interactions
Verify:
-
Parameterized queries or ORM usage
- Ensure all queries use placeholders (
?, $1, :param) or ORM bindings.
- Flag any direct string concatenation in queries as CRITICAL.
-
Connection string security
- No passwords or secrets hardcoded in code or committed to source control.
- Use environment variables or a secrets manager.
-
Database user permissions (principle of least privilege)
- Application account has only the rights it needs (e.g., no
SUPERUSER, DROP, GRANT).
- Separate accounts for read-only, migrations, and admin.
-
Sensitive data encryption at rest
- Verify disk-level/database-native encryption.
- Critical fields (e.g., SSN, tokens) use column-level encryption or tokenization.
-
PII handling compliance
- Personally identifiable information is minimized, redacted in logs, and handled per GDPR/CCPA.
- Retention/deletion policies exist and are enforced.
-
Query timeout configurations
- Query/statement timeouts configured at driver and DB server level to prevent runaway queries.
-
Connection pool settings
- Pool limits configured (min/max); no unbounded connections.
- Idle timeouts enforced to prevent exhaustion.
-
Transaction handling for consistency
- Transactions wrap multi-step operations.
- Rollback paths tested to prevent partial updates.
-
Audit logging for sensitive operations
- Log access to sensitive tables/fields, schema changes, permission changes, failed logins.
- Logs are centralized, immutable, and monitored.
-
NoSQL injection hardening (if applicable)
- User input never passed directly to filters.
$where, $ne, $gt, $or operators blocked/sanitized.
- ORM/driver sanitization enabled (e.g.,
mongoose.set('sanitizeFilter', true)).
-
Row/Tenant isolation
- Row-level security (Postgres RLS) or server-side ownership/tenant filters enforced.
- Multi-tenant queries scoped by server, not client input.
-
Least-privilege networking
- Database not publicly exposed; network ACLs, VPC, firewall/security groups in place.
- Only whitelisted application servers can connect.
-
TLS in transit & certificate validation
- DB connections use TLS (
sslmode=require/verify-full or equivalent).
- Certificates validated and rotated.
-
Secret management & rotation
- Credentials stored in a secrets manager, rotated periodically.
- No static passwords in
.env files without protection.
-
Schema & integrity controls
- Foreign keys, unique constraints, and NOT NULL enforced.
- Ownership/tenant columns marked
NOT NULL and validated.
-
Field-level minimization
- Avoid
SELECT *; fetch only required fields.
- Reduces exposure of sensitive columns.
-
Pagination & query limits
- Hard caps on
LIMIT/page size; prevent unbounded queries that scan entire tables.
-
Backup/restore security
- Backups encrypted, access-controlled, tested for restoration.
- No unprotected dumps in CI/CD or object storage.
-
Data retention & deletion
- Clear policies for retention, archival, and deletion of PII.
- Secure erasure when data is removed.
-
Migrations safety
- Migrations run with controlled privileges.
- Destructive operations reviewed; rollback plans exist.
-
ORM raw-query escape hatch review
- Any
queryRaw/sequelize.query/knex.raw usage audited.
- Must still use parameterized bindings.
-
LIKE / regex input handling
- Special characters in user input escaped properly (
%, _, regex metacharacters).
- Prevents pattern abuse and heavy queries.
-
Query timeouts & resource guards
- Resource caps enforced (memory, work_mem, CPU).
- Prevent denial-of-service via expensive queries.
-
Audit & monitoring depth
- Privileged operations (DDL, GRANT, role changes) logged and alerted.
- Centralized monitoring with anomaly detection.
-
PII in logs/metrics
- ORM debug or query logs do not leak PII or secrets.
- Redaction/allowlisting enforced.
-
Indexing of sensitive data
- Sensitive fields (e.g., SSN, tokens) not indexed in plaintext.
- Use hashed/indexed tokens or partial indexes where needed.
-
Service/account lifecycle
- No shared admin accounts.
- Time-bound, purpose-specific service accounts.
- Periodic review of granted privileges.
-
Caching layers
- Sensitive data not cached in plaintext unless justified.
- Redis/Memcached require auth, not publicly exposed.
-
Analytics/ETL exports
- PII masked or de-identified before export.
- Exports encrypted, access-controlled, and scrubbed of secrets.
👉 Critical flags:
- Direct string concatenation in queries = CRITICAL.
- Passing raw user JSON into NoSQL queries without sanitization = CRITICAL.
Provide:
A structured finding report with the following for each issue:
Title, Severity (Critical/High/Medium/Low), CWE (if applicable), Evidence (file, function, line ranges), and a short Why it matters.
Exploitability notes and, where safe, a minimal PoC or reproduction steps (no real secrets).
Remediation: precise code-level fix or config change (snippets welcome), plus defense-in-depth guidance.
A summary risk score (0–10) and top 3–5 prioritized fixes that reduce risk fastest.
A checklist diff: which items from the “Check for” list are Pass/Fail/Not Applicable.
Constraints & style:
Be concrete and cite exact code locations and identifiers.
Prefer minimal, drop-in fix snippets over prose.
Do not invent files or functions that aren’t present; if context is missing, mark as Unable to verify and say what code would prove it.
Write this into a markdown file and place it in the audits/ folder.