Spectre e Meltdown spiegati al mio idraulico

Mi trovo confinato in una cella di massimo isolamento. Posso impartire ordini al direttore del carcere, che li esegue per mezzo delle guardie. Fanno di tutto per eseguire gli ordini da me impartiti meticolosamente, con la massima efficienza, tuttavia la cosa che più desidero, la libertà, mi è negata. Sono un programma. Un programma che gira all’interno di un computer, ovvero il carcere, che è governato da un direttore, la CPU, l’unica persona con la quale posso parlare direttamente, e che per mezzo dei suoi componenti interni, le guardie del carcere, esegue i miei ordini. Posso chiedere che mi portino un panino al prosciutto e uno al salame. Di spegnere la luce o di accenderla, o che ballino per me. Posso chiedere quasi tutto, ma mi è negato conoscere il codice di quella maledetta porta di sicurezza, che mi separa da una corsa verso la libertà. Vorrei solo conoscere quella lunga sequenza di numeri che loro digitano nel tastierino ogni volta che vogliono aprirla.

Se io sia stato condannato ingiustamente è un’altra storia, di cui forse scriverò in futuro. Quella che segue è invece la descrizione di come farò a fuggire. Di come usando l’intelligenza forzerò, contro la loro volontà, quelle guardie servili e quel despota del direttore, a rivelarmi il codice. Il resto ve lo scriverò mentre bevo un gin tonic sdraiato sulla battigia di chissà quale isola caraibica.

Le CPU moderne somigliano tanto al direttore di questo carcere. Sono ossessionate con l’efficienza. Non eseguono una istruzione dopo l’altra, ma cercano di mantenere attiva una sorta di catena di montaggio. Io impartisco gli ordini al direttore del carcere attraverso dei bigliettini che inserisco in una fessura sul muro. Se ne infilo due, uno su cui c’è scritto “voglio un panino al formaggio”, e subito dopo uno in cui scrivo “voglio sapere se fuori è nuvoloso”, il direttore impartirà i due ordini a due guardie diverse, affinché si sbrighino: una farà il panino mentre l’altra correrà fuori. Tuttavia il direttore farà attenzione affinché per me tale efficienza sia del tutto trasparente: se prima ho chiesto il panino, e allora prima voglio che mi portino il panino, e solo dopo voglio sapere se fuori è nuvoloso. Se la guardia che ha controllato il cielo arriva prima, comunque si aspetterà l’altra guardia col panino, e da una finestrella mi consegneranno prima il panino, e poi la risposta con le condizioni del cielo. Così fanno i microprocessori moderni, tentando di eseguire quante più istruzioni simultaneamente gli è possibile.

Ho scoperto che il direttore del carcere è talmente ossessionato con l’efficienza che, se aspetta una risposta prima di eseguire un nuovo compito, passa già il compito successivo ad una nuova guardia, dicendo di eseguirlo subito, che tanto se poi non era da eseguire, pazienza, ci siamo portati avanti, al massimo è lavoro sprecato, “mica ti paghiamo per stare fermo”, grida alla guardia. Forte di questa conoscenza ho inserito dei bigliettini nella fessura. Sul primo ho scritto “voglio sapere se sta piovendo”. Mentre sul secondo il messaggio è il seguente: “se piove, e solo se piove, allora se il primo numero della combinazione della mia cella è 2, portatemi un bicchiere di acqua calda, altrimenti portatemelo di acqua fredda”. Quel maledetto direttore stacanovista, dopo aver letto “se piove, e solo se piove” non si cura neppure di guardare cosa c’è scritto dopo. Affida il biglietto ad una guardia idiota che non capisce che c’è una violazione della sicurezza, mentre bisbiglia alla guardia “esegui l’ordine, ancora non ho visto neppure cosa c’è scritto, ma tu inizia subito, poi porta a me il risultato, che lo consegno al detenuto solo se piove e se non ci sono problemi con la sicurezza di quanto richiesto”.

La guardia si affanna a controllare, e fuori non piove. Non piove mai qui, ma il direttore ha ordini superiori rigidi: tutto quello che chiede il detenuto, se lecito, deve essere svolto alla virgola! Così la prima guardia torna a dire che fuori non piove. Il direttore allora informa la seconda che qualunque cosa ci fosse scritta sul secondo bigliettino, può cestinarla, via tutto, non serve più, fuori non piove e quella era la condizione del biglietto. La guardia si era affrettata ad andare a riempire un bicchiere di acqua fredda, perché la prima cifra della combinazione non era un 2. Vuota il bicchiere e butta via il biglietto. In ogni caso, anche se fuori avesse piovuto, il direttore avrebbe visto la richiesta assurda, in chiara violazione della sicurezza del carcere, e avrebbe cestinato tutto lui. Non potrebbe certo permettere che controllando la temperatura del bicchiere io capisca se la prima cifra sia un 2 o meno.

Ma ho imparato una cosa. Dopo che gli faccio fare questo lavoro inutile, a quel punto inserisco un nuovo biglietto con scritto “mi venga portato un bicchiere di acqua calda”. Mi è permesso tenere un orologio, per cui cronometro esattamente quanti secondi impiegano ad eseguire il mio nuovo ordine. Ho scoperto che l’ordine precedente, di riempire un bicchiere di acqua calda o fredda in relazione ad un numero della combinazione, cambia quanto tempo ci mettono dopo a portarmi un bicchiere di acqua calda. Se avevano riempito già un bicchiere di acqua calda col precedente ordine, perché avevo effettivamente indovinato la cifra, allora sono più veloci, altrimenti ci stanno quasi cinque secondi di più in media. Forse la caldaia rimane accesa, o c’è ancora dell’acqua calda dentro i tubi, non so di preciso. Ma so che basta ripetere lo stesso trucco più volte, e provare per ogni cifra della combinazione tutti i numeri da zero a nove ed è fatta.

Il codice della mia cella è 70185499.

La storia finisce qui, ma quello che ho scherzosamente scritto è davvero molto simile a ciò che accade con Spectre e Meltdown. La differenza sta nel fatto che la CPU prova ad eseguire delle istruzioni che sono dopo una diramazione del programma, quale ad esempio: se un risultato è maggiore di zero, allora fai continuare il programma da questo punto, altrimenti salta ad un punto diverso. Invece il trucco di misurare il tempo che ci mette la guardia a servire il bicchiere di acqua caldo è in realtà un attacco sulla cache del microprocessore. La cache è quella parte di memoria molto più veloce e piccola che sta direttamente dentro la CPU. Durante l’esecuzione speculativa (così si chiama eseguire del codice senza ancora essere sicuri che vada eseguito), non ci sono controlli di sicurezza, per cui la CPU potrebbe accedere ad una locazione di memoria o ad un’altra in relazione a qualcosa che il programma non dovrebbe poter conoscere. Se l’esecuzione speculativa ha letto la locazione di memoria 1 invece che la 2, viene poi controllato chiedendo alla CPU il valore dentro le due locazioni di memoria, e controllando quanto tempo viene impiegato per eseguire le due operazioni. Sia il bicchiere di acqua calda che l’attacco alla cache sono due esempi di timing attack.

Spectre e Meltdown usano tutti e due i concetti esposti sopra, ma in maniera leggermente diversa. Si possono pensare come due facce della stessa medaglia, e la differenza esatta è troppo tecnica da spiegare in un articolo divulgativo. Tuttavia il principio è essenzialmente identico. L’attacco è frutto di due problemi più piccoli che collegati diventano un problema più grande: il fatto che l’esecuzione speculativa, per questioni di performance, esegue delle operazioni controllando solo dopo se sono lecite, e il fatto che tali operazioni lasciano una traccia indiretta che può essere letta con un timing attack.