owasp-security-review
Skill0 starsChanged 10 days agoMITView on GitHub
Code-level security review of a whole codebase or named files based on the OWASP Top 10 and OWASP ASVS - injection, XSS, broken access control and IDOR, authentication and session flaws, weak crypto, insecure deserialization, SSRF, path traversal, unsafe uploads, CSRF, XXE, open redirects and security misconfiguration - with the attack scenario for each finding but no exploit payloads. Use when asked for a security review/audit of code, OWASP check, "is my code secure", vulnerability review or secure coding review (for reviewing only the pending branch diff, Claude Code's built-in security-review also exists).
- Pipes a download into a shell
2 other projects use a version of this.
Adopted by
Most recently taken up by
- mykaelalexandre/agent-skillstheir own version, first seen Oct 25, 2026
- jgamaraalv/delivery-looptheir own version, first seen Jul 4, 2026
Other versions2 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 2
- jgamaraalv/delivery-loop★ 0same name
- mykaelalexandre/agent-skills★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository28 other files it gives its agents.
- accessibility-auditSkill
- api-design-reviewSkill
- architecture-reviewSkill
- complexity-checkSkill
- concurrency-reviewSkill
- config-reviewSkill
- cpp-google-styleSkill
- csharp-google-styleSkill
- dead-code-finderSkill
- dependency-auditSkill
- doc-comment-auditSkill
- error-handling-reviewSkill
- full-reviewSkill
- java-google-styleSkill
- logging-reviewSkill
- markdown-readme-google-styleSkill
- naming-reviewSkill
- performance-reviewSkill
- privacy-reviewSkill
- python-google-styleSkill
- regex-reviewSkill
- repo-hygieneSkill
- review-without-fixingSkill
- secrets-scanSkill
- shell-google-styleSkill
- sql-reviewSkill
- test-coverage-reviewSkill
- todo-auditSkill
The file
We split this skill into the rules it gives an agent
5 rules. About 0 are common, 4 are distinctive, and 1 is very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈4
Distinctive · estimate
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 13
Check the files/directories the user names, otherwise the whole repo.
- Distinctive: line 20
Check access control on every state-changing or data-returning entry point (SE3).
- Distinctive: line 60
Every finding has a concrete location and a source → sink path.
- Distinctive: line 61
No exploit payloads, no weaponized requests.
- Distinctive: line 63
Do not change code. Apply fixes only when the user explicitly asks for it.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
OWASP security review
Review only: report findings, never change code unless the user explicitly asks. Describe the attack, not the weapon: no working exploit payloads, no step-by-step exploitation, no scanning or attacking of running systems.
Sources: https://owasp.org/Top10/ · https://owasp.org/www-project-application-security-verification-standard/ · https://cheatsheetseries.owasp.org/
Scope
Check the files/directories the user names, otherwise the whole repo. Focus on code reachable from external input. Skip .git/, build output, vendor/, node_modules/, .venv/, generated code; tests only when they reveal production behavior.
Related skills (point to them instead of repeating their rules): SQL injection → sql-review; secrets in code → secrets-scan; vulnerable dependencies → dependency-audit; leaking error messages → error-handling-review; missing security logging → logging-review.
Steps
- Map the attack surface: entry points (HTTP routes, controllers, CLI args, message consumers, file imports, webhooks), auth mechanism, frameworks and their security defaults.
- For each entry point trace data from source (request params, headers, cookies, body, uploaded files, external messages) to sink (shell, file system, HTML output, deserializer, URL fetcher, redirect, query, template).
- Check access control on every state-changing or data-returning entry point (SE3).
- Grep for dangerous sinks (table below) to catch what tracing missed. Use
semgrep --config autoor the framework's analyzer if installed (never install; mention if it would help). - Report (format below).
Rules (with OWASP category)
- SE1 error (Injection): OS command (
shell=True,Runtime.exec/ProcessBuilderwith concatenation,child_process.exec,system()), template injection, LDAP/XPath, NoSQL ($where, operator objects from user JSON),eval/Function/execon input - SE2 error (Injection/XSS): untrusted data rendered unescaped:
innerHTML,dangerouslySetInnerHTML,v-html,{@html},document.write,|safe,Html.Raw,th:utext, HTML built by string concatenation,hreffrom input without scheme check (javascript:) - SE3 error (Broken Access Control): entry point without authentication/authorization check; IDOR (object loaded by an ID from the request without an ownership check); authorization only in the UI; mass assignment (request body bound directly to an entity incl.
isAdmin/role) - SE4 error (Authentication Failures): passwords stored plain or with fast hashes (MD5, SHA-1, unsalted SHA-256) instead of Argon2/bcrypt/scrypt/PBKDF2; JWT decoded without signature verification or
alg: noneaccepted; session not renewed after login; warning: no rate limiting/lockout on login (possible); secrets compared with==(timing) - SE5 error (Cryptographic Failures): ECB mode, static/reused IV or nonce, DES/RC4,
Math.random/random/rand()for tokens or IDs; TLS verification disabled (verify=False,rejectUnauthorized: false,InsecureSkipVerify, certificate callbacks returningtrue) - SE6 error (Data Integrity Failures): deserializing untrusted data with
pickle,yaml.load(notsafe_load),ObjectInputStream,BinaryFormatter, PHPunserialize, Json.NETTypeNameHandling.All/Auto - SE7 error (SSRF): server fetches a user-supplied URL without allowlist (incl. redirects, internal IPs, cloud metadata endpoints)
- SE8 error (Broken Access Control): path traversal - file paths built from input without canonicalizing and checking the base directory; zip slip when extracting archives
- SE9 warning: unsafe file upload - no type/size check, stored in the web root, original filename used as path
- SE10 warning (CSRF): state change via
GET; cookie-based auth without CSRF token /SameSite; CSRF protection disabled - SE11 warning (Security Misconfiguration): debug mode on in production config, CORS
*together with credentials, cookies withoutSecure/HttpOnly/SameSite, missing security headers (CSP, HSTS,X-Content-Type-Options) where the app sets headers, default credentials - SE12 warning: open redirect - redirect target taken from input without allowlist
- SE13 error (XXE): XML parsers with external entities/DTDs enabled (
DocumentBuilderFactorydefaults,XmlDocumentwith resolver,lxmlresolve_entities=True) - SE14 warning (Integrity): downloading and executing code without verification (
curl | sh), loading plugins/modules by name from input - SE15 info (Insecure Design): missing limits that enable abuse (no size limits on requests/uploads, unbounded loops on user input) - possible
Dangerous sinks to grep (starting points)
| Language | Sinks |
| Python | subprocess(..., shell=True), os.system, eval, exec, pickle.load, yaml.load, open( with request data, requests.get( with user URL, render_template_string, |safe, verify=False |
| JS / TS | child_process.exec, eval, new Function, innerHTML, dangerouslySetInnerHTML, v-html, res.redirect(req., fetch(/axios( with user URL, fs.*( with request data, rejectUnauthorized: false |
| Java / Kotlin | Runtime.exec, ProcessBuilder, ObjectInputStream, DocumentBuilderFactory, new File( with input, sendRedirect, Cipher.getInstance("AES") (ECB default), MessageDigest.getInstance("MD5") |
| C# | Process.Start, BinaryFormatter, TypeNameHandling, Html.Raw, XmlDocument, Path.Combine with input, Redirect( with input, MD5.Create |
| PHP | exec, system, shell_exec, eval, unserialize, include $, echo $_GET |
| Go | exec.Command("sh", "-c", ...), template.HTML(, http.Get( with user URL, filepath.Join with input, InsecureSkipVerify |
| C / C++ | system, popen, sprintf/strcpy into fixed buffers, format strings from input (printf(user)) |
False positives to drop
Values that are constants or come from trusted config only · sinks behind a proper allowlist or sanitizer (name it) · framework auto-escaping that is active (React JSX, Razor, Jinja2 autoescape) unless explicitly bypassed · test code that never ships · admin-only tools where the user explicitly accepts the risk (still report as info).
Report
In the user's language, grouped by file, most severe first:
path/to/file:line - error|warning|info - <ID> <OWASP category> - source: <input> → sink: <call> - <attack scenario in one sentence, e.g. "a logged-in user can read other users' invoices by changing the id"> - direction: <what the defense must achieve>- Every finding has a concrete location and a source → sink path. Mark findings with unclear reachability as "possible".
- No exploit payloads, no weaponized requests; at most a minimal description of the malicious input class.
- End with a summary: attack surface (entry points, auth), findings per severity, then the 3 most important things to fix first. Recommend a professional penetration test for production systems handling sensitive data - a static review is not a security guarantee.
- Do not change code. Apply fixes only when the user explicitly asks for it.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
Reviews can't be read right now.
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.

