CVE-2026-89720 in Linux
摘要
由 VulDB • 2026-09-11
在 Linux 内核中,已修复以下漏洞:
ubifs:修复签名长度检查中的越界读取问题
`ubifs_sb_verify_signature()` 函数在向 `verify_pkcs7_signature()` 传递签名载荷之前,会对磁盘上的 `ubifs_sig_node->len` 字段进行边界限制,但该检查的符号方向错误:
```c if (le32_to_cpu(signode->len) > snod->len + sizeof(struct ubifs_sig_node)) ```
签名字节从节点偏移 `sizeof(struct ubifs_sig_node)`(即 UBIFS_SIG_NODE_SZ,64 字节)处开始,因此载荷长度最多为:
`snod->len - sizeof(struct ubifs_sig_node)`
字节。由于代码错误地添加了头大小而非减去它,导致接受的声明长度比节点实际持有的内容多出高达 `2 * UBIFS_SIG_NODE_SZ` —— 即超出 `c->sbuf`(其大小为 `vmalloc(c->leb_size)`)的末尾范围。随后,`verify_pkcs7_signature()` -> `pkcs7_parse_message()` -> `asn1_ber_decoder()` 会接收到这个膨胀后的长度,并在遍历 DER 头时发生越界读取。节点长度直接来自已挂载的镜像,因此经过精心构造的签名 UBIFS 镜像会通过 `ubifs_read_superblock()` 触发此问题,且该过程发生在对签名进行密码学验证之前。
由于节点扫描器(`c->ranges[UBIFS_SIG_NODE].min_len == UBIFS_SIG_NODE_SZ`)保证 `snod->len >= UBIFS_SIG_NODE_SZ`,因此修正后的减法操作不会发生下溢。合法签名的镜像不受影响:正确的超级块永远不会声明比其嵌入的节点更长的签名。
If you want to get best quality of vulnerability data, you may have to visit VulDB.