Technology Experience

Contenuti gestiti da Igor Damiani
posts - 949, comments - 2741, trackbacks - 15120

My Links

News

  • Questo blog si propone di raccogliere riflessioni, teoriche e pratiche, su tutto quello che riguarda il world-computing che mi sta attorno: programmazione in .NET, software attuale e futuro, notizie provenienti dal web, tecnologia in generale, open-source.

    L'idea è quella di lasciare una sorta di patrimonio personale, una raccolta di idee che un giorno potrebbe farmi sorridere, al pensiero di dov'ero e cosa stavo facendo.

    10/05/2005,
    Milano

Archives

Post Categories

Generale

[Parte.1] Missione Sasser, attacco al potere

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...)

powered by IMHO 1.2

Print | posted on martedì 15 novembre 2005 11:46 | Filed Under [ 010 .bytes. 010 ]

Feedback

Gravatar

# re: [Parte.1] Missione Sasser, attacco al potere

navnt.exe... pubblicità occulta... ad un prodotto... che definire così così è un complimento... ;-)
15/11/2005 13:17 | Lorenzo Barbieri
Gravatar

# [Parte.2] Missione Sasser, attacco al potere

23/11/2005 13:27 | Technology Experience
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET