[PATCH] fs/squashfs fix overflow in sqfs_find_inode()

Quentin Schulz quentin.schulz at cherry.de
Mon Apr 27 19:17:09 CEST 2026


Hi Jared,

Thanks for the report and the possible patch.

On 4/26/26 10:45 PM, Jared Stroud wrote:
> [You don't often get email from dllcoolj at archcloudlabs.com. Learn why this is important at https://aka.ms/LearnAboutSenderIdentification ]
> 
> Hello u-boot list,
> 
> I found a parsing bug in sqfs_find_inode().
> While fuzzing the file_size attributes of the squashfs_reg_inode structure, if the file_size attribute has a sufficient large value, &base->inode_number will jump to an arbitrary location in memory resulting in a invalid memory access and crash.
> 
> I tested this with a modified file SquashFS file system and U-Boot Sandbox with release 2026.01.
> 
> ```
>          for (k = 0; k < le32_to_cpu(inode_count); k++) {
> 
>                  // 3) jump ahead in the inode_table from new offset
>                  base = inode_table + offset;
> 
>                  // 4) attempt to access location in memory
>                  if (get_unaligned_le32(&base->inode_number) == inode_number)
>                          return inode_table + offset;
> 
>                  // 1) large file size is read here
>                  sz = sqfs_inode_size(base, le32_to_cpu(block_size));
> 
>                  if (sz < 0)
>                          return NULL;
> 
>                  // 2) file size is added to offset
>                  offset += sz;
>          }
> ```
> 
> The crash and resulting ASAN output can be seen below.
> ```
> hit any key to stop autoboot: 0
> => host bind 0 random3.sqfs
> => ls host 0 /
> AddressSanitizer:DEADLYSIGNAL
> =================================================================
> ==75950==ERROR: AddressSanitizer: SEGV on unknown address 0x000067128936 (pc 0x0000006689a1 bp 0x000019b354a0 sp 0x7fff2b718600 T0)
> ==75950==The signal is caused by a READ memory access.
>      #0 0x0000006689a1 in sqfs_find_inode fs/squashfs/sqfs_inode.c:131
>      #1 0x000000660c79 in sqfs_search_dir fs/squashfs/sqfs.c:489
>      #2 0x000000662af6 in sqfs_opendir_nest fs/squashfs/sqfs.c:977
>      #3 0x0000006238e3 in fs_opendir fs/fs.c:669
>      #4 0x000000623c67 in fs_ls_generic fs/fs.c:66
>      #5 0x000000623fc2 in fs_ls fs/fs.c:537
>      #6 0x000000623fc2 in do_ls fs/fs.c:881
>      #7 0x000000623fc2 in do_ls.isra.0 fs/fs.c:870
>      #8 0x0000004eae8e in cmd_call common/command.c:582
>      #9 0x0000004eae8e in cmd_process common/command.c:637
>      #10 0x0000004da9d6 in run_pipe_real common/cli_hush.c:1672
>      #11 0x0000004da9d6 in run_list_real common/cli_hush.c:1868
>      #12 0x0000004db112 in run_list common/cli_hush.c:2017
>      #13 0x0000004db112 in parse_stream_outer common/cli_hush.c:3207
>      #14 0x0000004117eb in parse_file_outer common/cli_hush.c:3299
>      #15 0x0000004117eb in cli_loop common/cli.c:306
>      #16 0x0000004117eb in main_loop common/main.c:86
>      #17 0x0000004117eb in run_main_loop common/board_r.c:584
>      #18 0x0000004117eb in initcall_run_r common/board_r.c:776
>      #19 0x0000004117eb in board_init_r common/board_r.c:806
>      #20 0x0000004117eb in sandbox_main arch/sandbox/cpu/start.c:584
>      #21 0x7fb1a66105b4 in __libc_start_call_main (/lib64/libc.so.6+0x35b4) (BuildId: 5e8f131adc80bf454af46edf4a1527ae61e1b968)
>      #22 0x7fb1a6610667 in __libc_start_main@@GLIBC_2.34 (/lib64/libc.so.6+0x3667) (BuildId: 5e8f131adc80bf454af46edf4a1527ae61e1b968)
>      #23 0x000000401524 in _start (/usr/src/u-boot/u-boot+0x401524) (BuildId: 7121dd98eb40baab73fe6c0941c8200f29e1ad23)
> 
> ==75950==Register values:
> rax = 0x000000006712892a  rbx = 0x00000000009dbaa0  rcx = 0x0000000000020000  rdx = 0x0000000000000000
> rdi = 0x0000000000006fd5  rsi = 0x0000000000007abd  rbp = 0x0000000019b354a0  rsp = 0x00007fff2b718600
>   r8 = 0x000000004d5f348a   r9 = 0x0000000067128936  r10 = 0x0000000000000501  r11 = 0x0000000000000001
> r12 = 0x0000000000000002  r13 = 0x0000000000000001  r14 = 0x0000000019a0e900  r15 = 0x0000000000000001
> AddressSanitizer can not provide additional info.
> SUMMARY: AddressSanitizer: SEGV fs/squashfs/sqfs_inode.c:131 in sqfs_find_inode
> ==75950==ABORTING
> ```
> 
> This bug is similar to CVE-2024-57254 in that memory operations are occuring based on inode values.
> I applied a similar fixed via the commmit c8e929e5758999933f9e905049ef2bf3fe6b140d, re-tested U-Boot with the crashing file system, and successfully avoided the crash.
> 
> ```
>   fs/squashfs/sqfs_inode.c | 3 +++
>   1 file changed, 3 insertions(+)
> 
> diff --git a/fs/squashfs/sqfs_inode.c b/fs/squashfs/sqfs_inode.c
> index ce9a8ff8e2a..addd76cc07e 100644
> --- a/fs/squashfs/sqfs_inode.c
> +++ b/fs/squashfs/sqfs_inode.c
> @@ -135,6 +135,9 @@ void *sqfs_find_inode(void *inode_table, int inode_number, __le32 inode_count,
>                  if (sz < 0)
>                          return NULL;
> 
> +               if (__builtin_add_overflow(offset, sz, &offset))
> +                       return NULL;
> +
>                  offset += sz;
>          }
> 
> --
> 2.53.0
> `

Please send this as a proper patch (we don't accept patches sent as 
attachment) on the mailing list following the instructions from 
https://docs.u-boot.org/en/latest/CONTRIBUTE.html and 
https://docs.u-boot.org/en/latest/develop/sending_patches.html. This 
will make it more likely to be looked at.

Cheers,
Quentin


More information about the U-Boot mailing list