CVE-2024-47706 Information
Description
In the Linux kernel the following vulnerability has been resolved:
block bfq: fix possible UAF for bfqq->bic with merge chain
-
initial state three tasks:
Process 1 Process 2 Process 3 (BIC1) (BIC2) (BIC3) | ? | ? | ? | | | | | | V | V | V | bfqq1 bfqq2 bfqq3
process ref: 1 1 1
-
bfqq1 merged to bfqq2:
Process 1 Process 2 Process 3 (BIC1) (BIC2) (BIC3) | | | ? \--------------\| | | V V | bfqq1--------->bfqq2 bfqq3
process ref: 0 2 1
-
bfqq2 merged to bfqq3:
Process 1 Process 2 Process 3 (BIC1) (BIC2) (BIC3)here -> ? | | -————-\ -————| V V bfqq1———>bfqq2———->bfqq3 process ref: 0 1 3
In this case IO from Process 1 will get bfqq2 from BIC1 first and then get bfqq3 through merge chain and finially handle IO by bfqq3. Howerver current code will think bfqq2 is owned by BIC1 like initial state and set bfqq2->bic to BIC1.
bfq_insert_request -> by Process 1 bfqq = bfq_init_rq(rq) bfqq = bfq_get_bfqq_handle_split bfqq = bic_to_bfqq -> get bfqq2 from BIC1 bfqq->ref++ rq->elv.priv[0] = bic rq->elv.priv[1] = bfqq if (bfqq_process_refs(bfqq) == 1) bfqq->bic = bic -> record BIC1 to bfqq2
__bfq_insert_request new_bfqq = bfq_setup_cooperator -> get bfqq3 from bfqq2->new_bfqq bfqq_request_freed(bfqq) new_bfqq->ref++ rq->elv.priv[1] = new_bfqq -> handle IO by bfqq3
Fix the problem by checking bfqq is from merge chain fist. And this might fix a following problem reported by our syzkaller(unreproducible):
================================================================== BUG: KASAN: slab-use-after-free in bfq_do_early_stable_merge block/bfq-iosched.c:5692 [inline] BUG: KASAN: slab-use-after-free in bfq_do_or_sched_stable_merge block/bfq-iosched.c:5805 [inline] BUG: KASAN: slab-use-after-free in bfq_get_queue+0x25b0/0x2610 block/bfq-iosched.c:5889 Write of size 1 at addr ffff888123839eb8 by task kworker/0:1H/18595
CPU: 0 PID: 18595 Comm: kworker/0:1H Tainted: G L 6.6.0-07439-gba2303cacfda 6
Hardware name: QEMU Standard PC (i440FX + PIIX 1996) BIOS rel-1.14.0-0-g155821a1990b-prebuilt.qemu.org 04/01/2014
Workqueue: kblockd blk_mq_requeue_work
Call Trace:
Allocated by task 20776: kasan_save_stack+0x20/0x40 mm/kasan/common.c:45 kasan_set_track+0x25/0x30 mm/kasan/common.c:52 __kasan_slab_alloc+0x87/0x90 mm/kasan/common.c:328 kasan_slab_alloc include/linux/kasan.h:188 [inline] slab_post_alloc_hook mm/slab.h:763 [inline] slab_alloc_node mm/slub.c:3458 [inline] kmem_cache_alloc_node+0x1a4/0x6f0 mm/slub.c:3503 ioc_create_icq block/blk-ioc.c:370 [inline]
truncated—
CVSS Vector
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H
Reference
https://git.kernel.org/stable/c/e1277ae780cca4e69ef5468d4582dfd48f0b8320 https://git.kernel.org/stable/c/8aa9de02a4be2e7006e636816ce19b0d667ceaa3 https://git.kernel.org/stable/c/ddbdaad123254fb53e32480cb74a486a6868b1e0 https://git.kernel.org/stable/c/7faed2896d78e48ec96229e73b30b0af6c00a9aa https://git.kernel.org/stable/c/880692ee233ba63808182705b3333403413b58f5 https://git.kernel.org/stable/c/6d130db286ad0ea392c96ebb2551acf0d7308048 https://git.kernel.org/stable/c/18ad4df091dd5d067d2faa8fce1180b79f7041a7
Attack Complexity
LOW
Privileges Required
LOW
User Interaction Required
LOW
Scope
NONE
Confidentiality Impact
UNCHANGED
Integrity Impact
NONE
Availability Impact
NONE
Base Score
HIGH
Base Severity
5.5
Share on: