Description
In the Linux kernel, the following vulnerability has been resolved: fbdev: rivafb: fix divide error in nv3_arb() A userspace program can trigger the RIVA NV3 arbitration code by calling the FBIOPUT_VSCREENINFO ioctl on /dev/fb*. When doing so, the driver recomputes FIFO arbitration parameters in nv3_arb(), using state->mclk_khz (derived from the PRAMDAC MCLK PLL) as a divisor without validating it first. In a normal setup, state->mclk_khz is provided by the real hardware and is non-zero. However, an attacker can construct a malicious or misconfigured device (e.g. a crafted/emulated PCI device) that exposes a bogus PLL configuration, causing state->mclk_khz to become zero. Once nv3_get_param() calls nv3_arb(), the division by state->mclk_khz in the gns calculation causes a divide error and crashes the kernel. Fix this by checking whether state->mclk_khz is zero and bailing out before doing the division. The following log reveals it: rivafb: setting virtual Y resolution to 2184 divide error: 0000 [#1] PREEMPT SMP KASAN PTI CPU: 0 PID: 2187 Comm: syz-executor.0 Not tainted 5.18.0-rc1+ #1 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.12.0-59-gc9ba5276e321-prebuilt.qemu.org 04/01/2014 RIP: 0010:nv3_arb drivers/video/fbdev/riva/riva_hw.c:439 [inline] RIP: 0010:nv3_get_param+0x3ab/0x13b0 drivers/video/fbdev/riva/riva_hw.c:546 Call Trace: nv3CalcArbitration.constprop.0+0x255/0x460 drivers/video/fbdev/riva/riva_hw.c:603 nv3UpdateArbitrationSettings drivers/video/fbdev/riva/riva_hw.c:637 [inline] CalcStateExt+0x447/0x1b90 drivers/video/fbdev/riva/riva_hw.c:1246 riva_load_video_mode+0x8a9/0xea0 drivers/video/fbdev/riva/fbdev.c:779 rivafb_set_par+0xc0/0x5f0 drivers/video/fbdev/riva/fbdev.c:1196 fb_set_var+0x604/0xeb0 drivers/video/fbdev/core/fbmem.c:1033 do_fb_ioctl+0x234/0x670 drivers/video/fbdev/core/fbmem.c:1109 fb_ioctl+0xdd/0x130 drivers/video/fbdev/core/fbmem.c:1188 __x64_sys_ioctl+0x122/0x190 fs/ioctl.c:856
Product status
1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (git) before ec5a58f4fd581875593ea92a65485e1906a53c0f
1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (git) before 52916878db2b8e3769743a94484729f0844352df
1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (git) before 526460a96c5443e2fc0fd231edd1f9c49d2de26b
1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (git) before 78daf5984d96edec3b920c72a93bd6821b8710b7
1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (git) before 9efa0dc46270a8723c158c64afbcf1dead72b28c
1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (git) before 3e4cbd1d46c246dfa684c8e9d8c20ae0b960c50a
1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (git) before 73f0391e92d404da68f7484e57c106c5e673dc7e
1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (git) before 0209e21e3c372fa2da04c39214bec0b64e4eb5f4
2.6.12
Any version before 2.6.12
5.10.251 (semver)
5.15.201 (semver)
6.1.164 (semver)
6.6.127 (semver)
6.12.74 (semver)
6.18.13 (semver)
6.19.3 (semver)
7.0 (original_commit_for_fix)
References
git.kernel.org/...c/ec5a58f4fd581875593ea92a65485e1906a53c0f
git.kernel.org/...c/52916878db2b8e3769743a94484729f0844352df
git.kernel.org/...c/526460a96c5443e2fc0fd231edd1f9c49d2de26b
git.kernel.org/...c/78daf5984d96edec3b920c72a93bd6821b8710b7
git.kernel.org/...c/9efa0dc46270a8723c158c64afbcf1dead72b28c
git.kernel.org/...c/3e4cbd1d46c246dfa684c8e9d8c20ae0b960c50a
git.kernel.org/...c/73f0391e92d404da68f7484e57c106c5e673dc7e
git.kernel.org/...c/0209e21e3c372fa2da04c39214bec0b64e4eb5f4