Kees Cook, a kernel.org korábbi fő rendszergazdája és vezetője Ubuntu A biztonsági csapat bemutatta, hogy képes olyan commitot létrehozni, amelynek rövidített azonosítója megegyezik a kernelhez korábban hozzáadott commit egyikével. LinuxA kísérletet azért végezték, hogy megerősítsék a kernelben a 16 karakteres rövidített commit azonosítókra való áttérés megvalósíthatóságát. Linux, amelyet korábban a kernel fejlesztői levelezőlistán vitattak meg, de Linus Torvalds nem támogatott.
A rövidített commit azonosítók az SHA-1 hash első 12 karakterének (160 bitből 48 bit) megtartásával jönnek létre. Mivel az SHA-1 hash által azonosított kernel objektumok száma meghaladta a 13 milliót, a 12 karakteres előtagot használó ütközések csak idő kérdése voltak. Példaként a kernelhez már hozzáadott objektumok láthatók, amelyek 11 karakteres azonosítóikban átfedésben vannak. Azt is megjegyzik, hogy egy 12 karakteres azonosító ütközését már októberben észlelték, de a checkpatch segédprogram a javítás beküldése előtt észlelte.
A rövidített azonosítókat rövid commit linkek közzétételekor használjuk, és a „Fixes” címkében megadott változtatások beküldésekor is megadjuk őket, hivatkozásként arra a commitra, amelynek a problémáját a beküldött javítás kijavítja (pl. „Fixes: e21d2170f366”). Az ütközések, ahol több különböző változtatás egyetlen rövidített azonosítóhoz kapcsolódik, megzavarhatják a „Fixes” címkék tartalmát figyelembe vevő változtatáselemző és validáló eszközöket. Ezeket a címkéket például a linux-next ágban használt check_fixes kezelőben, valamint a sebezhetőségi javításelemző és a javítás életciklus-követő szkriptekben használják.
Linus Torvalds szkepticizmusát fejezte ki a rövidített azonosítók minimális méretének növelésére irányuló javaslattal kapcsolatban, mivel egy adattárban a commitok tényleges száma lényegesen kisebb, mint az objektumok száma (körülbelül 1/8). Valószínűleg, ha véletlen átfedések történnek, azok egy commit és egy más típusú objektum (például egy blob vagy branch) között lesznek. Véleménye szerint a rövidített azonosítókat a könnyű olvashatóság, az olvashatóság és az idézhetőség érdekében rövidítik, és jelenleg nincsenek objektív indokok a méretük növelésére.
Az egyik fejlesztő a méret csökkentését javasolta, miközben növeli a jelentős bitek számát egy új, Base36 kódoláson (0-9a-z karakterek) alapuló formátum használatával a hexadecimális számjegyek helyett. Linus úgy véli, hogy egy ilyen változtatás több problémát okozna, mint amennyit megoldana. Például szükséges lenne az új formátum támogatásának hozzáadása a meglévő segédprogramokhoz, és egy formátumazonosító bevezetése a régi és az új formátumok megkülönböztetésére.
Annak bizonyítására, hogy a rövidített azonosítókkal kapcsolatos probléma nem spekulatív, és nem szabad késleltetni a megoldását, Case Cook létrehozott egy kernel dokumentációs módosítást, amelynek rövidített azonosítója (1da177e4c3f4) megegyezett a 2.6.12-rc2 kernel ág commit azonosítójával. Az ütközést hat óra számítás után találták meg egy NVIDIA GeForce RTX 3080 GPU-val rendelkező rendszeren.
A kiválasztást a lucky-commit eszközkészlettel végeztük: véletlenszerű szóközöket adtunk a céljavítás szövegéhez, amíg a 12 karakteres SHA-1 előtag meg nem egyezett a kernelben már jelen lévő commit előtagokkal. Case szerint a probléma nem annyira a véletlenszerű átfedések, mint inkább a rövidített azonosítók rosszindulatú manipulálásának lehetősége, például bizonyos ellenőrzések megkerülése.
Forrás: opennet.ru
