Kees Cook, ex amministratore di sistema chief di kernel.org e leader del team di sicurezza di Ubuntu, ha mostrato la possibilità di creare un commit il cui identificatore abbreviato corrisponde a un commit già aggiunto al kernel Linux. L'esperimento è stato condotto come conferma della fattibilità del passaggio a identificatori abbreviati per i commit di 16 caratteri nel kernel Linux, precedentemente discusso nella mailing list degli sviluppatori del kernel, ma non approvato da Linus Torvalds.
Gli identificatori abbreviati dei commit sono generati mantenendo i primi 12 caratteri dell'hash SHA-1 (48 bit su 160 bit). Poiché il numero di oggetti nel kernel identificati tramite hash SHA-1 ha superato i 13 milioni, l'emergere di collisioni utilizzando prefissi di 12 caratteri è diventato un problema di tempo. Vengono mostrati oggetti già aggiunti al kernel che si sovrappongono nei loro identificatori di 11 caratteri. Inoltre, viene menzionato che l'intersezione di identificatori di 12 caratteri era già stata registrata a ottobre, ma è stata rilevata dallo strumento checkpatch prima dell'invio della patch.
Gli identificatori abbreviati vengono utilizzati per pubblicare link brevi ai commit e sono richiesti quando si inviano modifiche nel tag "Fixes", come riferimento a un commit che risolve il problema nel patch inviato (ad esempio, "Fixes: e21d2170f366"). La comparsa di collisioni, in cui più modifiche diverse sono collegate a un unico identificatore abbreviato, può portare a malfunzionamenti degli strumenti di analisi e verifica delle modifiche che considerano il contenuto dei tag "Fixes". Ad esempio, questi tag vengono considerati nel gestore check_fixes, utilizzato nel ramo linux-next, così come negli script di analisi delle vulnerabilità e nel 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 di commit nel repository è notevolmente inferiore a quello degli oggetti (circa 1/8). È probabile che, se si verificheranno intersezioni casuali, queste saranno tra un commit e un oggetto di un altro tipo (ad esempio, un blob o un ramo). Secondo lui, gli identificatori abbreviati sono progettati per essere evidenti, leggibili e facilmente citabili, e al momento non ci sono presupposti oggettivi per aumentarne la dimensione.
Uno degli sviluppatori ha proposto di ridurre la dimensione aumentando il numero di bit significativi, utilizzando un nuovo formato basato sulla codifica Base36 (caratteri 0-9a-z) invece di cifre esadecimali. Secondo Linus, una modifica del genere creerà più problemi di quanti ne risolva. Ad esempio, sarà necessario aggiungere il supporto per il nuovo formato negli strumenti esistenti e introdurre un identificatore di formato per distinguere tra il vecchio e il nuovo formato.
Per dimostrare che il problema con gli identificatori abbreviati non è puramente teorico e la sua soluzione non può essere rimandata, Case Cook ha formato una modifica alla documentazione del kernel, il cui identificatore abbreviato (1da177e4c3f4) coincide con l'identificatore del commit per la creazione del ramo kernel 2.6.12-rc2. La collisione è stata trovata dopo 6 ore di calcoli su un sistema con GPU NVIDIA GeForce RTX 3080.
La ricerca è stata effettuata utilizzando lo strumento lucky-commit: sono stati aggiunti spazi casuali al testo del patch target fino a quando il prefisso SHA-1 di 12 caratteri non è coinciso con i prefissi dei commit già presenti nel kernel. Secondo Case, il problema non deriva tanto da coincidenze casuali, quanto dalla possibilità di manipolare gli identificatori abbreviati per scopi dannosi, ad esempio per eludere determinate verifiche.
Fonte: opennet.ru
