Clickjacking

Indice dei contenuti

    Il clickjacking (UI redressing o UI spoofing) è un attacco in cui la vittima viene indotta a cliccare su un elemento di un’interfaccia che non vede, perché nascosto sotto un’interfaccia apparentemente innocua. L’attaccante carica la pagina bersaglio (es. il pannello di controllo di un servizio in cui la vittima è autenticata) in un <iframe> trasparente sovrapposto a una pagina-esca, allineando un elemento interattivo (pulsante “Conferma”, “Autorizza”, “Pubblica”) esattamente sotto qualcosa che l’utente è invitato a cliccare.

    Il risultato è che la vittima esegue un’azione reale sul sito bersaglio — modifica delle impostazioni, trasferimento fondi, cambio email — senza saperlo.

    Meccanismo dell’attacco

    La struttura tipica della pagina attaccante:

    <!-- Pagina attaccante su https://evil.it -->
    <style>
      iframe {
        position: absolute;
        top: 0; left: 0;
        width: 100%; height: 100%;
        opacity: 0.0;   /* completamente trasparente */
        z-index: 10;
      }
      .esca {
        position: absolute;
        top: 200px; left: 300px;
        z-index: 1;
        /* allineato sotto il pulsante "Conferma" dell'iframe */
      }
    </style>
    
    <iframe src="https://banca.it/trasferimento?importo=1000&destinatario=evil"></iframe>
    <button class="esca">Clicca qui per vincere un premio!</button>

    L’utente vede il pulsante “Clicca qui per vincere un premio!” e lo clicca — ma il clic viene catturato dall’iframe trasparente sovrapposto e attiva il pulsante “Conferma” della pagina della banca.

    Varianti

    Likejacking: induce la vittima a cliccare sul pulsante “Mi piace” di Facebook incorporato in un iframe invisibile su una pagina diversa.

    Cursorjacking: sposta visivamente il cursore del mouse dalla posizione reale a una diversa, in modo che l’utente creda di cliccare in un punto ma in realtà clicca altrove.

    Tapjacking: variante mobile in cui gli overlay sfruttano i tap su touchscreen.

    Multistep clickjacking: sequenza di clic multipli coordinati per completare flussi più complessi (es. cambiare email + confermare il cambio).

    Drag-and-drop jacking: l’utente viene ingannato a trascinare testo o file — usato per rubare token o esfiltrare contenuti tramite l’API HTML5 drag-and-drop.

    Contromisure lato server

    X-Frame-Options (legacy)

    Header HTTP che indica al browser se la pagina può essere incorporata in un frame:

    X-Frame-Options: DENY          → non può essere framed da nessuno
    X-Frame-Options: SAMEORIGIN    → solo la stessa origine può framearla
    X-Frame-Options: ALLOW-FROM https://trusted.it  → solo l'origine specificata

    ALLOW-FROM non è supportato da tutti i browser moderni (Chrome e Firefox lo ignorano).

    frame-ancestors in CSP (moderno)

    La direttiva frame-ancestors della Content Security Policy sostituisce X-Frame-Options con piena compatibilità browser e supporto a origini multiple:

    Content-Security-Policy: frame-ancestors 'none';
    Content-Security-Policy: frame-ancestors 'self';
    Content-Security-Policy: frame-ancestors 'self' https://trusted.it;

    frame-ancestors 'none' è il valore più restrittivo: nessuna pagina può incorporare la risposta in un frame. Quando entrambi gli header sono presenti, i browser moderni danno precedenza a frame-ancestors.

    Frame-busting JavaScript (sconsigliato)

    Tecnica legacy che usa JavaScript per rompere il framing:

    if (window.top !== window.self) {
      window.top.location = window.self.location;
    }

    È aggirabile con l’attributo sandbox dell’iframe (sandbox="allow-forms" senza allow-scripts blocca il JavaScript del frame) e non è affidabile come difesa.

    Clickjacking vs CSRF

    Clickjacking e CSRF portano entrambi l’utente a eseguire azioni non intenzionali, ma in modo diverso:

    ClickjackingCSRF
    MeccanismoL’utente clicca fisicamente su un elemento nascostoRichiesta HTTP forgiata inviata automaticamente
    Interazione utenteRichiestaNon richiesta
    VisibilitàL’utente vede la pagina esca, non l’azione realeNessuna visibilità
    Difesa principaleframe-ancestors / X-Frame-OptionsToken CSRF / SameSite cookie

    I token CSRF non proteggono dal clickjacking: se la vittima clicca sull’iframe con il form reale, il token è presente e valido.

    Relazione con altri meccanismi

    Ultimo aggiornamento: