Il bus a 32 bit era minaccioso, oscuro e silenzioso, illuminato a tratti da lampi blu e
da sequenze di dati che lo percorrevano in tutta la sua lunghezza. Nonostante si
trovasse in un ambiente ostile e che percepiva come nemico, il byte sapeva esattamente quello che
doveva fare in quel sistema esterno. Non si trovava lì per caso,
e quella per lui non era certo una vacanza-premio o chissà cosa. La missione che
gli era stata affidata dal suo OS era chiara e ben definita. Non aveva
alcuna intenzione di deluderlo, nè soprattutto di deludere se stesso. Aveva preso
parte a tantissime imprese, nelle sessioni precedenti, e nessuna aveva mai
fallito: dalla semplice consegna di bytes nei registri, alla persistenza di un file
su HD, al calcolo in virgola mobile per il processo excel.exe. In
alcune circostanze il suo OS l'aveva premiato per aver compiuto le missioni in perfetta
efficenza: per questa ragione, il byte era ospitato, quando non era
out-for-mission
, in una cella della memoria cache
L2 ad alta velocità, proprio ad un solo ciclo di clock dal
processore e dai registri più intimi della CPU. Il byte era orgoglioso di
quanto avevo fatto fin a quel momento. Ma era anche ambizioso: quando aveva
saputo che il kernel stava organizzando una critical-mission in
un altro sistema esterno e nemico, si era offerto
volontario, desideroso di emergere e dimostrarsi superiore agli altri bytes del
sistema. Era stato accettato, naturalmente, e di questo lui era felice.
In
quel momento si trovava nel sistema esterno, un sistema x86, così gli era stato detto durante
il briefing. Era memorizzato in un buffer di memoria di pochi KBytes, in attesa,
paziente e letale allo stesso tempo. Il byte stava aspettando di ricongiugersi con la squadra
d'assalto con la quale era penetrato nel sistema.
In passato aveva lavorato sempre da solo, ma quella era una missione
talmente critica che aveva richiesto un maggior numero di risorse. La
velocità e la puntualità erano fattori essenziali. Il commando era composto da un
byte[], dimensionato poco più di un KByte, il cui nome in codice era Sasser. Doveva lavorare insieme ad altri per portare a
termine il suo lavoro - questa volta - ma voleva comunque cercare di mostrarsi
il più forte per ottenere un altro riconoscimento dal suo OS padrone. "Certo, mi unirò a Sasser..." - mormorò il byte tra sè e sè -
"...ma li fregherò tutti. Vincerò solo io!!!". Il byte
osservò a lungo i bus di indirizzamento che gli scorrevano davanti agli occhi,
in attesa di trovare un flusso di dati adatto a farlo salire di priorità
in modo tale da avvicinarsi ai processi più a basso livello, così da
ottenere un maggior controllo sul bytecode sottostante. Appena entrati
nel sistema, i bytes[] avevano già tentato di ricodificarsi, ma per qualche
strano motivo erano stati bloccati. C'era solo una spiegazione valida a
tutto ciò: l'OS era meno sprovveduto di quanto pensasse, in qualche modo era
dotato di alcuni semplici meccanismi di difesa che avrebbe dovuto oltrepassare ad
ogni costo. Il byte sogghignò un ciclo di clock, gli piacevano le sfide.
Doveva raggiungere un livello superiore di priorità, dove avrebbe avuto maggiori
possibilità di unirsi ai suoi compagni per formare
l'entità Sasser
.
Il sistema, il cui nome in chiaro era Microsoft Windows
2000 5.00.2195 Service Pack 4, era entrato in uno stato d'allarme.
Come tutti gli OS che si rispettano, teneva costantemente sotto controllo tutte
le strutture dati in input ed in output nel sistema, manteneva in vita tutti i thread e
tutti i processi, renderizzava attraverso la GPU ogni cosa per poter comunicare
con l'Aldilà. Esattamente 2534 cicli di clock prima, il processo
navnt.exe, con il quale collaborava a stretto contatto, aveva innalzato il livello
di guardia con il quale monitorava le operazioni. C'era stato uno strano
ingresso di bytes da ETH0: navt.exe lo definiva strano, perchè il flusso
di dati in apparenza sembrava provenire dalla stessa comunicazione, ma l'header riportava
come sender indirizzi IP tutti diversi uno dall'altro. Era
quantomeno sospetto. Seguendo le informazioni contenute nel pacchetto-dati, l'OS stava
ricomponendo l'array, ma alcune componenti software a basso livello,
fra cui proprio navnt.exe avevano bloccato l'operazione ritenendola rischiosa per la
sicurezza dell'intero sistema. L'OS e il kernel accettarono questo
interrupt: nonostante fossero loro al posto di comando, sapevano anche che
navnt.exe era un prezioso alleato. Non l'avevano mai deluso, e
più di una volta aveva preservato l'integrità del sistema prevenendo diversi
contagi proprio con azioni di questo tipo. L'OS emanò istantaneamente nuove
direttive atte a migliorare la sicurezza. Tutti gli array avrebbero subìto check
costanti per evitare di uscire dagli offset assegnati. Le zone di memoria
dati sarebbero state scrupolosamente separate dalle memorie di
codice, per evitare attacchi di malicious code, che ultimamente, con l'integrazione di IE, erano
sempre più frequenti. Ogni istruzione puntata dal PC doveva essere assolutamente
convalidata, prima di essere eseguita. L'ultimo hotfix proveniente da http aveva
aggiornato alcune security-components di sè stesso, perciò si preoccupò di
caricarle in RAM aggiornando la cache di sistema. Un'ondata di quasi 3MBytes
fece provare una sensazione di ebbrezza
all'OS: gli succedeva sempre quando veniva aggiornato, perchè si rendeva conto
di diventare ogni giorno sempre più potente, più sicuro e più preparato
nello svolgere la propria
attività.
Il byte, correva veloce sul bus, alla ricerca di un
posto dove rifugiarsi. L'OS era in allerta, doveva fare qualcosa subito. Sapeva
che se si fosse unito ad un flusso di bytes contenente codice, sarebbe stato
scoperto immediatamente. L'unica speranza era quella di unirsi a qualche altra
forma di informazione, qualsiasi cosa purchè fosse semplice e banale
informazione. Diede un'occhiata ad una corsia di memoria RAM proprio lì
accanto. La struttura logica sembrava quella di un XML: vedeva chiaramente
i bytes che componevano i tag di apertura e di chiusura. Senza pensarci un
attimo, sì uni a loro, inserendosi in un offset che manteneva l'XML
well-formed senza troppe complicazioni. Intorno a sè, non vedeva altro che
byte come lui. Sentiva sopra di sè il clock che tuonava, facendo in modo che
tutto avvenisse in modo sincronizzato e preciso. D'improvviso, vide sul bus un
bytes[783] appartenente alla sua squadra d'assalto; non perse un attimo...il
byte uscì dall'albero XML, ridimensionò l'array dinamicamente e si unì al
gruppo.
"Sasser, initializing malicious code. Loading
Virus...
Address 0x9033. Objective: system shutdown.
Searching, scanning,
executing. Reset PC."
Si sentì più potente. Unendosi all'array di
bytes, aveva condiviso la propria essenza con gli altri, e lo stesso gli
altri stavano facendo con lui. Erano per certi versi una sola entità, più
conscia, più intelligente , addestrata ad uno scopo ben
specifico: provocare lo shutdown del sistema x86. La nuova entità percorse furtivamente il
bus, trovò un'area di memoria vuota e decise di memorizzarsi in quel punto,
proprio all'interno di un'immagine GIF. In quel momento erano una semplice
sequenza di bytes, inoffensiva ed innocua. Se quell'immagine fosse stata
caricata in RAM e renderizzata a video, nell'Aldilà sarebbe apparsa come
una banale sequenza di caratteri ASCII, che probabilmente non avrebbero avuto
alcun significato. Finchè fossero stati in quella zona di memoria, l'OS non li
avrebbe trovati.
"Storing, retrieving, analyzing.
Scanning
function pointer."
Per andare in esecuzione e per scatenare
l'offensiva, Sasser
aveva intenzione di memorizzarsi in un address referenziato da un
puntatore a funzione. Era un metodo pulito ed efficace, specialmente in
quei sistemi poco protetti e senza processi antivirali attivi. L'idea in sè
è semplice: ci si memorizza in un'area di memoria temporanea, sapendo che prima
o poi verrà richiamata per essere caricata, puntata
dal program counter, nome in codice PC, e successivamente eseguita. La cosa difficile è
trovare l'address più adatto per questo scopo: i sistemi moderni dispongono a
volte di un GBytes, troppo per poter andare a casaccio in modo fortunoso. Ma
Sasser
sapeva il fatto suo, presto avrebbe avuto un indirizzo
valido e avrebbe scatenato tutta la sua potenza.
"E' sparito dai controllori CRC. Deve essere entrato in
un'area di memoria non mappata. Attivate subito scansionamenti sulla memoria,
non possiamo lasciarcelo sfuggire. E' troppo pericoloso!"
L'OS stava impartendo ordini per gestire la
situazione. Aveva ricevuto ulteriori aggiornamenti della situazione da
navnt.exe. Il malicious code era stato rilevato, per scomparire
quasi immediatamente. La situazione stava degenerando. Il kernel percepiva il
peso della battaglia: se non avesse trovato subito la locazione di memoria nella
quale aveva trovato rifugio l'entità maligna, sarebbero stati guai seri. Non
avendo alcun watcher sull'address, il malicious code avrebbe potuto
eseguirsi e potenzialmente prendere il controllo del sistema. Doveva
assolutamente impedire l'aggravarsi dello stato attuale, e sapeva come
fare.
"Generate 0x50 function pointer su address
0x78000, sguinzagliateli per tutto il sistema.
Se è come credo, l'entità
starà cercando un address corretto per eseguire il proprio codice
interno."
Nel core, d'improvviso venne sollevato
un interrupt da parte di navnt.exe, che perentoriamente prese
la parola: "Abbiamo appena capito chi è. La firma rilevata
nell'entità indica la presenza di Sasser nel sistema. Lo scopo è lo
shutdown del sistema, tramite buffer overrun." L'OS non si fece prendere
dal panico: se non fosse riuscito a fermare il codice, questi avrebbe bloccato
tutti i processi e tutti i thread provocando la morte del sistema. Non
solo in quella sessione, ma anche ad un successivo riavvio. Guardò con
determinazione tutti i suoi componenti, deciso a spremere il massimo da ciascuno
di loro per evitare il peggio. "Muovetevi, fate come ho
detto."
Sasser stava aspettando. Si risvegliò solo quando riuscì ad intercettare un
function pointer che riteneva adatto. Lo assorbì, facendolo
proprio. Presto la missione sarebbe finita, e sarebbe stata l'ennesimo
successo. Sasser, ed ogni byte contenuto, sorrise compiaciuto.
Adesso
sapevano cosa fare e dove andare.
Ignari, però, della trappola che l'OS e il
kernel stavano preparando.
(continua...)