SAST Vulnerability Analysis
Purpose
Systematically analyze source code for security vulnerabilities using structured Source→Sink taint tracking,
pattern matching, and vulnerability-class-specific detection heuristics. Produce actionable findings with
severity ratings, affected code locations (file + line number), and remediation guidance.
Scope
This skill covers the following 34 vulnerability classes. Each has a dedicated vulnerability knowledge file loaded on demand:
| Category |
Vulnerabilities |
| Injection |
SQL Injection, XSS, SSTI, NoSQL Injection, GraphQL Injection, XXE, RCE / Command Injection, Expression Language Injection |
| Access Control & Auth |
IDOR, Privilege Escalation, Authentication/JWT, Default Credentials, Brute Force, Business Logic, HTTP Method Tampering, Verification Code Abuse, Session Fixation |
| Data Exposure & Crypto |
Weak Crypto/Hash, Information Disclosure, Insecure Cookie, Trust Boundary |
| Server-Side |
SSRF, Path Traversal/LFI/RFI, Insecure Deserialization, Arbitrary File Upload, JNDI Injection, Race Conditions |
| Protocol & Infrastructure |
CSRF, Open Redirect, HTTP Request Smuggling/Desync, Denial of Service, CVE Patterns |
| Language/Platform |
PHP Security, Mobile Security (Android/iOS) |
Workflow
Step 1: Understand Scope
Determine:
- Target: single file, directory, API endpoint, module, or full repo
- Language(s) and framework(s) in use
- User's goal: quick scan, deep audit, specific vuln class, or full report
Step 2: Load Relevant Knowledge Files
Based on the code being reviewed, load the appropriate vulnerability knowledge files from references/:
references/sql_injection.md — SQL / ORM injection
references/xss.md — Cross-site scripting
references/ssrf.md — Server-side request forgery
references/rce.md — Remote code execution
references/idor.md — Insecure direct object reference
references/authentication_jwt.md — Auth flaws, JWT weaknesses
references/csrf.md — Cross-site request forgery
references/path_traversal_lfi_rfi.md — Path traversal, LFI/RFI
references/ssti.md — Server-side template injection
references/xxe.md — XML external entity
references/insecure_deserialization.md — Insecure deserialization
references/arbitrary_file_upload.md — Arbitrary file upload
references/privilege_escalation.md — Privilege escalation
references/nosql_injection.md — NoSQL injection
references/graphql_injection.md — GraphQL injection
references/weak_crypto_hash.md — Weak cryptography / hash
references/information_disclosure.md — Information disclosure
references/insecure_cookie.md — Insecure cookie attributes
references/open_redirect.md — Open redirect
references/trust_boundary.md — Trust boundary violations
references/race_conditions.md — Race conditions / TOCTOU
references/brute_force.md — Brute force / credential stuffing
references/default_credentials.md — Default / hardcoded credentials
references/verification_code_abuse.md — Verification code abuse
references/business_logic.md — Business logic flaws
references/http_method_tamper.md — HTTP method tampering
references/smuggling_desync.md — HTTP request smuggling / desync
references/cve_patterns.md — Known CVE patterns
references/expression_language_injection.md — Expression language injection (SpEL / OGNL)
references/jndi_injection.md — JNDI injection (Log4Shell class)
references/denial_of_service.md — Denial of service / resource exhaustion
references/php_security.md — PHP-specific security issues
references/mobile_security.md — Mobile security (Android / iOS)
references/session_fixation.md — Session fixation
Loading strategy:
- For a targeted review (e.g., "check for SQL injection"), load only the relevant knowledge file(s).
- For a full audit, load all 34 coverage files and scan systematically.
- Always load knowledge files for the top OWASP risks even if not explicitly requested.
Step 3: Analyze Code — Source→Sink Taint Tracking
For each loaded vulnerability class, perform taint analysis:
Identify Sources — User-controlled input entry points:
- HTTP params, headers, cookies, request body
- File uploads
- WebSocket messages
- Environment variables
- Database reads of user-supplied data, deserialized objects
Trace Data Flow — Follow the data through:
- Variable assignments, function arguments, return values
- Framework helpers, ORM calls, template rendering
- Cross-module/service boundaries
Check Sinks — Dangerous operations receiving tainted data:
- Query execution (SQL, NoSQL, LDAP, XPath)
- Shell/OS command execution
- File system operations
- HTTP client calls
- Template rendering / eval / expression parsing
- Serialization/deserialization
Evaluate Sanitization — Between source and sink, look for:
- Input validation (allowlist vs denylist)
- Context-appropriate encoding/escaping
- Parameterization (prepared statements)
- Framework-native protections
Determine Preliminary Verdict:
- VULN: Taint reaches sink with no effective sanitization
- LIKELY VULN: Sanitization present but bypassable per reference heuristics
- SAFE: Effective sanitization or no taint path
Step 4: Business Logic & Auth Analysis
Beyond taint tracking, check for:
- Missing authentication/authorization on sensitive endpoints
- Insecure state machine transitions
- Race conditions in concurrent operations
- Improper trust boundaries between components
- JWT algorithm confusion, token fixation, session issues
- Default/hardcoded credentials
- Enumeration via timing or response differences
Step 5: Judge — Validity Re-Verification
Before reporting, every preliminary finding (VULN or LIKELY VULN) must pass a Judge review. The Judge acts as an adversarial second opinion to eliminate false positives.
For each candidate finding, answer all of the following:
Reachability Check
Sanitization Re-Evaluation
Exploitability Check
Judge Verdict
| Verdict |
Meaning |
Action |
| CONFIRMED |
All reachability/sanitization/exploitability checks pass |
Include in report |
| LIKELY |
Most checks pass; one uncertainty remains |
Include in report, flag uncertainty |
| NEEDS CONTEXT |
Cannot determine without runtime behavior / config / additional files |
Note as "unverifiable without X" |
| FALSE POSITIVE |
A check definitively fails |
Drop silently |
Only CONFIRMED and LIKELY findings are reported.
Judge Output Format (internal, before reporting)
Finding: VULN-NNN — <class>
Reachability: PASS / FAIL / UNCERTAIN — <reason>
Sanitization: PASS / FAIL / UNCERTAIN — <reason>
Exploitability: PASS / FAIL / UNCERTAIN — <reason>
Judge Verdict: CONFIRMED / LIKELY / NEEDS CONTEXT / FALSE POSITIVE
False Positive Guardrails
- Do not emit
default_credentials unless there is a reachable authentication path that accepts a hardcoded, documented, factory, or seeded credential pair.
- Do not emit
weak_crypto_hash when the evidence only shows a vulnerable third-party component or a generic cryptography import. Require direct use of weak hashes, broken password storage, or unsafe signing.
- Tag clarification:
weak_crypto_hash is the canonical tag for both weak cryptographic algorithms (DES, RC4, ECB mode) and weak hash functions (MD5, SHA-1 for passwords). Do not use weak_crypto as a separate tag unless the benchmark ground truth explicitly requires it; prefer weak_crypto_hash to avoid tag fragmentation.
- Do not emit generic
rce when the code shows direct shell/process execution — prefer command_injection.
- Do not replace
spel_injection with command_injection or rce when the exploit primitive is Spring EL expression parsing.
- Do not emit
jndi_injection for component demos unless the JNDI sink itself is the primary exploit path.
- Do not emit broad tags (
trust_boundary, authentication, privilege_escalation) when a narrower precise tag is supported (xff_spoofing, session_fixation, verification_code).
- Do not emit
open_redirect for infrastructure/parser misconfiguration unless attacker-controlled redirect response is the primary exploit.
- Do not emit
denial_of_service merely because a path lacks size/rate limits — require explicit evidence that resource exhaustion is the primary impact.
- Do not emit
brute_force merely because a login endpoint lacks visible rate limiting — rate limiting may exist at infrastructure level. Require explicit evidence of unlimited attempt processing.
- Do not emit
csrf for stateless APIs using Bearer-token-only authentication with SessionCreationPolicy.STATELESS.
- Do not emit
insecure_deserialization when the same sink is already covered by component_vulnerability (e.g., Fastjson autoType) unless a separate deserialization path exists.
- Do not emit
arbitrary_file_upload for profile/avatar image upload with type restrictions and non-webroot storage.
- Do not emit
session_fixation when Spring Security default session management is active (migrateSession is the default).
- Do not emit
information_disclosure for database credentials in application config files — these are deployment issues, not application-level disclosure.
Step 6: Report Findings
Severity Classification
| Severity |
Criteria |
| Critical |
Direct RCE, authentication bypass, unauthenticated data exposure |
| High |
SQLi, SSRF, IDOR with sensitive data, stored XSS, privilege escalation |
| Medium |
Reflected XSS, CSRF, path traversal, insecure deserialization |
| Low |
Information disclosure, open redirect, weak crypto, insecure cookie |
| Info |
Missing security headers, verbose errors, defense-in-depth gaps |
Finding Format
[SEVERITY] VULN-NNN — <Vulnerability Class> [CONFIRMED | LIKELY]
File: <path>:<line_number>
Description: <one sentence — what the vulnerability is>
Impact: <what an attacker can achieve>
Evidence:
<relevant code snippet>
Judge: <one sentence — why this passed re-verification>
Remediation: <specific fix — not generic advice>
For NEEDS CONTEXT findings:
[UNVERIFIABLE] VULN-NNN — <Vulnerability Class>
File: <path>:<line_number>
Blocked by: <what additional context is needed>
Report Structure
When producing a full report, write to sast_report.md (or user-specified path):
# SAST Security Report — <target>
Date: <date>
Analyzer: eresus-sast-scanner v1.3
## Executive Summary
<2-3 sentences: total findings by severity, most critical issue>
## Critical Findings
## High Findings
## Medium Findings
## Low Findings
## Informational
## Unverifiable Findings
## Remediation Priority
<ordered fix list>
Key Principles
- Evidence over assertion: always show the vulnerable code path, not just the pattern name
- Context matters: a finding is only valid if the sink is reachable with user-controlled data
- Avoid false positives: if sanitization exists, verify it is bypassable before marking VULN
- Be precise: include exact file paths and line numbers — never approximate
- Fix > flag: always provide a concrete remediation, not just a problem statement
- Language-aware: adapt sink/source patterns to the specific language and framework in use
1---2name: eresus-sast-scanner3description: General-purpose Static Application Security Testing (SAST) skill for code vulnerability analysis. Trigger when the user asks to: "analyze code for vulnerabilities", "review code security", "find security bugs", "do a SAST scan", "check for [vulnerability type] in code", "audit source code", or requests a security code review of any language or framework. Covers 34 vulnerability classes across web, API, auth, mobile, and logic layers.4---5
6# SAST Vulnerability Analysis
7
8## Purpose
9
10Systematically analyze source code for security vulnerabilities using structured Source→Sink taint tracking,
11pattern matching, and vulnerability-class-specific detection heuristics. Produce actionable findings with
12severity ratings, affected code locations (file + line number), and remediation guidance.
13
14## Scope
15
16This skill covers the following 34 vulnerability classes. Each has a dedicated vulnerability knowledge file loaded on demand:
17
18| Category | Vulnerabilities |
19|----------|----------------|
20| **Injection** | SQL Injection, XSS, SSTI, NoSQL Injection, GraphQL Injection, XXE, RCE / Command Injection, Expression Language Injection |
21| **Access Control & Auth** | IDOR, Privilege Escalation, Authentication/JWT, Default Credentials, Brute Force, Business Logic, HTTP Method Tampering, Verification Code Abuse, Session Fixation |
22| **Data Exposure & Crypto** | Weak Crypto/Hash, Information Disclosure, Insecure Cookie, Trust Boundary |
23| **Server-Side** | SSRF, Path Traversal/LFI/RFI, Insecure Deserialization, Arbitrary File Upload, JNDI Injection, Race Conditions |
24| **Protocol & Infrastructure** | CSRF, Open Redirect, HTTP Request Smuggling/Desync, Denial of Service, CVE Patterns |
25| **Language/Platform** | PHP Security, Mobile Security (Android/iOS) |
26
27---
28
29## Workflow
30
31### Step 1: Understand Scope
32
33Determine:
34- Target: single file, directory, API endpoint, module, or full repo
35- Language(s) and framework(s) in use
36- User's goal: quick scan, deep audit, specific vuln class, or full report
37
38### Step 2: Load Relevant Knowledge Files
39
40Based on the code being reviewed, load the appropriate vulnerability knowledge files from `references/`:
41
42```
43references/sql_injection.md — SQL / ORM injection
44references/xss.md — Cross-site scripting
45references/ssrf.md — Server-side request forgery
46references/rce.md — Remote code execution
47references/idor.md — Insecure direct object reference
48references/authentication_jwt.md — Auth flaws, JWT weaknesses
49references/csrf.md — Cross-site request forgery
50references/path_traversal_lfi_rfi.md — Path traversal, LFI/RFI
51references/ssti.md — Server-side template injection
52references/xxe.md — XML external entity
53references/insecure_deserialization.md — Insecure deserialization
54references/arbitrary_file_upload.md — Arbitrary file upload
55references/privilege_escalation.md — Privilege escalation
56references/nosql_injection.md — NoSQL injection
57references/graphql_injection.md — GraphQL injection
58references/weak_crypto_hash.md — Weak cryptography / hash
59references/information_disclosure.md — Information disclosure
60references/insecure_cookie.md — Insecure cookie attributes
61references/open_redirect.md — Open redirect
62references/trust_boundary.md — Trust boundary violations
63references/race_conditions.md — Race conditions / TOCTOU
64references/brute_force.md — Brute force / credential stuffing
65references/default_credentials.md — Default / hardcoded credentials
66references/verification_code_abuse.md — Verification code abuse
67references/business_logic.md — Business logic flaws
68references/http_method_tamper.md — HTTP method tampering
69references/smuggling_desync.md — HTTP request smuggling / desync
70references/cve_patterns.md — Known CVE patterns
71references/expression_language_injection.md — Expression language injection (SpEL / OGNL)
72references/jndi_injection.md — JNDI injection (Log4Shell class)
73references/denial_of_service.md — Denial of service / resource exhaustion
74references/php_security.md — PHP-specific security issues
75references/mobile_security.md — Mobile security (Android / iOS)
76references/session_fixation.md — Session fixation
77```
78
79**Loading strategy:**
80- For a targeted review (e.g., "check for SQL injection"), load only the relevant knowledge file(s).
81- For a full audit, load all 34 coverage files and scan systematically.
82- Always load knowledge files for the top OWASP risks even if not explicitly requested.
83
84---
85
86### Step 3: Analyze Code — Source→Sink Taint Tracking
87
88For each loaded vulnerability class, perform taint analysis:
89
901. **Identify Sources** — User-controlled input entry points:
91 - HTTP params, headers, cookies, request body
92 - File uploads
93 - WebSocket messages
94 - Environment variables
95 - Database reads of user-supplied data, deserialized objects
96
972. **Trace Data Flow** — Follow the data through:
98 - Variable assignments, function arguments, return values
99 - Framework helpers, ORM calls, template rendering
100 - Cross-module/service boundaries
101
1023. **Check Sinks** — Dangerous operations receiving tainted data:
103 - Query execution (SQL, NoSQL, LDAP, XPath)
104 - Shell/OS command execution
105 - File system operations
106 - HTTP client calls
107 - Template rendering / eval / expression parsing
108 - Serialization/deserialization
109
1104. **Evaluate Sanitization** — Between source and sink, look for:
111 - Input validation (allowlist vs denylist)
112 - Context-appropriate encoding/escaping
113 - Parameterization (prepared statements)
114 - Framework-native protections
115
1165. **Determine Preliminary Verdict**:
117 - **VULN**: Taint reaches sink with no effective sanitization
118 - **LIKELY VULN**: Sanitization present but bypassable per reference heuristics
119 - **SAFE**: Effective sanitization or no taint path
120
121---
122
123### Step 4: Business Logic & Auth Analysis
124
125Beyond taint tracking, check for:
126- Missing authentication/authorization on sensitive endpoints
127- Insecure state machine transitions
128- Race conditions in concurrent operations
129- Improper trust boundaries between components
130- JWT algorithm confusion, token fixation, session issues
131- Default/hardcoded credentials
132- Enumeration via timing or response differences
133
134---
135
136### Step 5: Judge — Validity Re-Verification
137
138Before reporting, every preliminary finding (VULN or LIKELY VULN) **must pass a Judge review**. The Judge acts as an adversarial second opinion to eliminate false positives.
139
140For each candidate finding, answer all of the following:
141
142#### Reachability Check
143- [ ] Is the source actually user-controlled, or is it internal/trusted data?
144- [ ] Is the vulnerable code path reachable from an HTTP endpoint / entry point, or is it dead code / internal-only?
145- [ ] Are there upstream guards (auth middleware, input filters) that block the path before it reaches the sink?
146
147#### Sanitization Re-Evaluation
148- [ ] Is there sanitization that was missed in Step 3? (Check parent functions, middleware, framework internals)
149- [ ] Is the sanitization method sufficient for this specific sink and context?
150- [ ] Does the framework provide implicit protection for this pattern?
151
152#### Exploitability Check
153- [ ] Can the tainted value actually reach the sink in a form that triggers the vulnerability?
154- [ ] Is exploitation conditional on a specific environment, config, or privilege level?
155- [ ] For logic bugs: is the business impact real, or hypothetical?
156- [ ] Is the chosen tag the most precise valid label for this finding?
157
158#### Judge Verdict
159
160| Verdict | Meaning | Action |
161|---------|---------|--------|
162| **CONFIRMED** | All reachability/sanitization/exploitability checks pass | Include in report |
163| **LIKELY** | Most checks pass; one uncertainty remains | Include in report, flag uncertainty |
164| **NEEDS CONTEXT** | Cannot determine without runtime behavior / config / additional files | Note as "unverifiable without X" |
165| **FALSE POSITIVE** | A check definitively fails | Drop silently |
166
167**Only CONFIRMED and LIKELY findings are reported.**
168
169#### Judge Output Format (internal, before reporting)
170
171```
172Finding: VULN-NNN — <class>
173Reachability: PASS / FAIL / UNCERTAIN — <reason>
174Sanitization: PASS / FAIL / UNCERTAIN — <reason>
175Exploitability: PASS / FAIL / UNCERTAIN — <reason>
176Judge Verdict: CONFIRMED / LIKELY / NEEDS CONTEXT / FALSE POSITIVE
177```
178
179#### False Positive Guardrails
180
181- Do not emit `default_credentials` unless there is a reachable authentication path that accepts a hardcoded, documented, factory, or seeded credential pair.
182- Do not emit `weak_crypto_hash` when the evidence only shows a vulnerable third-party component or a generic cryptography import. Require direct use of weak hashes, broken password storage, or unsafe signing.
183- **Tag clarification**: `weak_crypto_hash` is the canonical tag for both weak cryptographic algorithms (DES, RC4, ECB mode) and weak hash functions (MD5, SHA-1 for passwords). Do not use `weak_crypto` as a separate tag unless the benchmark ground truth explicitly requires it; prefer `weak_crypto_hash` to avoid tag fragmentation.
184- Do not emit generic `rce` when the code shows direct shell/process execution — prefer `command_injection`.
185- Do not replace `spel_injection` with `command_injection` or `rce` when the exploit primitive is Spring EL expression parsing.
186- Do not emit `jndi_injection` for component demos unless the JNDI sink itself is the primary exploit path.
187- Do not emit broad tags (`trust_boundary`, `authentication`, `privilege_escalation`) when a narrower precise tag is supported (`xff_spoofing`, `session_fixation`, `verification_code`).
188- Do not emit `open_redirect` for infrastructure/parser misconfiguration unless attacker-controlled redirect response is the primary exploit.
189- Do not emit `denial_of_service` merely because a path lacks size/rate limits — require explicit evidence that resource exhaustion is the primary impact.
190- Do not emit `brute_force` merely because a login endpoint lacks visible rate limiting — rate limiting may exist at infrastructure level. Require explicit evidence of unlimited attempt processing.
191- Do not emit `csrf` for stateless APIs using Bearer-token-only authentication with `SessionCreationPolicy.STATELESS`.
192- Do not emit `insecure_deserialization` when the same sink is already covered by `component_vulnerability` (e.g., Fastjson autoType) unless a separate deserialization path exists.
193- Do not emit `arbitrary_file_upload` for profile/avatar image upload with type restrictions and non-webroot storage.
194- Do not emit `session_fixation` when Spring Security default session management is active (migrateSession is the default).
195- Do not emit `information_disclosure` for database credentials in application config files — these are deployment issues, not application-level disclosure.
196
197---
198
199### Step 6: Report Findings
200
201#### Severity Classification
202
203| Severity | Criteria |
204|----------|----------|
205| **Critical** | Direct RCE, authentication bypass, unauthenticated data exposure |
206| **High** | SQLi, SSRF, IDOR with sensitive data, stored XSS, privilege escalation |
207| **Medium** | Reflected XSS, CSRF, path traversal, insecure deserialization |
208| **Low** | Information disclosure, open redirect, weak crypto, insecure cookie |
209| **Info** | Missing security headers, verbose errors, defense-in-depth gaps |
210
211#### Finding Format
212
213```
214[SEVERITY] VULN-NNN — <Vulnerability Class> [CONFIRMED | LIKELY]
215File: <path>:<line_number>
216Description: <one sentence — what the vulnerability is>
217Impact: <what an attacker can achieve>
218Evidence:
219 <relevant code snippet>
220Judge: <one sentence — why this passed re-verification>
221Remediation: <specific fix — not generic advice>
222```
223
224For NEEDS CONTEXT findings:
225
226```
227[UNVERIFIABLE] VULN-NNN — <Vulnerability Class>
228File: <path>:<line_number>
229Blocked by: <what additional context is needed>
230```
231
232#### Report Structure
233
234When producing a full report, write to `sast_report.md` (or user-specified path):
235
236```markdown
237# SAST Security Report — <target>
238Date: <date>
239Analyzer: eresus-sast-scanner v1.3
240
241## Executive Summary
242<2-3 sentences: total findings by severity, most critical issue>
243
244## Critical Findings
245## High Findings
246## Medium Findings
247## Low Findings
248## Informational
249## Unverifiable Findings
250
251## Remediation Priority
252<ordered fix list>
253```
254
255---
256
257## Key Principles
258
259- **Evidence over assertion**: always show the vulnerable code path, not just the pattern name
260- **Context matters**: a finding is only valid if the sink is reachable with user-controlled data
261- **Avoid false positives**: if sanitization exists, verify it is bypassable before marking VULN
262- **Be precise**: include exact file paths and line numbers — never approximate
263- **Fix > flag**: always provide a concrete remediation, not just a problem statement
264- **Language-aware**: adapt sink/source patterns to the specific language and framework in use