Broken Authentication

Broken Authentication in Laravel naturally [April 2026] [GHSA-349c-2h2f-mxf6]

[Updated April 2026] Updated GHSA-349c-2h2f-mxf6

Overview

Broken Authentication can enable attackers to impersonate users, hijack sessions, or abuse long-lived tokens. In Laravel apps this often happens when tokens or cookies are not protected, HTTPS is not enforced, or session data is mishandled. The real-world impact includes account takeover, data exposure, and privilege escalation across web and API surfaces. Laravel uses session-based authentication backed by cookies and guards. When cookies are marked HttpOnly, Secure, and SameSite, and when the session store is properly configured, stolen tokens are harder to misuse. Problems arise when developers roll their own token logic, store tokens in client-accessible cookies or local storage, or fail to rotate and revoke tokens on logout or password changes. This vulnerability manifests from insecure remember-me flows, weak token rotation, misconfigured Sanctum/Passport usage, or insecure API token handling. Examples include using non-HttpOnly cookies for tokens, persisting tokens without revocation, or relying on HTTP instead of HTTPS for authenticated endpoints. Remediation focuses on adopting Laravel's built-in authentication mechanisms, enabling secure cookie options, using HTTPS, configuring proper session lifetimes, and employing API token frameworks with rotation and revocation. Additional measures include MFA, rate limiting, secure password storage, and regular dependency patching.

Code Fix Example

Laravel API Security Remediation
<?php
// VULNERABLE PATTERN: insecure token in a cookie not marked HttpOnly/Secure
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['email'], $_POST['password'])) {
    // Mock user lookup
    $user = ['id'=>1, 'email'=> '[email protected]', 'password_hash'=> password_hash('secret', PASSWORD_DEFAULT)];
    if (password_verify($_POST['password'], $user['password_hash'])) {
        $token = bin2hex(random_bytes(32));
        // Insecure: token stored in a regular cookie accessible to client-side scripts
        setcookie('auth_token', $token, time() + 3600*24*7, '/', '', false, false);
        // Persist token in DB without rotation or revocation logic
        echo 'Logged in';
        exit;
    }
}

// FIXED PATTERN: use Laravel-style authentication with secure cookies and proper token handling
use Illuminate\\Http\\Request;
use Illuminate\\Support\\Facades\\Auth;

Route::post('/login', function(Request $request){
    $credentials = $request->only('email', 'password');
    if (Auth::attempt($credentials, $request->filled('remember'))){
        // Laravel handles sessions and sets Secure/HttpOnly cookies automatically
        return response('Logged in');
    }
    return response('Unauthorized', 401);
});
?>

CVE References

Choose which optional cookies to allow. You can change this any time.