CVE-2024-49882CWE-415

CVE-2024-49882

High · published October 21, 2024

CVSS v3.1
7.8
EPSS
0%
Percentile
23.7
In the wild
Unconfirmed
What it is

In the Linux kernel, the following vulnerability has been resolved:

ext4: fix double brelse() the buffer of the extents path

In ext4_ext_try_to_merge_up(), set path[1].p_bh to NULL after it has been

released, otherwise it may be released twice. An example of what triggers

this is as follows:

split2 map split1

|--------|-------|--------|

ext4_ext_map_blocks

ext4_ext_handle_unwritten_extents

ext4_split_convert_extents

// path->p_depth == 0

ext4_split_extent

// 1. do split1

ext4_split_extent_at

|ext4_ext_insert_extent

| ext4_ext_create_new_leaf

| ext4_ext_grow_indepth

| le16_add_cpu(&neh->eh_depth, 1)

| ext4_find_extent

| // return -ENOMEM

|// get error and try zeroout

|path = ext4_find_extent

| path->p_depth = 1

|ext4_ext_try_to_merge

| ext4_ext_try_to_merge_up

| path->p_depth = 0

| brelse(path[1].p_bh) ---> not set to NULL here

|// zeroout success

// 2. update path

ext4_find_extent

// 3. do split2

ext4_split_extent_at

ext4_ext_insert_extent

ext4_ext_create_new_leaf

ext4_ext_grow_indepth

le16_add_cpu(&neh->eh_depth, 1)

ext4_find_extent

path[0].p_bh = NULL;

path->p_depth = 1

read_extent_tree_block ---> return err

// path[1].p_bh is still the old value

ext4_free_ext_path

ext4_ext_drop_refs

// path->p_depth == 1

brelse(path[1].p_bh) ---> brelse a buffer twice

Finally got the following WARRNING when removing the buffer from lru:

============================================

VFS: brelse: Trying to free free buffer

WARNING: CPU: 2 PID: 72 at fs/buffer.c:1241 __brelse+0x58/0x90

CPU: 2 PID: 72 Comm: kworker/u19:1 Not tainted 6.9.0-dirty #716

RIP: 0010:__brelse+0x58/0x90

Call Trace:

<TASK>

__find_get_block+0x6e7/0x810

bdev_getblk+0x2b/0x480

__ext4_get_inode_loc+0x48a/0x1240

ext4_get_inode_loc+0xb2/0x150

ext4_reserve_inode_write+0xb7/0x230

__ext4_mark_inode_dirty+0x144/0x6a0

ext4_ext_insert_extent+0x9c8/0x3230

ext4_ext_map_blocks+0xf45/0x2dc0

ext4_map_blocks+0x724/0x1700

ext4_do_writepages+0x12d6/0x2a70

[...]

============================================

The record
Technical detail
CVSS v3.1
7.8 · HIGH
Vector
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
CVSS v4.0
Not supplied
EPSS
0.00319 · 23.7th percentile
Weakness
CWE-415 · Double Free
Published
2024-10-21T22:15Z
Affected products (9)
ProductVersionsFixed in
debian/debian_linuxall versions—
linux/linux_kernel≥ 3.7, < 4.19.3234.19.323
linux/linux_kernel≥ 4.20, < 5.4.2855.4.285
linux/linux_kernel≥ 5.5, < 5.10.2275.10.227
linux/linux_kernel≥ 5.11, < 5.15.1685.15.168
linux/linux_kernel≥ 5.16, < 6.1.1136.1.113
linux/linux_kernel≥ 6.2, < 6.6.556.6.55
linux/linux_kernel≥ 6.7, < 6.10.146.10.14
linux/linux_kernel≥ 6.11, < 6.11.36.11.3
References (11)
EPSS history
Timeline
  • 21 OCT 18:01Z
    ext4: fix double brelse() the buffer of the extents path
    cvelistv5