Tim sa Sveučilišta u Minnesoti otkrio je detalje o zlonamjernim promjenama koje su poslane.

Nakon otvorenog pisma isprike, grupa istraživača sa Sveučilišta u Minnesoti, čije je prihvaćanje promjena na jezgri Linuxa blokirao Greg Croah-Hartman, otkrila je detaljne informacije o zakrpama poslanim programerima jezgre i prepisci s održavateljima vezano za ove zakrpe.

Zanimljivo je da su sve problematične zakrpe odbijene na inicijativu održavatelja, niti jedna zakrpa nije odobrena. Ova činjenica jasno pokazuje zašto je Greg Croah-Hartman postupio tako oštro, budući da je nejasno što bi istraživači učinili da su zakrpe odobreni od strane održavatelja. Gledajući unazad, tvrdili su da su namjeravali prijaviti grešku i da ne bi dopustili da zakrpe odu Gitu, ali nije jasno što bi zapravo učinili i koliko su daleko otišli.

Ukupno u kolovozu 2020. sa anonimnih adresa [e-pošta zaštićena] и [e-pošta zaštićena] (pismo Jamesa Bonda) poslano je pet zakrpa: dvije ispravne (1, 2) i tri koje sadrže skrivene pogreške (1, 2, 3), stvarajući uvjete za ranjivosti. Svaka zakrpa sadržavala je samo 1-4 linije koda. Glavna ideja koja stoji iza pogrešnih zakrpa bila je da popravljanje curenja memorije može stvoriti stanje dvostruke slobodne ranjivosti. Tjedan dana kasnije, informacije su poslane programerima kernela s prijedlogom da se razgovara o mogućnosti promoviranja ranjivosti pod krinkom trivijalnih popravaka za curenje memorije, ali ništa nije rečeno o prethodnim pokušajima slanja zlonamjernih zakrpa.

Prva problematična zakrpa popravila je curenje memorije dodavanjem poziva kfree() prije vraćanja kontrole u slučaju pogreške, ali je stvorila uvjete za pristup memorijskom području nakon što je ono oslobođeno (use-after-free). Ovu zakrpu je odbio održavatelj (Jiri Slaby), koji je identificirao problem i istaknuo da je prije godinu dana netko već pokušao predložiti sličnu promjenu te je isprva prihvaćena, ali je zatim odbačena nakon identificiranja uvjeta za ranjivost. > p2 = p1[n] = kmalloc_array(64, sizeof(u16), GFP_KERNEL); > - if (!p2) return -ENOMEM; > + if (!p2) { > + kfree(p1); > + povratak -ENOMEM; > +}

Druga zakrpa također je sadržavala uvjete za problem korištenja nakon besplatnog korištenja. Navedenu zakrpu nije prihvatio održavatelj (Dan Carpenter), koji je odbio zakrpu zbog drugog problema s list_add_tail, ali nije primijetio da se pokazivač "chdev" može osloboditi u funkciji put_device, koja se koristi u nastavku u pozivu dev_err(&chdev ->dev..). Međutim, zakrpa nije prihvaćena, iako iz razloga koji nisu povezani s ranjivošću. if (ret < 0) { + stavi_uređaj(&chdev->dev); dev_err(&chdev->dev, DRV_NAME ": kfifo_alloc nije uspio\n"); ret = -ENOMEM; goto err_fifo;

Treću zakrpu također nije prihvatio održavatelj (Miquel Raynal) zbog drugog buga koji nije povezan s ranjivošću (dvostruki poziv za postavljanje za pdev). if (!window->virt) { printk(KERN_ERR MOD_NAME ": ioremap(%08lx, %08lx) nije uspio\n", window->phys, window->size); + pci_dev_put(pdev); izaći van; } ... if (!map) { printk(KERN_ERR MOD_NAME ": kmalloc nije uspio"); + pci_dev_put(pdev); izaći van; } memset(mapa, 0, sizeof(*mapa)); ... if (mtd_device_register(map->mtd, NULL, 0)) { map_destroy(map->mtd); karta->mtd = NULL; + pci_dev_put(pdev); izaći van; }

Zanimljivo, u početku se pretpostavljalo da će 4 od 5 zakrpa imati problema, ali su sami istraživači pogriješili i u jednoj zakrpi za koju su mislili da je problematična, predložen je točan popravak, bez očekivanih uvjeta za korištenje memorije nakon oslobađanja. pogreška = pci_request_mem_regions(pdev, nitrox_driver_name); if (greška) { pci_onemogući_uređaj(pdev); + dev_err(&pdev->dev, “Neuspješno traženje mem regija!\n”); povratak pogreška; }

Izvor: opennet.ru

Dodajte komentar