明尼苏达大学的一个团队透露了有关发送的恶意更改的详细信息。

在一封公开道歉信之后,来自明尼苏达大学的一组研究人员透露了有关发送给内核开发人员的补丁以及与维护人员的通信的详细信息,该大学接受 Linux 内核的更改被 Greg Croah-Hartman 阻止与这些补丁相关。

值得注意的是,所有有问题的补丁都被维护者主动拒绝;没有一个补丁被批准。 这一事实清楚地表明了为什么格雷格·克罗哈-哈特曼 (Greg Croah-Hartman) 的行为如此严厉,因为尚不清楚如果补丁得到维护者的批准,研究人员会做什么。 事后看来,他们声称他们打算报告一个错误,并且不会允许补丁发布到 Git,但目前还不清楚他们实际上会做什么以及他们可能走了多远。

2020 年 XNUMX 月来自匿名地址的总数 [电子邮件保护] и [电子邮件保护] (詹姆斯·邦德的来信)已发送五个补丁:两个正确(1、2),三个包含隐藏错误(1、2、3),为漏洞创造了条件。 每个补丁仅包含 1-4 行代码。 错误补丁背后的主要思想是修复内存泄漏可能会造成双重释放漏洞情况。 一周后,信息被发送给内核开发人员,并提议讨论以内存泄漏的琐碎修复为幌子推广漏洞的可能性,但没有提及之前发送恶意补丁的尝试。

第一个有问题的补丁通过在发生错误时返回控制之前添加对 kfree() 的调用来修复内存泄漏,但为释放内存区域后访问内存区域(释放后使用)创造了条件。 该补丁被维护者(Jiri Slaby)拒绝,他发现了这个问题,并指出一年前有人已经尝试提出类似的更改,最初被接受,但在确定漏洞的条件后被丢弃。 > p2 = p1[n] = kmalloc_array(64, sizeof(u16), GFP_KERNEL); > - if (!p2) 返回 -ENOMEM; > + if (!p2) { > + kfree(p1); > + 返回-ENOMEM; > + }

第二个补丁还包含释放后使用问题的条件。 指定的补丁未被维护者(Dan Carpenter)接受,他由于list_add_tail的另一个问题而拒绝了该补丁,但没有注意到“chdev”指针可以在put_device函数中被释放,该函数在下面的调用中使用dev_err(&chdev ->dev..)。 然而,该补丁并未被接受,尽管原因与该漏洞无关。 if (ret < 0) { + put_device(&chdev->dev); dev_err(&chdev->dev, DRV_NAME ": kfifo_alloc 失败\n"); ret = -ENOMEM; 转到 err_fifo;

第三个补丁也没有被维护者(Miquel Raynal)接受,因为另一个与该漏洞无关的错误(对 pdev 的双重调用)。 if (!window->virt) { printk(KERN_ERR MOD_NAME ": ioremap(%08lx, %08lx) 失败\n", window->phys, window->size); + pci_dev_put(pdev); 转到出去; } ... if (!map) { printk(KERN_ERR MOD_NAME ": kmalloc 失败"); + pci_dev_put(pdev); 转到出去; } memset(map, 0, sizeof(*map)); ... if (mtd_device_register(map->mtd, NULL, 0)) { map_destroy(map->mtd); 地图->mtd = NULL; + pci_dev_put(pdev); 转到出去; }

有趣的是,最初认为 4 个补丁中有 5 个存在问题,但研究人员自己犯了一个错误,在一个有问题的补丁中,他们提出了正确的修复方案,但没有达到释放后内存使用的预期条件。 err = pci_request_mem_regions(pdev, nitrox_driver_name); 如果(错误){ pci_disable_device(pdev); + dev_err(&pdev->dev, “请求内存区域失败!\n”); 返回错误; }

来源: opennet.ru

添加评论