Tým z University of Minnesota odhalil podrobnosti o škodlivých změnách, které byly odeslány.

Po otevřeném omluvném dopise skupina výzkumníků z University of Minnesota, jejichž přijetí změn linuxového jádra zablokoval Greg Croah-Hartman, odhalila podrobné informace o záplatách zaslaných vývojářům jádra a korespondenci s jeho správci. související s těmito záplatami.

Je pozoruhodné, že všechny problematické patche byly z iniciativy správců zamítnuty, nebyl schválen ani jeden patch. Tato skutečnost objasňuje, proč se Greg Croah-Hartman choval tak tvrdě, protože není jasné, co by výzkumníci udělali, kdyby byly záplaty schváleny správci. Při zpětném pohledu tvrdili, že měli v úmyslu nahlásit chybu a nedovolili, aby se záplaty dostaly do Gitu, ale není jasné, co by ve skutečnosti udělali a jak daleko by mohli zajít.

Celkem v srpnu 2020 z anonymních adres [chráněno e-mailem] и [chráněno e-mailem] (dopis od Jamese Bonda) bylo zasláno pět patchů: dva správné (1, 2) a tři obsahující skryté chyby (1, 2, 3), vytvářející podmínky pro zranitelnosti. Každý patch obsahoval pouze 1-4 řádky kódu. Hlavní myšlenkou chybných záplat bylo, že oprava úniku paměti by mohla vytvořit podmínku dvojité volné zranitelnosti. O týden později byly vývojářům jádra zaslány informace s návrhem projednat možnost propagace zranitelností pod rouškou triviálních oprav úniků paměti, ale o předchozích pokusech o zasílání škodlivých záplat nebylo nic řečeno.

První problematický patch opravil únik paměti přidáním volání kfree() před vrácením řízení v případě chyby, ale vytvořil podmínky pro přístup k oblasti paměti po jejím uvolnění (use-after-free). Tento patch byl zamítnut správcem (Jiří Slaby), který problém identifikoval a poukázal na to, že před rokem se již někdo pokusil navrhnout podobnou změnu a byla zpočátku přijata, ale poté, co byly identifikovány podmínky zranitelnosti, byla zahozena. > p2 = p1[n] = kmalloc_array(64, sizeof(u16), GFP_KERNEL); > - if (!p2) return -ENOMEM; > + if (!p2) { > + kfree(p1); > + return -ENOMEM; > + }

Druhý patch také obsahoval podmínky pro problém bez použití. Zadaný patch nebyl přijat správcem (Dan Carpenter), který patch odmítl kvůli jinému problému s list_add_tail, ale nevšiml si, že by ukazatel "chdev" mohl být uvolněn ve funkci put_device, která se používá níže ve volání dev_err(&chdev ->dev..). Patch však nebyl přijat, i když z důvodů nesouvisejících se zranitelností. if (ret < 0) { + put_device(&chdev->dev); dev_err(&chdev->dev, DRV_NAME ": kfifo_alloc selhalo\n"); ret = -ENOMEM; goto err_fifo;

Třetí patch také nebyl přijat správcem (Miquel Raynal) kvůli další chybě nesouvisející se zranitelností (dvojité volání pro pdev). if (!window->virt) { printk(KERN_ERR MOD_NAME ": ioremap(%08lx, %08lx) selhalo\n", okno->phys, okno->velikost); + pci_dev_put(pdev); dostat se ven; } ... if (!map) { printk(KERN_ERR MOD_NAME ": kmalloc selhal"); + pci_dev_put(pdev); dostat se ven; } memset(mapa, 0, sizeof(*mapa)); ... if (mtd_device_register(map->mtd, NULL, 0)) { mapa_destroy(map->mtd); mapa->mtd = NULL; + pci_dev_put(pdev); dostat se ven; }

Zajímavé je, že zpočátku se předpokládalo, že 4 z 5 patchů mají problémy, ale sami výzkumníci udělali chybu a v jednom patchi, který byl podle jejich názoru problematický, byla navržena správná oprava, aniž by nastaly očekávané podmínky pro využití paměti po volném čase. err = pci_request_mem_regions(pdev, nitrox_driver_name); if (err) { pci_disable_device(pdev); + dev_err(&pdev->dev, “Nepodařilo se požádat o oblasti paměti!\n”); return err; }

Zdroj: opennet.ru

Přidat komentář