agentleFS
epicsagasepicsagas/epic-harness/skills/secure/SKILL.md

secure

Skill20 starsChanged 2 months agoApache-2.0View on GitHub

Security review checklist with optional engagement scoping. Use when auth, DB, API, infra, or secrets code is touched.

  • Reads credentials

4 other projects use a version of this.

Adopted by

Most recently taken up by

The file

We split this skill into the rules it gives an agent

5 rules. 0 are common, 5 are distinctive, and 0 are very specific to this project.

  • 0

    Common

    Most of the 4 edited versions we read keep these.

  • 5

    Distinctive

    This author's own choices. Worth a look.

  • 0

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    NO DEPLOYMENT WITHOUT SECURITY REVIEW OF ALL CHANGED FILES.

    line 11
  2. Distinctive:

    Check for engagement scoping:

    line 17
  3. Distinctive:

    If not found: apply full OWASP Top 10 checklist (default behavior).

    line 29
  4. Distinctive:

    Run the Checklist below, marking each item as pass, fail, or N/A with reason.

    line 39
  5. Distinctive:

    Before claiming security review is complete, show ALL applicable:

    line 95

“Common” is measured: kept by at least 6 in 10 of the 4 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Secure — Security Review

Iron Law

NO DEPLOYMENT WITHOUT SECURITY REVIEW OF ALL CHANGED FILES. Every code change is a potential attack vector.

Process

Step 0: Load Engagement Context (Optional)

Check for engagement scoping:

cat .harness/engagement.md 2>/dev/null

If .harness/engagement.md exists:

  1. Parse the Scope, Constraints, and Exclusions sections
  2. Restrict security checks to in-scope components
  3. Apply rules of engagement (method, rate limits, no-exfil rules)
  4. Skip findings matching exclusion patterns
  5. Include engagement reference in report header

If not found: apply full OWASP Top 10 checklist (default behavior). No scope restrictions.

See references/engagement.md for the engagement file format.

Step 1: Identify Security-Relevant Changes

Identify security-relevant changes from the diff (auth, DB, API, infra, secrets).

Step 2: Run Checklist

Run the Checklist below, marking each item as pass, fail, or N/A with reason.

Step 3: Report

For each failure, cite the file and line number with severity (CRITICAL/HIGH/MEDIUM). Report findings using the Evidence Required section.

When to Trigger

  • Authentication or authorization code changed
  • Database queries written or modified
  • API endpoints added or changed
  • Environment variables or secrets referenced
  • File upload, user input parsing, or serialization code
  • Infrastructure config (Docker, K8s, CI/CD)

Checklist

Injection

  • All user input sanitized/escaped before use in queries — unsanitized input is the #1 attack vector for SQL injection, XSS, and command injection
  • Parameterized queries used (no string concatenation in SQL) — string concatenation enables SQL injection even with escaping; parameterized queries are the only safe default
  • No eval(), exec(), or template injection vectors — these functions execute arbitrary code and bypass all input validation

Authentication & Authorization

  • Auth checks on every protected endpoint — missing checks on a single endpoint exposes the entire system
  • Tokens validated and not just decoded — decoding without signature verification lets attackers forge any token
  • Session expiry and refresh logic correct — stale sessions allow account takeover; refresh token rotation prevents replay attacks
  • No hardcoded credentials or secrets in code — hardcoded secrets end up in version control and are impossible to rotate

Data Exposure

  • Sensitive data not logged (passwords, tokens, PII) — logs are often accessible to more people than the database and persist indefinitely
  • API responses don't leak internal details — stack traces, DB schemas, and server versions help attackers craft targeted exploits
  • Error messages don't reveal system internals — generic errors in production prevent information disclosure; detailed errors belong in server logs only
  • .env files in .gitignore — committed .env files expose secrets permanently even after deletion (git history retains them)

Access Control

  • RBAC/permissions checked before data access — authorization must happen at the data layer, not just the UI layer, to prevent IDOR and privilege escalation
  • No IDOR (Insecure Direct Object Reference) vulnerabilities — replacing an ID in a URL should never grant access to another user's resource
  • Rate limiting on authentication endpoints — without rate limiting, brute-force and credential-stuffing attacks are trivial

See references/security.md for the full OWASP Top 10 checklist.

Anti-Rationalization

ExcuseRebuttalWhat to do instead
"This is internal-only, no security risk"Internal tools get exposed. Assume every endpoint is public-facing.Apply the same security standards as public APIs.
"We'll add security later"Security debt compounds exponentially. Fix it now or pay 10x later.Build it secure from the start. Retrofitting misses edge cases.
"The framework handles security"Frameworks provide tools, not guarantees. OWASP Top 10 still applies.Verify framework defaults and add application-layer checks.
"Security review is overkill for this"One missed injection is a breach. Every input surface matters.Run the checklist. It takes 2 minutes, a breach takes months.
"We'll harden it before production"Security bolted on later is always incomplete.Build it secure now. Retrofitting misses edge cases.
"It's an internal API, no one will abuse it"Lateral movement attacks start from internal APIs.Internal does not mean trusted. Validate and authorize every request.
"I'll just disable CORS for development"Dev shortcuts leak into production.Use a proper CORS allow-list from day one.
"Engagement scoping is bureaucratic overhead"Unscoped assessments waste time on irrelevant surface area.Define scope once, get focused results. Opt-in only.

Evidence Required

Before claiming security review is complete, show ALL applicable:

  • Checklist above completed: each item marked pass or N/A with reason
  • No secrets in code: grep -r "sk-\|password\s*=" --include="*.{ts,js,py}" . shows clean
  • Parameterized queries used: show the query code (no string concat)
  • Auth checks present on new endpoints: show the middleware/guard
  • .env in .gitignore: confirmed
  • Engagement context loaded (or confirmed absent): scope applied to findings

A blank checklist is not a review. Each item needs a pass or N/A.

Red Flags

  • Storing secrets in code or config files committed to git
  • Using HTTP instead of HTTPS for sensitive data
  • eval() or string-concatenated SQL anywhere
  • Skipping engagement scope when .harness/engagement.md is present
  • Reporting findings outside authorized scope as blockers (informational only)

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.