UNPKG

@sun-asterisk/sunlint

Version:

☀️ SunLint - Multi-language static analysis tool for code quality and security | Sun* Engineering Standards

140 lines (139 loc) 4.89 kB
{ "rule": { "id": "S045", "name": "Brute-force Protection", "description": "Implement protection against brute-force attacks on authentication endpoints. This rule detects missing rate limiting, account lockout mechanisms, and other brute-force protection measures in authentication flows.", "category": "security", "severity": "error", "languages": ["typescript", "javascript"], "frameworks": ["nestjs", "express", "node"], "version": "1.0.0", "status": "stable", "tags": ["security", "authentication", "brute-force", "rate-limiting", "owasp"], "references": [ "https://owasp.org/www-community/attacks/Brute_force_attack", "https://cheatsheetseries.owasp.org/cheatsheets/Authentication_Cheat_Sheet.html", "https://owasp.org/www-community/controls/Blocking_Brute_Force_Attacks", "https://portswigger.net/web-security/authentication/password-based/brute-force" ] }, "configuration": { "enableRateLimitDetection": true, "enableAccountLockoutDetection": true, "enableCaptchaDetection": true, "checkAuthenticationEndpoints": [ "login", "signin", "authenticate", "auth", "password", "reset", "forgot" ], "rateLimitLibraries": [ "express-rate-limit", "express-slow-down", "@nestjs/throttler", "rate-limiter-flexible", "bottleneck", "limiter" ], "accountLockoutLibraries": [ "express-slow-down", "rate-limiter-flexible", "express-brute", "express-brute-mongo" ], "captchaLibraries": [ "recaptcha", "hcaptcha", "turnstile", "captcha" ], "vulnerablePatterns": [ "login.*without.*rate.*limit", "auth.*without.*throttle", "password.*without.*lockout", "signin.*without.*captcha" ], "protectionPatterns": [ "rate.*limit", "throttle", "lockout", "captcha", "brute.*force.*protection", "max.*attempts", "cooldown" ], "maxAttemptsThreshold": 5, "timeWindowMinutes": 15 }, "examples": { "violations": [ { "description": "Login endpoint without rate limiting", "code": "@Post('login')\nasync login(@Body() loginDto: LoginDto) {\n return this.authService.validateUser(loginDto);\n}" }, { "description": "Authentication without account lockout", "code": "app.post('/auth/login', (req, res) => {\n const { username, password } = req.body;\n // No rate limiting or lockout mechanism\n authenticateUser(username, password);\n});" }, { "description": "Password reset without protection", "code": "@Post('reset-password')\nasync resetPassword(@Body() resetDto: ResetPasswordDto) {\n // No rate limiting or captcha\n return this.authService.resetPassword(resetDto);\n}" } ], "fixes": [ { "description": "Login with rate limiting and account lockout", "code": "@Post('login')\n@Throttle(5, 60) // 5 attempts per minute\nasync login(@Body() loginDto: LoginDto) {\n return this.authService.validateUser(loginDto);\n}" }, { "description": "Express with rate limiting middleware", "code": "const rateLimit = require('express-rate-limit');\n\nconst loginLimiter = rateLimit({\n windowMs: 15 * 60 * 1000, // 15 minutes\n max: 5, // limit each IP to 5 requests per windowMs\n message: 'Too many login attempts'\n});\n\napp.post('/auth/login', loginLimiter, (req, res) => {\n // authentication logic\n});" }, { "description": "NestJS with ThrottlerModule", "code": "@Module({\n imports: [\n ThrottlerModule.forRoot([{\n ttl: 60000,\n limit: 5,\n }]),\n ],\n})\nexport class AuthModule {}" } ] }, "testing": { "testCases": [ { "name": "login_without_rate_limit", "type": "violation", "description": "Login endpoint without rate limiting" }, { "name": "auth_without_throttle", "type": "violation", "description": "Authentication without throttling" }, { "name": "password_reset_unprotected", "type": "violation", "description": "Password reset without protection" }, { "name": "login_with_rate_limit", "type": "clean", "description": "Login with proper rate limiting" }, { "name": "auth_with_throttle", "type": "clean", "description": "Authentication with throttling" }, { "name": "password_reset_protected", "type": "clean", "description": "Password reset with protection" } ] }, "performance": { "complexity": "O(n)", "description": "Linear complexity based on number of authentication endpoints and middleware usage" } }