iov_iter: use kmemdup_array for dup_iter to harden against overflow#736
iov_iter: use kmemdup_array for dup_iter to harden against overflow#736blktests-ci[bot] wants to merge 1 commit intolinus-master_basefrom
Conversation
|
Upstream branch: 9a9c8ce |
70128c9 to
b85986b
Compare
78a4682 to
8f17195
Compare
|
Upstream branch: 028ef9c |
b85986b to
9c01aee
Compare
8f17195 to
6b4d829
Compare
|
Upstream branch: d60bc14 |
9c01aee to
8057705
Compare
|
Upstream branch: d60bc14 |
8057705 to
5b82972
Compare
6b4d829 to
ceec5ed
Compare
|
Upstream branch: b4e0758 |
5b82972 to
e971730
Compare
ceec5ed to
3b54e52
Compare
|
Upstream branch: 6596a02 |
e971730 to
8a4509a
Compare
3b54e52 to
6a0b974
Compare
|
Upstream branch: 507bd4b |
8a4509a to
e27fd09
Compare
6a0b974 to
59ca59b
Compare
|
Upstream branch: dd6c438 |
e27fd09 to
bd8ef90
Compare
94f0438 to
857ada9
Compare
|
Upstream branch: dd6c438 |
bd8ef90 to
9315963
Compare
857ada9 to
482ce5b
Compare
|
Upstream branch: dca922e |
9315963 to
d494deb
Compare
482ce5b to
5a9f7c7
Compare
While auditing the Linux 7.0-rc2 kernel, I identified a potential security vulnerability in the iov_iter framework's memory allocation logic. The dup_iter() function, which is exported via EXPORT_SYMBOL, currently uses kmemdup() with a raw multiplication to allocate the duplicate iovec array: new->iov = kmemdup(from->iov, nr_segs * sizeof(struct iovec), gfp); The hazard here is that dup_iter() relies on a primitive multiplication without any integrated overflow check. Since nr_segs is often derived from user-space input, this line is vulnerable to integer overflow (on 32-bit systems or via type narrowing), potentially leading to a small allocation followed by a large out-of-bounds memory copy. Furthermore, it allows for unbounded memory allocations, as the function lacks intrinsic knowledge of safe limits. On the 7.0-rc2 branch, several high-impact callchains still rely on this exported function: drivers/usb/gadget/function/f_fs.c: The ffs_epfile_read_iter() path demonstrates why relying on dup_iter() is dangerous: it performs allocation based on user input before verifying driver state. This confirms that dup_iter() must be hardened internally as it cannot assume pre-validated input. drivers/usb/gadget/legacy/inode.c: The ep_read_iter() path illustrates how dup_iter()’s lack of boundary awareness compounds resource risks. When combined with other allocations, it creates a multiplier effect for kernel memory pressure. This patch replaces kmemdup() with kmemdup_array(), which utilizes check_mul_overflow() to ensure the allocation size is calculated safely, hardening dup_iter() against malicious or malformed inputs from its callers Signed-off-by: Wang Haoran <[email protected]> Reviewed-by: Christoph Hellwig <[email protected]>
|
Upstream branch: e75a43c |
d494deb to
f559dca
Compare
Pull request for series with
subject: iov_iter: use kmemdup_array for dup_iter to harden against overflow
version: 1
url: https://patchwork.kernel.org/project/linux-block/list/?series=1080485