Il checksum è una sequenza di bit, che viene adoperata per verificare l’integrità delle informazioni maggiormente soggette ad alterazione dei dati. L’algoritmo di checksum più rapido e semplice da implementare consiste nel sommare tutti i bit di un messaggio e di salvare il risultato in una variabile esterna.
Se in futuro si vorrà controllare la correttezza del messaggio che si sta leggendo, basterà effettuare nuovamente la somma dei singoli bit e confrontare questo risultato con quello salvato nella variabile esterna: se i valori coincidono, allora non si sono verificate alterazioni quindi il dato è rimasto tale e quale al valore originale.
Dato che i settaggi contenuti nella memoria CMOS sono indispensabili per il corretto funzionamento dell’hardware, è stata associata a questa un valore di checksum che, ad ogni avvio del sistema, viene testato dal BIOS (aggiungendo valori in memoria da un certo punto prefissato sino ad un limite stabilito) e, qualora questo test dovesse fallire, questi si incarica di bloccare il boot della macchina e di segnalare l’errore all’utente, tramite il messaggio: CMOS checksum errors.
In genere, nella maggior parte delle schede madri, il valore del checksum viene salvato all’indirizzo di memoria 2EH e 2FH. Se qualcuno, intenzionalmente, modificasse questi valori inserendone di errati, il sistema non si avvierebbe più sin dal prossimo avvio, segnalando l’errore di cui prima si è parlato. Verifichiamo quanto detto con un piccolo esempio di codice in C:
int main(void)
{
int itera, somma=0; // 'somma' calcola il checksum partendo da 0x10 sino a 0x2d
for(itera = 0x10; itera < = 0x2d; itera++)
{
outp(0x70,itera);
somma = somma + inp(0x71);
}
outp(0x70, 0x2e);
printf(" 0x2e = %x n",inp(0x71));
outp(0x70,0x2f);
printf(" 0x2f = %x n",inp(0x71));
return 0;
}
Se i due valori del checksum, cioè quello salvato nel sistema e quello calcolato al volo, durante il suo avvio non coincidono, viene generato un errore e tutte le impostazioni si resettano in automatico, compresa ad esempio l’eventuale password messa a protezione del BIOS. La password non viene cifrata con un algoritmo molto avanzato ed in genere non risulta difficilissimo decriptarla. L’algoritmo più comune è, infatti, quello che associa ad una stringa un determinato numero intero. Per risalire alla password, nel caso fosse stata dimenticata e non si voglia resettare il CMOS, si possono fare delle prove, magari su un sistema simile, tentando di inserire ogni volta stringhe diverse e fare il dumping del checksum, andando a leggere i valori scritti all’indirizzo della porta destinato allo store dei dati della password, ad esempio usando la porta 0x370 per scrivere e la porta 0x371 per leggere.
Un aspetto curioso per quanto riguarda la sicurezza di alcuni BIOS è che sfruttando alcuni bug presenti in talune versioni, si può resettare la password semplicemente premendo particolari sequenze di tasti. Nel sistema IBM Aptiva basta premere tutti e due i tasti del mouse mentre questo si avvia, nelle prime versioni del BIOS AMI bastava premere il tasto ESC appena prima della schermata di POST per azzerare il tutto e, infine, con alcuni portatili della Toshiba è sufficiente premere il tasto Shift per ottenere lo stesso effetto.
PUNTATE PRECEDENTI:
27 Novembre: Hacking del BIOS (Parte I)
30 Novembre: Hacking del BIOS (Parte II)
di Rocco Galati - Programmazione.it