Codice inutile

Philip Guenther ha scoperto una chicca nei sorgenti di OpenSSL che dimostra quanto quel codice sia oramai inadeguato.

Per arrivare alla chicca bisogna partire un pochino da lontano.

L’algoritmo DES è uno di quelli supportati da OpenSSL, ma è oramai in disuso per la relativa facilità di attaccare quel sistema di cifratura. Il DES presenta inoltre il problema delle chiavi deboli: se si utilizzano determinate chiavi di cifratura (note e abbastanza banali), l’algoritmo si comporta in modo anomalo.

Le chiavi deboli del DES sono 16 su 256 chiavi possibili; dal momento che OpenSSL sceglie le chiavi utilizzando un algoritmo di generazione casuale a livello crittografico (CSPRNG), la probabilità che venga utilizzata una chiave debole è una contro 252.

Visto che si tratta del DES, che il sistema scelga una chiave debole o meno, l’algoritmo è comunque attaccabile, quindi alla fine la differenza è trascurabile.

OpenSSL ha l’opzione di compilazione -DEVP_CHECK_DES_KEY che serve a controllare che non venga utilizzata una delle chiavi deboli del DES. L’opzione attiva due righe di codice in crypto/evp/e_des.c e sette righe in crypto/evp/e_des3.c (cercate EVP_CHECK_DES_KEY nei sorgenti per vedere le righe interessate).

Il problema è che una delle righe di e_des3.c attivata da -DEVP_CHECK_DES_KEY è errata.

Ma errata nel senso che contiene un clamoroso errore di sintassi.

Quella roba è lì almeno dal 2004 e non se n’è mai accorto nessuno perché nessuno, inclusa la persona che ha scritto quel codice, ha mai non dico verificato, ma nemmeno compilato OpenSSL abilitando il controllo delle chiavi deboli del DES.

Quando è stato segnalato il problema, il team di OpenSSL anziché rimuovere un controllo inutilizzato e inutile su un algoritmo obsoleto, ha preferito correggere l’errore e lasciare un codice che non era mai stato usato da nessuno in almeno 11 anni.

Questo, assieme ad Heartbleed, è uno dei tanti esempi di come OpenSSL sia diventato un terrificante spaghetti code.

Fortunatamente un gruppo di volonterosi programmatori ha preso i sorgenti di OpenSSL come base per creare LibreSSL fin cui viene fatta pulizia di immondizia come questa. Finché i gestori delle distribuzioni Linux o i gestori dei pacchetti di installazioni non offriranno la possibilità di sostituire OpenSSL con LibreSSL dovremo tenerci questo codice ingestibile per cifrare i dati.

E, sì, anche questa pagina vi viene servita passando dalla crittografia di OpenSSL. Buona fortuna.

Autore: Luigi Rosa

Consulente IT, sviluppatore, SysAdmin, cazzaro, e, ovviamente, geek.

2 pensieri riguardo “Codice inutile”

  1. Tutto giusto, ma finché la sicurezza su internet era di poca importanza (o meglio non faceva sufficiente business o meglio Google non aveva ancora preso in mano quel codice) nessuno dei razziatori di openssl s’è mai preoccupato di pagare o supportare chi sviluppava il codice di openssl.
    Tra i razziatori non ci sono solo le distribuzioni GNU/Linux, ma anche Apple, Microsoft, Sun… e chi più ne ha più ne metta.
    Ora tutti gridano allo scandalo ma solo dopo che ne hanno attinto a profusione.
    Bella la vita quando qualcun altro fa il lavoro sporco aggratise 😉
    Poi se [cut] ha preferito correggere l’errore e lasciare un codice che non era mai stato usato da nessuno in almeno 11 anni.[cut] che gli si può dire?
    Quel codice era li da 11 anni, tutti potevano leggerlo, mica è segreto.
    Forse qualcuno con la forza di X poteva pensarci prima no?

Spazio per un commento