Sherlock Fang, Vlad Tronciu, Ayam Babu
radareorg radare2 v.0.9.7 至 v.5.8.6 版本中存在一个问题,并在 v.5.8.8 中修复,本地攻击者可通过 grub_sfs_read_extent 函数导致拒绝服务。
精心构造一个载荷,使 “treeblock = grub_malloc(data->blocksize);” 在内存中指向 NULL,因此当 “treeblock” 的值被赋给 “tree = (struct grub_sfs_btree *) treeblock;” 时,“treeblock” 也指向 NULL。可利用程度取决于具体上下文,但此类空指针解引用漏洞会导致程序拒绝服务,进而影响整体程序性能。
在 grub_sfs_read_extent 函数内部存在一个安全漏洞,原因是未检查 tree_block 的状态。后续代码在未验证 tree_block 是否指向有效内存分配的情况下就继续使用它。当 tree 被赋值为转换为 struct grub_sfs_btree* 的 treeblock 值,并在调用 grub_disk_read 时使用时,将导致空指针解引用。在 C 语言中,解引用空指针属于未定义行为,通常会导致段错误或访问冲突,从而使程序崩溃。
我们通过添加对 grub_malloc 分配状态的检查来修复该漏洞,如下所示。
https://cwe.mitre.org/data/definitions/476.html
https://github.com/radareorg/radare2/issues/22586
https://github.com/radareorg/radare2/commit/8419d7d0cbe61c687dcb8a35de0acccb2ee4c220