@sun-asterisk/sunlint
Version:
☀️ SunLint - Multi-language static analysis tool for code quality and security | Sun* Engineering Standards
57 lines (56 loc) • 2.18 kB
JSON
{
"ruleId": "S011",
"name": "Secure GUID Generation",
"description": "GUIDs used for security purposes must be generated according to UUID v4 standard with CSPRNG",
"category": "security",
"severity": "error",
"languages": ["All languages"],
"tags": [
"security",
"owasp",
"cryptographic-failures",
"uuid",
"guid",
"randomness"
],
"enabled": true,
"fixable": false,
"engine": "heuristic",
"metadata": {
"owaspCategory": "A02:2021 - Cryptographic Failures",
"cweId": "CWE-338",
"description": "Using weak or predictable methods to generate GUIDs/UUIDs for security purposes (session tokens, API keys, reset tokens) can lead to security vulnerabilities. Security-critical GUIDs must be generated using UUID v4 with Cryptographically Secure Pseudo-Random Number Generator (CSPRNG).",
"impact": "High - Session hijacking, token prediction, unauthorized access",
"likelihood": "Medium",
"remediation": "Use UUID v4 with CSPRNG libraries: crypto.randomUUID() (Node.js 14.17+), uuid v4, or equivalent secure random generators"
},
"patterns": {
"vulnerable": [
"Using Math.random() for GUID generation",
"Using Date.now() or timestamp-based GUIDs for security tokens",
"Using non-cryptographic UUID libraries",
"Using UUID v1 (time-based) for security purposes",
"Custom GUID generation without CSPRNG"
],
"secure": [
"crypto.randomUUID() for Node.js 14.17+",
"uuid v4 library with proper CSPRNG",
"crypto.randomBytes() for custom implementation",
"Platform-specific secure random: SecureRandom (Java), secrets (Python)"
]
},
"examples": {
"violations": [
"const sessionId = Math.random().toString(36);",
"const token = Date.now() + '-' + Math.random();",
"const apiKey = uuidv1(); // Time-based UUID",
"const resetToken = generateGuid(); // Custom weak implementation"
],
"fixes": [
"const sessionId = crypto.randomUUID();",
"const token = require('uuid').v4();",
"const apiKey = crypto.randomBytes(32).toString('hex');",
"const resetToken = crypto.randomUUID();"
]
}
}