aios-core
Version:
Synkra AIOS: AI-Orchestrated System for Full Stack Development - Core Framework
552 lines (426 loc) • 12.5 kB
Markdown
# Security Checklist Task
Automated security vulnerability scanning for common security anti-patterns.
**Absorbed from:** Auto-Claude PR Review Phase 6.1
## Execution Modes
**Choose your execution mode:**
### 1. YOLO Mode - Fast, Autonomous (0-1 prompts)
- Autonomous scanning with logging
- Minimal user interaction
- **Best for:** CI/CD integration, pre-commit hooks
### 2. Interactive Mode - Balanced, Educational (5-10 prompts) **[DEFAULT]**
- Explains each vulnerability found
- Educational context about risks
- **Best for:** Learning, security training
### 3. Pre-Flight Planning - Comprehensive Upfront Planning
- Full codebase security audit
- Zero ambiguity execution
- **Best for:** Security reviews, audits
**Parameter:** `mode` (optional, default: `interactive`)
## Task Definition (AIOS Task Format V1.0)
```yaml
task: qaSecurityChecklist()
responsavel: Quinn (Guardian)
responsavel_type: Agente
atomic_layer: Molecule
**Entrada:**
- campo: story_id
tipo: string
origem: User Input
obrigatorio: true
validacao: Must be valid story ID format (e.g., "6.3")
- campo: file_paths
tipo: array
origem: git diff or explicit list
obrigatorio: false
validacao: If empty, extracts from uncommitted changes
- campo: severity_threshold
tipo: string
origem: config
obrigatorio: false
validacao: "CRITICAL" | "HIGH" | "MEDIUM" | "LOW" (default: "HIGH")
**Saida:**
- campo: security_report
tipo: object
destino: Return value
persistido: false
- campo: vulnerabilities_found
tipo: number
destino: Memory
persistido: false
- campo: report_file
tipo: file
destino: docs/stories/{story-id}/qa/security_issues.json
persistido: true
```
## Pre-Conditions
**Purpose:** Validate prerequisites BEFORE task execution (blocking)
**Checklist:**
```yaml
pre-conditions:
- [ ] Files to scan exist
tipo: pre-condition
blocker: true
validacao: |
git diff --name-only returns files OR --files provided
error_message: "Pre-condition failed: No files to scan."
- [ ] Grep tool available
tipo: pre-condition
blocker: true
validacao: |
Native Grep tool accessible
error_message: "Pre-condition failed: Grep tool not available."
```
## Post-Conditions
**Purpose:** Validate execution success AFTER task completes
**Checklist:**
```yaml
post-conditions:
- [ ] Security report generated
tipo: post-condition
blocker: true
validacao: |
security_issues.json exists with results
error_message: "Post-condition failed: Security report not generated."
- [ ] All patterns checked
tipo: post-condition
blocker: true
validacao: |
All 8 security patterns scanned
error_message: "Post-condition failed: Not all patterns checked."
```
## Security Patterns (8 Checks)
### Check 1: eval() and Dynamic Code Execution
**Severity:** CRITICAL
**Languages:** JavaScript, TypeScript, Python
```yaml
patterns:
javascript:
- "eval\\("
- "new Function\\("
- "setTimeout\\(['\"`][^'\"]+['\"`]"
- "setInterval\\(['\"`][^'\"]+['\"`]"
python:
- "eval\\("
- "exec\\("
- "compile\\("
risk: Remote Code Execution (RCE)
fix: Use JSON.parse() for data, avoid dynamic code entirely
```
### Check 2: innerHTML and DOM XSS
**Severity:** CRITICAL
**Languages:** JavaScript, TypeScript
```yaml
patterns:
- "\\.innerHTML\\s*="
- "\\.outerHTML\\s*="
- "document\\.write\\("
- "document\\.writeln\\("
risk: Cross-Site Scripting (XSS)
fix: Use textContent, createElement, or sanitization libraries
```
### Check 3: dangerouslySetInnerHTML (React)
**Severity:** CRITICAL
**Languages:** JavaScript, TypeScript (React/JSX)
```yaml
patterns:
- 'dangerouslySetInnerHTML'
risk: Cross-Site Scripting (XSS) in React
fix: Use DOMPurify or avoid entirely
exception: Only if sanitized with DOMPurify.sanitize()
```
### Check 4: shell=True (Python)
**Severity:** CRITICAL
**Languages:** Python
```yaml
patterns:
- "subprocess\\..*shell\\s*=\\s*True"
- "os\\.system\\("
- "os\\.popen\\("
risk: Command Injection
fix: Use subprocess with shell=False and list arguments
```
### Check 5: Hardcoded Secrets
**Severity:** CRITICAL
**Languages:** All
```yaml
patterns:
# API Keys
- "api[_-]?key\\s*[=:]\\s*['\"][^'\"]{10,}['\"]"
- "apikey\\s*[=:]\\s*['\"][^'\"]{10,}['\"]"
# Passwords
- "password\\s*[=:]\\s*['\"][^'\"]+['\"]"
- "passwd\\s*[=:]\\s*['\"][^'\"]+['\"]"
- "pwd\\s*[=:]\\s*['\"][^'\"]+['\"]"
# Tokens
- "token\\s*[=:]\\s*['\"][^'\"]{10,}['\"]"
- "secret\\s*[=:]\\s*['\"][^'\"]{10,}['\"]"
- "bearer\\s+[a-zA-Z0-9_-]{20,}"
# AWS
- 'AKIA[0-9A-Z]{16}'
- 'aws[_-]?secret[_-]?access[_-]?key'
# Private Keys
- '-----BEGIN (RSA |DSA |EC |OPENSSH )?PRIVATE KEY-----'
risk: Credential Exposure
fix: Use environment variables, secrets manager, or .env files
```
### Check 6: SQL Injection Patterns
**Severity:** CRITICAL
**Languages:** JavaScript, TypeScript, Python
```yaml
patterns:
javascript:
- "query\\s*\\(\\s*['\"`].*\\$\\{" # Template literal in query
- "query\\s*\\(.*\\+.*\\)" # String concatenation in query
- "execute\\s*\\(\\s*['\"`].*\\$\\{"
python:
- "execute\\s*\\(\\s*['\"].*%s" # % formatting in SQL
- "execute\\s*\\(.*\\.format\\(" # .format() in SQL
- "execute\\s*\\(.*f['\"]" # f-string in SQL
risk: SQL Injection
fix: Use parameterized queries, ORM, or prepared statements
```
### Check 7: Missing Input Validation
**Severity:** HIGH
**Languages:** JavaScript, TypeScript
```yaml
patterns:
# Express routes without validation
- "req\\.body\\.[a-zA-Z]+[^?]" # Direct access without optional chaining
- "req\\.query\\.[a-zA-Z]+[^?]"
- "req\\.params\\.[a-zA-Z]+[^?]"
risk: Input validation bypass, type confusion
fix: Use Zod, Joi, or express-validator
exception: If validation middleware is present
```
### Check 8: Insecure CORS Configuration
**Severity:** HIGH
**Languages:** JavaScript, TypeScript
```yaml
patterns:
- "origin:\\s*['\"]\\*['\"]" # Allow all origins
- "Access-Control-Allow-Origin.*\\*"
- "cors\\(\\)" # Default CORS without config
risk: Cross-Origin attacks, data theft
fix: Specify allowed origins explicitly
```
## Command
```
*security-check {story-id} [--files file1,file2] [--threshold CRITICAL|HIGH|MEDIUM|LOW]
```
**Parameters:**
- `story-id` (required): Story identifier (e.g., "6.3")
- `--files` (optional): Comma-separated file paths (default: git diff)
- `--threshold` (optional): Minimum severity to report (default: HIGH)
**Examples:**
```bash
*security-check 6.3
*security-check 6.3 --threshold CRITICAL
*security-check 6.3 --files src/api/auth.ts,src/utils/db.ts
```
## Workflow
### Phase 1: Collect Files
1. Get modified files:
```bash
git diff --name-only HEAD~1
```
2. Filter by extension:
```
.js, .ts, .jsx, .tsx, .py, .mjs, .cjs
```
3. Exclude test files (optional):
```
*.test.*, *.spec.*, __tests__/*
```
### Phase 2: Run Security Scans
For each security check:
1. Build grep pattern for the check
2. Scan all relevant files
3. For each match:
- Extract line number
- Extract code context (3 lines before/after)
- Classify severity
- Generate fix suggestion
### Phase 3: Context Analysis
For each potential issue:
1. Check for false positives:
- Is it in a comment?
- Is it in a test file?
- Is there sanitization nearby?
- Is it a false pattern match?
2. Validate severity:
- Is user input involved?
- Is it in a sensitive context?
- Is there compensating control?
### Phase 4: Generate Report
```json
{
"timestamp": "2026-01-29T10:00:00Z",
"story_id": "6.3",
"summary": {
"critical": 2,
"high": 1,
"medium": 0,
"low": 0,
"total": 3
},
"issues": [...],
"scan_coverage": {
"files_scanned": 15,
"patterns_checked": 8,
"lines_analyzed": 2500
}
}
```
## Issue Format
```json
{
"id": "SEC-001",
"check": "EVAL_USAGE",
"severity": "CRITICAL",
"file": "src/utils/parser.ts",
"line": 45,
"column": 12,
"code": "const result = eval(userInput);",
"context": {
"before": ["function parseExpression(userInput) {", " // Parse user expression"],
"after": [" return result;", "}"]
},
"risk": "Remote Code Execution (RCE) - User input is directly evaluated",
"fix": {
"description": "Use a safe expression parser library",
"suggestion": "const result = safeEval(userInput, { timeout: 1000 });",
"references": ["https://owasp.org/www-community/attacks/Code_Injection"]
},
"false_positive_check": {
"in_comment": false,
"in_test": false,
"has_sanitization": false
}
}
```
## Severity Mapping
| Check | Default Severity | Blocking |
| ------------------------ | ---------------- | ----------- |
| eval() / exec() | CRITICAL | Yes |
| innerHTML / XSS | CRITICAL | Yes |
| dangerouslySetInnerHTML | CRITICAL | Yes |
| shell=True | CRITICAL | Yes |
| Hardcoded Secrets | CRITICAL | Yes |
| SQL Injection | CRITICAL | Yes |
| Missing Input Validation | HIGH | Recommended |
| Insecure CORS | HIGH | Recommended |
## Integration with QA Review
This task integrates into the QA review pipeline:
```
*review-build {story}
├── Phase 1-5: Standard checks
├── Phase 6.0: Library Validation
├── Phase 6.1: Security Checklist ← THIS TASK
├── Phase 6.2: Migration Validation
└── Phase 7-10: Continue review
```
**Trigger:** Automatically called during `*review-build`
**Manual:** Can be run standalone via `*security-check`
## False Positive Handling
### Known False Positives
1. **Test files using dangerous patterns intentionally**
- Resolution: Exclude test files or mark as accepted
2. **Comments describing vulnerabilities**
- Resolution: Check if match is in comment context
3. **Documentation/examples**
- Resolution: Exclude .md files and example directories
4. **Sanitized dangerouslySetInnerHTML**
- Resolution: Check for DOMPurify.sanitize() nearby
### Suppression
Add comment to suppress specific lines:
```javascript
// security-ignore: SEC-001 - sanitized via DOMPurify
const html = DOMPurify.sanitize(userContent);
element.innerHTML = html; // This line won't be flagged
```
## Example Output
```json
{
"timestamp": "2026-01-29T10:30:00Z",
"story_id": "6.3",
"summary": {
"critical": 2,
"high": 1,
"medium": 0,
"low": 0,
"total": 3,
"blocking": true
},
"issues": [
{
"id": "SEC-001",
"check": "HARDCODED_SECRET",
"severity": "CRITICAL",
"file": "src/config/api.ts",
"line": 12,
"code": "const API_KEY = 'sk-live-abc123xyz789';",
"risk": "API key exposed in source code",
"fix": {
"description": "Use environment variable",
"suggestion": "const API_KEY = process.env.API_KEY;"
}
},
{
"id": "SEC-002",
"check": "SQL_INJECTION",
"severity": "CRITICAL",
"file": "src/api/users.ts",
"line": 28,
"code": "db.query(`SELECT * FROM users WHERE id = ${userId}`)",
"risk": "SQL injection via template literal",
"fix": {
"description": "Use parameterized query",
"suggestion": "db.query('SELECT * FROM users WHERE id = $1', [userId])"
}
},
{
"id": "SEC-003",
"check": "MISSING_VALIDATION",
"severity": "HIGH",
"file": "src/api/auth.ts",
"line": 15,
"code": "const email = req.body.email;",
"risk": "Direct access without validation",
"fix": {
"description": "Add input validation",
"suggestion": "const { email } = validateLoginInput(req.body);"
}
}
],
"scan_coverage": {
"files_scanned": 8,
"patterns_checked": 8,
"lines_analyzed": 1200
},
"recommendation": "BLOCK - 2 CRITICAL issues must be fixed before merge"
}
```
## Exit Criteria
This task is complete when:
- All 8 security patterns scanned
- All modified files analyzed
- False positives filtered
- Report generated with severity classification
- Blocking recommendation provided
- Issues integrated into QA review
_Absorbed from Auto-Claude PR Review System - Phase 6.1_
_AIOS QA Enhancement v1.0_