Session Fixation

Indice dei contenuti

    La session fixation è un attacco alle sessioni web in cui l’attaccante non ruba una sessione esistente — la fissa prima che l’autenticazione avvenga. Il meccanismo sfrutta applicazioni che non rigenerano l’ID di sessione al momento del login: l’attaccante conosce l’ID di sessione prima del login, la vittima si autentica con quell’ID, e l’attaccante eredita la sessione autenticata.

    Meccanismo

    1. L’attaccante ottiene un ID di sessione valido dall’applicazione (es. visitandola normalmente) — es. SESSID=abc123.
    2. Induce la vittima ad usare quell’ID di sessione. Tecniche comuni:
      • Link con sessione nell’URL: https://app.it/login?SESSID=abc123 (se l’applicazione accetta il session ID come parametro GET).
      • Header Set-Cookie via XSS o subdomain: se l’attaccante controlla un sottodominio, può impostare un cookie di sessione per il dominio padre.
      • Meta-refresh o redirect verso la pagina di login con sessione pre-impostata.
    3. La vittima visita il link e si autentica. L’applicazione associa le credenziali della vittima alla sessione abc123 — senza rigenerarla.
    4. L’attaccante, che conosce abc123, può ora accedere all’applicazione con la sessione autenticata della vittima.

    Differenza con Session Hijacking

    Session FixationSession Hijacking
    TimingPrima del loginDopo il login
    Come si ottiene la sessioneL’attaccante la imponeL’attaccante la ruba (sniffing, XSS, ecc.)
    Conoscenza dell’IDGià nota all’attaccanteDa acquisire

    Nella session fixation l’attaccante non ha bisogno di intercettare nulla — conosce già l’ID perché lo ha generato lui.

    Varianti

    Fixation tramite URL: le applicazioni legacy che passano il session ID nell’URL (?jsessionid=...) sono particolarmente vulnerabili: è sufficiente costruire un link con un ID noto.

    Fixation tramite cookie da sottodominio: se l’applicazione usa Domain=.esempio.it per il cookie di sessione, un attaccante con controllo su blog.esempio.it può impostare un cookie SESSID per .esempio.it — che verrà inviato a www.esempio.it al login.

    Fixation tramite risposta HTTP manipolata: in scenari con proxy intermedi vulnerabili, l’attaccante può iniettare header Set-Cookie in risposte HTTP non cifrate.

    Contromisure

    Rigenerazione dell’ID di sessione al login: è la difesa fondamentale. Immediatamente dopo l’autenticazione riuscita, il server deve emettere un nuovo ID di sessione e invalidare quello precedente:

    # Django — rigenerazione automatica al login
    from django.contrib.auth import login
    login(request, user)
    # Django rigenera automaticamente la sessione al login
    
    # Flask — rigenerazione manuale
    session.clear()
    session['user_id'] = user.id
    # L'ID di sessione viene rigenerato perché la sessione è stata svuotata

    Non accettare session ID dall’URL: i session ID devono transitare esclusivamente via cookie — mai come parametri GET o POST. Molti framework moderni non supportano più i session ID nell’URL per default.

    Cookie con attributi di sicurezza: HttpOnly (impedisce lettura via JavaScript), Secure (solo HTTPS), SameSite=Strict o Lax (protegge da invio cross-site).

    Timeout di sessione brevi: riduce la finestra utile per l’attaccante anche in caso di fixation riuscita.

    Validazione dell’IP o User-Agent: legare la sessione all’IP o allo User-Agent del client originale — misura imperfetta (gli IP cambiano in reti mobili, i proxy aziendali aggregano IP) ma aumenta il costo dell’attacco.

    Contesto storico

    La session fixation fu documentata formalmente da Mitja Kolsek nel 2002 nel paper Session Fixation Vulnerability in Web-based Applications. Portò i framework web a introdurre la rigenerazione automatica del session ID al login come comportamento di default — funzionalità oggi presente in Rails, Django, Laravel, ASP.NET e la maggior parte dei framework maturi.

    Relazione con altri argomenti

    • Autenticazione — la session fixation colpisce il momento critico del passaggio da non-autenticato ad autenticato.
    • Cross-Site Scripting (XSS) — XSS può essere usato per impostare cookie di sessione arbitrari, facilitando la fixation.
    • OWASP Top 10 — A07 Identification and Authentication Failures.
    • HSTS — protegge dal downgrade a HTTP, eliminando un vettore di manipolazione dei cookie.

    Ultimo aggiornamento: