Kees Cook, voormalig hoofd systeembeheerder van kernel.org en leider van het Ubuntu Security Team, demonstreerde de mogelijkheid om een commit te creƫren waarvan de verkorte identifier overeenkomt met een eerder aan de Linux-kernel toegevoegde commit. Dit experiment werd uitgevoerd als bewijs voor de haalbaarheid van de overstap naar 16-tekens lange verkorte commit-identifiers in de Linux-kernel, waar eerder over gediscussieerd was op de mailinglijst van kernontwikkelaars, maar wat niet werd goedgekeurd door Linus Torvalds.
Verkorte commit-identifiers worden gevormd door de eerste 12 tekens van de SHA-1 hash (48 bits van de 160 bits) te behouden. Aangezien het aantal objecten binnen de kernel dat via de SHA-1 hash wordt geĆÆdentificeerd meer dan 13 miljoen heeft overschreden, was het een kwestie van tijd voordat er conflicten zouden optreden bij het gebruik van een prefix van 12 tekens. Als voorbeeld zijn al in de kernel toegevoegde objecten getoond die overlappen in hun 11-teken identifiers. Bovendien werd vermeld dat er al in oktober 12-teken overlappen waren waargenomen, maar tot het indienen van de patch werd een probleem ontdekt met de checkpatch-tool.
Verkorte identifiers worden gebruikt bij het publiceren van korte links naar commits en worden ook opgegeven bij het indienen van wijzigingen in het 'Fixes'-label, als een verwijzing naar de commit waar het probleem in de verzonden patch is verholpen (bijvoorbeeld 'Fixes: e21d2170f366'). Het optreden van conflicten, waarbij verschillende wijzigingen aan een enkele verkorte identifier zijn gekoppeld, kan de werking van tools voor het analyseren en controleren van wijzigingen verstoren die rekening houden met de inhoud van de 'Fixes'-labels. Deze labels worden bijvoorbeeld in overweging genomen door de check_fixes-handler die wordt toegepast in de linux-next branch, evenals door scripts voor het analyseren van kwetsbaarheden en het volgen van de levenscyclus van patches.
Linus Torvalds heeft sceptisch gereageerd op het voorstel om de minimale grootte van verkorte identificatoren te vergroten, omdat het aantal commits in de repository feitelijk aanzienlijk lager is dan het aantal objecten (ongeveer 1/8). Waarschijnlijk zullen als er toevallige overlappen ontstaan, deze zijn tussen een commit en een object van een ander type (bijvoorbeeld een blob of een tak). Volgens hem zijn verkorte identificatoren bedoeld om overzichtelijk, leesbaar en gemakkelijk te citeren te zijn, en er zijn op dit moment geen objectieve redenen om hun grootte te vergroten.
Een van de ontwikkelaars stelde voor om de grootte te verkleinen door het aantal significante bits te vergroten, met behulp van een nieuw formaat gebaseerd op Base36-codering (symbolen 0-9a-z) in plaats van hexadecimale cijfers. Volgens Linus zal dergelijke wijziging meer problemen oproepen dan oplossen. Bijvoorbeeld, het zal nodig zijn om ondersteuning voor het nieuwe formaat toe te voegen in bestaande hulpmiddelen en om een format-ID in te voeren om het oude en nieuwe formaat te onderscheiden.
Om te demonstreren dat het probleem met verkorte identificatoren niet hypothetisch is en dat de oplossing ervan niet kan worden uitgesteld, heeft Kees Cook een wijziging in de documentatie van de kernel opgesteld, wiens verkorte identificator (1da177e4c3f4) overeenkwam met de identificator van de commit die de kernel 2.6.12-rc2-tak creƫerde. De botsing kon binnen 6 uur rekenwerk op een systeem met een NVIDIA GeForce RTX 3080 worden opgezocht.
Het zoeken werd uitgevoerd met behulp van de lucky-commit-tool ā er werden willekeurige spaties aan de tekst van de doelpatch toegevoegd totdat het 12-teken lange SHA-1-prefix overeenkwam met de al in de kernel bestaande prefixen van commits. Volgens Kees vormen niet zoveel de toevallige overlappen een probleem, maar eerder de mogelijkheid om met verkorte identificatoren voor kwaadwillige doeleinden te manipuleren, bijvoorbeeld om bepaalde controles te omzeilen.
Bron: opennet.ru
