Description
In the Linux kernel, the following vulnerability has been resolved: sched/fair: Fix overflow in update_tg_cfs_runnable() A divide-by-zero crash is observed when running hackbench: [14697.488452] CPU: 112 UID: 0 PID: 124791 Comm: hackbench Not tainted 7.1.0-rc2+ [14697.492627] RIP: 0010:propagate_entity_load_avg+0x35f/0x3e0 [14697.506799] <TASK> [14697.507411] __dequeue_task+0x2b4/0xc70 [14697.508677] dequeue_task_fair+0x36/0x370 [14697.509047] dequeue_task+0x101/0x2f0 [14697.509426] __schedule+0x1b1/0x1a00 [14697.510868] anon_pipe_read+0x3da/0x450 [14697.511400] vfs_read+0x361/0x390 [14697.512053] __x64_sys_read+0x19/0x30 The divide-by-zero happens here: if (scale_load_down(gcfs_rq->load.weight)) { load_sum = div_u64(gcfs_rq->avg.load_sum, scale_load_down(gcfs_rq->load.weight)); } gcfs_rq->load.weight is an insane large value and is truncated to the lower 32 bits by div_u64, which happen to be 0. Using AI for investigation, the cause is a u32 overflow in update_tg_cfs_runnable(), and flat pickup became a victim when using tg_tasks(): u32 new_sum, divider; ... new_sum = se->avg.runnable_avg * divider; <-- boom The following sequence shows how this triggers the crash: propagate_entity_load_avg() update_tg_cfs_runnable() # u32 overflow corrupts runnable_sum __update_load_avg_cfs_rq() ___update_load_avg() # computes insane runnable_avg update_tg_load_avg() # propagates to tg->runnable_avg update_cfs_group() calc_concur_shares() tg_tasks() # long-to-int truncation, negative nr reweight_entity() # corrupted se->load.weight update_load_add() # corrupted cfs_rq->load.weight propagate_entity_load_avg() update_tg_cfs_load() div_u64() # divide-by-zero Fix by widening new_sum from u32 to u64 (no need to force tg_tasks() to return unsigned long after this fix)
Affected products
Version statuses are supplied by the assigning organization. Consult the original record for detailed ranges and platform conditions.
Linux Linux
Default version status: unaffected
95246d1ec80b8d19d882cd8eb7ad094e63b41bb8 to < 39d707097a0820c6e87eff4195f0940e8ff1147eaffected95246d1ec80b8d19d882cd8eb7ad094e63b41bb8 to < 69fafae4eb2c9fc9bcff1bcbfcccf5d197434d75affected95246d1ec80b8d19d882cd8eb7ad094e63b41bb8 to < 7cc237e3bc1733928313d2462b413ae441b0eef3affected95246d1ec80b8d19d882cd8eb7ad094e63b41bb8 to < 18fdd0978ec3dda0ff6865cd273e47e022180710affected95246d1ec80b8d19d882cd8eb7ad094e63b41bb8 to < f94e62d21faad5e244d0874598a4d0ebbc0ea405affected95246d1ec80b8d19d882cd8eb7ad094e63b41bb8 to < 4f166adb5cb0525d9e32d45729fd8f28c80acbeeaffected
Linux Linux
Default version status: affected
5.17affected0 to < 5.17unaffected6.1.188 to ≤ 6.1.*unaffected6.6.157 to ≤ 6.6.*unaffected6.12.110 to ≤ 6.12.*unaffected6.18.52 to ≤ 6.18.*unaffected7.2.6 to ≤ 7.2.*unaffected7.3 to ≤ *unaffected
References
- https://git.kernel.org/stable/c/39d707097a0820c6e87eff4195f0940e8ff1147e ↗
- https://git.kernel.org/stable/c/69fafae4eb2c9fc9bcff1bcbfcccf5d197434d75 ↗
- https://git.kernel.org/stable/c/7cc237e3bc1733928313d2462b413ae441b0eef3 ↗
- https://git.kernel.org/stable/c/18fdd0978ec3dda0ff6865cd273e47e022180710 ↗
- https://git.kernel.org/stable/c/f94e62d21faad5e244d0874598a4d0ebbc0ea405 ↗
- https://git.kernel.org/stable/c/4f166adb5cb0525d9e32d45729fd8f28c80acbee ↗