Ett team från University of Minnesota har avslöjat detaljer om de skadliga ändringarna som skickades.

Efter ett öppet brev med ursäkt avslöjade en grupp forskare från University of Minnesota, vars godkännande av ändringar i Linux-kärnan blockerades av Greg Croah-Hartman, detaljerad information om de patchar som skickats till kärnutvecklarna och korrespondensen med underhållarna relaterade till dessa patchar.

Det är anmärkningsvärt att alla problematiska patchar avvisades på initiativ av underhållarna, inte en enda patch godkändes. Detta faktum gör det tydligt varför Greg Croah-Hartman agerade så hårt, eftersom det är oklart vad forskarna skulle ha gjort om plåstren hade godkänts av underhållarna. I efterhand hävdade de att de hade för avsikt att rapportera en bugg och inte skulle ha låtit patcharna gå till Git, men det är oklart vad de egentligen skulle ha gjort och hur långt de kan ha gått.

Totalt i augusti 2020 från anonyma adresser [e-postskyddad] и [e-postskyddad] (brev från James Bond) fem patchar skickades: två korrekta (1, 2) och tre innehållande dolda fel (1, 2, 3), vilket skapar förutsättningar för sårbarheter. Varje patch innehöll endast 1-4 rader kod. Huvudtanken bakom de felaktiga patcharna var att fixering av en minnesläcka kunde skapa ett dubbelt ledigt sårbarhetstillstånd. En vecka senare skickades information till kärnutvecklarna med ett förslag om att diskutera möjligheten att främja sårbarheter under sken av triviala korrigeringar för minnesläckor, men inget sades om tidigare försök att skicka skadliga patchar.

Den första problematiska patchen fixade minnesläckan genom att lägga till ett anrop till kfree() innan kontrollen returnerades i händelse av ett fel, men skapade förutsättningar för att komma åt minnesområdet efter att det frigjordes (use-after-free). Denna patch avvisades av underhållaren (Jiri Slaby), som identifierade problemet och påpekade att för ett år sedan hade någon redan försökt föreslå en liknande förändring och den accepterades först, men kasserades sedan efter att ha identifierat förutsättningarna för sårbarheten. > p2 = pl[n] = kmalloc_array(1, sizeof(u64), GFP_KERNEL); > - om (!p16) returnera -ENOMEM; > + if (!p2) { > + kfree(p2); > + retur -ENOMEM; > + }

Det andra plåstret innehöll också villkor för problemet efter användning. Den angivna patchen accepterades inte av underhållaren (Dan Carpenter), som avvisade patchen på grund av ett annat problem med list_add_tail, men märkte inte att "chdev"-pekaren kunde frigöras i put_device-funktionen, som används nedan i anropet dev_err(&chdev ->dev..). Plåstret accepterades dock inte, även om det av skäl som inte var relaterade till sårbarheten. if (ret < 0) { + put_device(&chdev->dev); dev_err(&chdev->dev, DRV_NAME ": kfifo_alloc misslyckades\n"); ret = -ENOMEM; goto err_fifo;

Den tredje patchen accepterades inte heller av underhållaren (Miquel Raynal) på grund av en annan bugg som inte var relaterad till sårbarheten (dubbel anrop att sätta för pdev). if (!fönster->virt) { printk(KERN_ERR MOD_NAME ": ioremap(%08lx, %08lx) misslyckades\n", fönster->fys, fönster->storlek); + pci_dev_put(pdev); gå ut; } ... if (!map) { printk(KERN_ERR MOD_NAME ": kmalloc misslyckades"); + pci_dev_put(pdev); gå ut; } memset(karta, 0, storlek på(*karta)); ... if (mtd_device_register(map->mtd, NULL, 0)) { map_destroy(map->mtd); map->mtd = NULL; + pci_dev_put(pdev); gå ut; }

Intressant nog antogs 4 av 5 patchar från början ha problem, men forskarna själva gjorde ett misstag och i en patch som var problematisk, enligt deras mening, föreslogs en korrekt fix, utan att förväntade förutsättningar för minnesanvändning efter fri inträffade. err = pci_request_mem_regions(pdev, nitrox_driver_name); if (fel) { pci_disable_device(pdev); + dev_err(&pdev->dev, “Det gick inte att begära memregioner!\n”); returnera fel; }

Källa: opennet.ru

Lägg en kommentar