Каманда з Універсітэта Мінесоты раскрыла дэталі аб адпраўленых шкоднасных зменах

Следам за адкрытым лістом з выбачэннямі група даследчыкаў з Універсітэта Мінесоты, прыём змяненняў у ядро ​​Linux ад якой быў заблакаваны Грегам Кроа-Хартманам, раскрыла дэталёвую інфармацыю аб адпраўленых распрацоўшчыкам ядра патчах і звязаную з гэтымі патчамі перапіску з мэйнтэйнерамі.

Характэрна, што ўсе з праблемных патчаў былі адпрэчаны па ініцыятыве мэйнтэйнераў, ніводны з патчаў не быў ухвалены. Указаны факт дае зразумець, чаму Грег Кроа-Хартман паступіў гэтак жорстка, бо незразумела як паступілі б даследчыкі, калі б патчы былі адобраны мэйнтэйнерамі. Заднім чыслом яны сцвярджалі, што мелі намер паведаміць пра памылку і не дапусцілі б паступленне патчаў у Git, але незразумела як яны паступілі б насамрэч і наколькі далёка маглі зайсці.

Усяго ў жніўні 2020 года з ананімных адрасоў [электронная пошта абаронена] и [электронная пошта абаронена] (ліст ад Джэймса Бонда) было адпраўлена пяць патчаў: два карэктных (1, 2) і тры якія ўключаюць утоеныя памылкі (1, 2, 3), якія ствараюць умовы для ўзнікнення ўразлівасцяў. Кожны патч утрымоўваў усяго 1-4 радкі кода. Асноўная ідэя памылковых патчаў была ў тым, што выпраўленне ўцечкі памяці можа ствараць умову з'яўлення ўразлівасці з-за падвойнага вызвалення памяці. Тыдзень праз распрацоўнікам ядра была адпраўленая інфармацыя з прапановай абмеркаваць магчымасць пасоўвання ўразлівасцяў пад выглядам трывіяльных выпраўленняў уцечак памяці, але пра раней прадпрынятыя спробы адпраўкі шкоднасных патчаў нічога сказанае не было.

Першы праблемны патч ухіляў уцечку памяці, дадаючы выклік kfree() перад вяртаннем кіравання ў выпадку памылкі, але ствараў умовы для звароту да вобласці памяці пасля яе вызвалення (use-after-free). Указаны патч быў адпрэчаны суправаджаючым (Jiri Slaby), які вызначыў наяўнасць праблемы і паказаў, што год таму хтосьці ўжо спрабаваў прапанаваць падобнае змяненне і яно было спачатку прынята, але потым адкінута пасля выяўлення ўмоў з'яўлення ўразлівасці. > p2 = p1[n] = kmalloc_array(64, sizeof(u16), GFP_KERNEL); > - if (!p2) return -ENOMEM; > + if (!p2) { > + kfree(p1); > + return -ENOMEM; > + }

Другі патч таксама змяшчаў умовы ўзнікнення праблемы use-after-free. Указаны патч не быў прыняты суправаджаючым (Dan Carpenter), які адхіліў патч з-за іншай праблемы з list_add_tail, але не звярнуў увагу на тое, што ў функцыі put_device можа быць вызвалены паказальнік «chdev», які ніжэй выкарыстоўваецца ў выкліку dev_err(&chdev ->dev..). Тым не менш, патч не быў прыняты, хоць і з прычыны, не звязанай з уразлівасцю. if (ret < 0) { + put_device(&chdev->dev); dev_err(&chdev->dev, DRV_NAME ": kfifo_alloc failed\n"); ret = -ENOMEM; goto err_fifo;

Трэці патч таксама не быў прыняты мэйнтэйнерам (Miquel Raynal) з-за наяўнасці іншай памылкі, не звязанай з уразлівасцю (двайны выклік put для pdev). if (!window->virt) { printk(KERN_ERR MOD_NAME ": ioremap(%08lx, %08lx) failed\n", window->phys, window->size); + pci_dev_put(pdev); goto out; } … if (!map) { printk(KERN_ERR MOD_NAME ": kmalloc failed"); + pci_dev_put(pdev); goto out; } memset(map, 0, sizeof(*map)); … if (mtd_device_register(map->mtd, NULL, 0)) { map_destroy(map->mtd); map->mtd = NULL; + pci_dev_put(pdev); goto out; }

Цікава, што першапачаткова меркавалася, што 4 з 5 патчаў маюць праблемы, але даследнікі самі дапусцілі памылку і ў адным праблемным, па іх меркаванні, патчы было прапанавана карэктнае выпраўленне, без узнікнення меркаваных умоў для выкарыстання памяці пасля вызвалення. err = pci_request_mem_regions(pdev, nitrox_driver_name); if (err) { pci_disable_device(pdev); + dev_err(&pdev->dev, 'Failed to request mem regions!\n'); return err; }

Крыніца: opennet.ru

Дадаць каментар