CVE-2024-42115
Publication date:
30/07/2024
In the Linux kernel, the following vulnerability has been resolved:<br />
<br />
jffs2: Fix potential illegal address access in jffs2_free_inode<br />
<br />
During the stress testing of the jffs2 file system,the following<br />
abnormal printouts were found:<br />
[ 2430.649000] Unable to handle kernel paging request at virtual address 0069696969696948<br />
[ 2430.649622] Mem abort info:<br />
[ 2430.649829] ESR = 0x96000004<br />
[ 2430.650115] EC = 0x25: DABT (current EL), IL = 32 bits<br />
[ 2430.650564] SET = 0, FnV = 0<br />
[ 2430.650795] EA = 0, S1PTW = 0<br />
[ 2430.651032] FSC = 0x04: level 0 translation fault<br />
[ 2430.651446] Data abort info:<br />
[ 2430.651683] ISV = 0, ISS = 0x00000004<br />
[ 2430.652001] CM = 0, WnR = 0<br />
[ 2430.652558] [0069696969696948] address between user and kernel address ranges<br />
[ 2430.653265] Internal error: Oops: 96000004 [#1] PREEMPT SMP<br />
[ 2430.654512] CPU: 2 PID: 20919 Comm: cat Not tainted 5.15.25-g512f31242bf6 #33<br />
[ 2430.655008] Hardware name: linux,dummy-virt (DT)<br />
[ 2430.655517] pstate: 20000005 (nzCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)<br />
[ 2430.656142] pc : kfree+0x78/0x348<br />
[ 2430.656630] lr : jffs2_free_inode+0x24/0x48<br />
[ 2430.657051] sp : ffff800009eebd10<br />
[ 2430.657355] x29: ffff800009eebd10 x28: 0000000000000001 x27: 0000000000000000<br />
[ 2430.658327] x26: ffff000038f09d80 x25: 0080000000000000 x24: ffff800009d38000<br />
[ 2430.658919] x23: 5a5a5a5a5a5a5a5a x22: ffff000038f09d80 x21: ffff8000084f0d14<br />
[ 2430.659434] x20: ffff0000bf9a6ac0 x19: 0169696969696940 x18: 0000000000000000<br />
[ 2430.659969] x17: ffff8000b6506000 x16: ffff800009eec000 x15: 0000000000004000<br />
[ 2430.660637] x14: 0000000000000000 x13: 00000001000820a1 x12: 00000000000d1b19<br />
[ 2430.661345] x11: 0004000800000000 x10: 0000000000000001 x9 : ffff8000084f0d14<br />
[ 2430.662025] x8 : ffff0000bf9a6b40 x7 : ffff0000bf9a6b48 x6 : 0000000003470302<br />
[ 2430.662695] x5 : ffff00002e41dcc0 x4 : ffff0000bf9aa3b0 x3 : 0000000003470342<br />
[ 2430.663486] x2 : 0000000000000000 x1 : ffff8000084f0d14 x0 : fffffc0000000000<br />
[ 2430.664217] Call trace:<br />
[ 2430.664528] kfree+0x78/0x348<br />
[ 2430.664855] jffs2_free_inode+0x24/0x48<br />
[ 2430.665233] i_callback+0x24/0x50<br />
[ 2430.665528] rcu_do_batch+0x1ac/0x448<br />
[ 2430.665892] rcu_core+0x28c/0x3c8<br />
[ 2430.666151] rcu_core_si+0x18/0x28<br />
[ 2430.666473] __do_softirq+0x138/0x3cc<br />
[ 2430.666781] irq_exit+0xf0/0x110<br />
[ 2430.667065] handle_domain_irq+0x6c/0x98<br />
[ 2430.667447] gic_handle_irq+0xac/0xe8<br />
[ 2430.667739] call_on_irq_stack+0x28/0x54<br />
The parameter passed to kfree was 5a5a5a5a, which corresponds to the target field of<br />
the jffs_inode_info structure. It was found that all variables in the jffs_inode_info<br />
structure were 5a5a5a5a, except for the first member sem. It is suspected that these<br />
variables are not initialized because they were set to 5a5a5a5a during memory testing,<br />
which is meant to detect uninitialized memory.The sem variable is initialized in the<br />
function jffs2_i_init_once, while other members are initialized in<br />
the function jffs2_init_inode_info.<br />
<br />
The function jffs2_init_inode_info is called after iget_locked,<br />
but in the iget_locked function, the destroy_inode process is triggered,<br />
which releases the inode and consequently, the target member of the inode<br />
is not initialized.In concurrent high pressure scenarios, iget_locked<br />
may enter the destroy_inode branch as described in the code.<br />
<br />
Since the destroy_inode functionality of jffs2 only releases the target,<br />
the fix method is to set target to NULL in jffs2_i_init_once.
Severity CVSS v4.0: Pending analysis
Last modification:
30/07/2024