Collisioni negli identificatori abbreviati dei commit nel kernel Linux

Kees Cook, ex amministratore di sistema di kernel.org e leader del Ubuntu Security Team, ha dimostrato la possibilità di creare un commit il cui identificatore abbreviato coincide con quello di un commit già presente nel kernel Linux. L'esperimento è stato condotto come conferma della necessità di passare agli identificatori abbreviati a 16 caratteri nel kernel Linux, precedentemente discusso nell'elenco di distribuzione degli sviluppatori del kernel, ma non approvato da Linus Torvalds.

Gli identificatori abbreviati dei commit si formano lasciando i primi 12 caratteri dell'hash SHA-1 (48 bit su 160 bit). Poiché il numero di oggetti nel kernel identificabili tramite hash SHA-1 ha superato i 13 milioni, il verificarsi di collisioni utilizzando un prefisso di 12 caratteri è diventato solo una questione di tempo. Come esempio, sono stati mostrati oggetti già aggiunti nel kernel che si sovrappongono nei loro identificatori di 11 caratteri. Inoltre, è stato accennato che l'intersezione di identificatori di 12 caratteri è già stata registrata a ottobre, ma prima dell'invio della patch è stata identificata dall'utility checkpatch.

Gli identificatori abbreviati vengono utilizzati per pubblicare collegamenti brevi ai commit e vengono indicati quando si inviano modifiche nel tag "Fixes", come riferimento a un commit in cui è stata risolta la problematica nella patch inviata (ad esempio, "Fixes: e21d2170f366"). Il verificarsi di collisioni, in cui diverse modifiche risultano associate a uno stesso identificatore abbreviato, può portare a malfunzionamenti degli strumenti per l’analisi e la verifica delle modifiche che tengono conto dei contenuti dei tag "Fixes". Ad esempio, questi tag vengono considerati nel gestore check_fixes, utilizzato nel ramo linux-next, oltre che negli script di analisi delle correzioni delle vulnerabilità e di monitoraggio del ciclo di vita delle patch.

Linus Torvalds ha accolto con scetticismo la proposta di aumentare la dimensione minima degli identificatori abbreviati, poiché il numero effettivo di commit nel repository è notevolmente inferiore al numero di oggetti (circa 1/8). È probabile che, se si verificheranno intersezioni casuali, esse saranno tra un commit e un oggetto di un altro tipo (ad esempio, un blob o un ramo). A suo avviso, gli identificatori abbreviati sono tali per essere visibili, leggibili e facilmente citabili, e al momento non ci sono presupposti oggettivi per aumentarne le dimensioni.

Uno degli sviluppatori ha proposto di ridurre le dimensioni aumentando il numero di bit significativi, utilizzando un nuovo formato basato sulla codifica Base36 (simboli 0-9a-z) invece delle cifre esadecimali. Secondo Linus, una simile modifica creerebbe più problemi di quanti ne risolverebbe. Ad esempio, sarebbe necessario aggiungere supporto per il nuovo formato negli strumenti esistenti e introdurre un identificatore di formato per distinguere il vecchio dal nuovo formato.

Per dimostrare che il problema con gli identificatori abbreviati non è meramente teorico e che la sua soluzione non può essere rinviata, Kees Cook ha redatto una modifica alla documentazione del kernel, il cui identificatore abbreviato (1da177e4c3f4) coincideva con l'identificatore del commit relativo alla creazione del ramo del kernel 2.6.12-rc2. La collisione è stata trovata in 6 ore di calcoli su un sistema con GPU NVIDIA GeForce RTX 3080.

La ricerca è stata effettuata utilizzando lo strumento lucky-commit: nel testo della patch obiettivo sono stati aggiunti spazi casuali fino a quando il prefisso SHA-1 di 12 caratteri non è coinciso con i prefissi dei commit già presenti nel kernel. Secondo Kees, il problema non è tanto rappresentato dalle intersezioni casuali, quanto dalla possibilità di manipolare gli identificatori abbreviati a fini malevoli, per esempio, per eludere alcune verifiche.

Fonte: opennet.ru

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster