| name | sc-session |
| description | Session management flaw detection — fixation, hijacking, cookie misconfiguration, and lifecycle issues |
| license | MIT |
| metadata | {"author":"ersinkoc","category":"security","version":"1.0.0"} |
SC: Session Management Flaws
Purpose
Detects session management vulnerabilities including session fixation, predictable session tokens, insecure cookie attributes, missing session regeneration on privilege change, excessive session timeouts, and improper session invalidation. Covers cookie-based sessions, server-side sessions, and token-based session patterns.
Activation
Called by sc-orchestrator during Phase 2 when session management is detected.
Phase 1: Discovery
Keyword Patterns to Search
"session", "cookie", "Set-Cookie", "httpOnly", "secure", "SameSite",
"session_start", "session_regenerate_id", "req.session",
"SESSION_COOKIE", "CSRF_COOKIE", "express-session", "cookie-session",
"maxAge", "expires", "session.save(", "session.destroy(",
"SessionCreationPolicy"
Vulnerability Patterns
1. Missing Cookie Security Attributes:
app.use(session({
secret: 'keyboard cat',
cookie: { }
}));
app.use(session({
secret: process.env.SESSION_SECRET,
cookie: {
httpOnly: true,
secure: true,
sameSite: 'strict',
maxAge: 3600000
},
resave: false,
saveUninitialized: false
}));
2. Missing Session Regeneration After Login:
def login(request):
user = authenticate(request.POST['username'], request.POST['password'])
if user:
request.session['user_id'] = user.id
return redirect('/dashboard')
def login(request):
user = authenticate(request.POST['username'], request.POST['password'])
if user:
request.session.flush()
request.session.cycle_key()
request.session['user_id'] = user.id
return redirect('/dashboard')
3. Session Not Invalidated on Logout:
@PostMapping("/logout")
public void logout(HttpSession session) {
session.removeAttribute("user");
}
@PostMapping("/logout")
public void logout(HttpSession session) {
session.invalidate();
}
4. Session Token in URL:
session_start();
echo '<a href="page.php?PHPSESSID=' . session_id() . '">Link</a>';
ini_set('session.use_only_cookies', 1);
ini_set('session.use_trans_sid', 0);
Phase 2: Verification
Cookie Attribute Checklist
HttpOnly: Prevents JavaScript access (XSS protection)
Secure: Only sent over HTTPS
SameSite: Prevents CSRF (Strict or Lax)
Path: Scoped to application path
Max-Age/Expires: Reasonable session duration
Framework-Specific Checks
- Django:
SESSION_COOKIE_HTTPONLY, SESSION_COOKIE_SECURE, SESSION_COOKIE_SAMESITE, SESSION_COOKIE_AGE
- Express:
cookie.httpOnly, cookie.secure, cookie.sameSite, cookie.maxAge
- Laravel:
session.http_only, session.secure, session.same_site, session.lifetime
- Spring:
server.servlet.session.cookie.http-only, server.servlet.session.cookie.secure
- ASP.NET:
CookieHttpOnly, CookieSecure, CookieSameSite
Severity Classification
- Critical: Predictable session tokens, session fixation in authentication flow
- High: Missing httpOnly flag (enables XSS-based session theft), no session regeneration on login
- Medium: Missing Secure flag, excessive session timeout (>24h), no invalidation on logout
- Low: Missing SameSite attribute, concurrent session not limited
Output Format
Finding: SESS-{NNN}
- Title: {Session vulnerability type}
- Severity: Critical | High | Medium | Low
- Confidence: 0-100
- File: file/path:line
- Vulnerability Type: CWE-384 (Session Fixation) | CWE-614 (Sensitive Cookie Without Secure) | CWE-613 (Insufficient Session Expiration)
- Description: {What was found}
- Impact: Session hijacking, account takeover, CSRF.
- Remediation: {Specific fix with configuration example}
- References: https://cwe.mitre.org/data/definitions/384.html
Common False Positives
- Development configuration —
secure: false in dev config with env-specific override for production
- API-only applications — APIs using JWT/Bearer tokens may not need cookie security attributes
- Static sites — sessions used for non-sensitive data (preferences, language)
- Proxy-terminated HTTPS —
secure flag may be set at the reverse proxy level