[syzbot] UBSAN: array-index-out-of-bounds in udf_statfs

28 views
Skip to first unread message

syzbot

unread,
Apr 30, 2021, 3:28:23 PM4/30/21
to ja...@suse.com, linux-...@vger.kernel.org, syzkall...@googlegroups.com
Hello,

syzbot found the following issue on:

HEAD commit: e77a830c Merge branch 'akpm' (patches from Andrew)
git tree: upstream
console output: https://syzkaller.appspot.com/x/log.txt?x=14c63e6dd00000
kernel config: https://syzkaller.appspot.com/x/.config?x=c0a6882014fd3d45
dashboard link: https://syzkaller.appspot.com/bug?extid=7fbfe5fed73ebb675748
compiler: Debian clang version 11.0.1-2
syz repro: https://syzkaller.appspot.com/x/repro.syz?x=17612825d00000
C reproducer: https://syzkaller.appspot.com/x/repro.c?x=132cb56dd00000

IMPORTANT: if you fix the issue, please add the following tag to the commit:
Reported-by: syzbot+7fbfe5...@syzkaller.appspotmail.com

loop0: detected capacity change from 0 to 3974
UDF-fs: INFO Mounting volume 'LinuxUDF', timestamp 2020/09/19 18:44 (1000)
================================================================================
UBSAN: array-index-out-of-bounds in fs/udf/super.c:2524:12
index 0 is out of range for type '__le32 [0]'
CPU: 1 PID: 8363 Comm: syz-executor557 Not tainted 5.12.0-rc8-syzkaller #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
Call Trace:
__dump_stack lib/dump_stack.c:79 [inline]
dump_stack+0x202/0x31e lib/dump_stack.c:120
ubsan_epilogue lib/ubsan.c:148 [inline]
__ubsan_handle_out_of_bounds+0xdb/0x130 lib/ubsan.c:288
udf_count_free fs/udf/super.c:2524 [inline]
udf_statfs+0x49f/0xd70 fs/udf/super.c:2408
statfs_by_dentry fs/statfs.c:66 [inline]
vfs_statfs+0x136/0x310 fs/statfs.c:90
user_statfs fs/statfs.c:105 [inline]
__do_sys_statfs fs/statfs.c:195 [inline]
__se_sys_statfs+0xe5/0x210 fs/statfs.c:192
do_syscall_64+0x2d/0x70 arch/x86/entry/common.c:46
entry_SYSCALL_64_after_hwframe+0x44/0xae
RIP: 0033:0x444579
Code: ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 40 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 c0 ff ff ff f7 d8 64 89 01 48
RSP: 002b:00007ffc428d7b58 EFLAGS: 00000246 ORIG_RAX: 0000000000000089
RAX: ffffffffffffffda RBX: 0030656c69662f2e RCX: 0000000000444579
RDX: 0000000000402b43 RSI: 0000000000000000 RDI: 00000000200001c0
RBP: 0000000000403e10 R08: 0000000000000000 R09: 0000000000000000
R10: 00007ffc428d7a20 R11: 0000000000000246 R12: 0000000000403ea0
R13: 0000000000000000 R14: 00000000004b2018 R15: 00000000004004a0
================================================================================
Kernel panic - not syncing: panic_on_warn set ...
CPU: 0 PID: 8363 Comm: syz-executor557 Not tainted 5.12.0-rc8-syzkaller #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
Call Trace:
__dump_stack lib/dump_stack.c:79 [inline]
dump_stack+0x202/0x31e lib/dump_stack.c:120
panic+0x2e1/0x850 kernel/panic.c:231
ubsan_epilogue lib/ubsan.c:162 [inline]
__ubsan_handle_out_of_bounds+0x12b/0x130 lib/ubsan.c:288
udf_count_free fs/udf/super.c:2524 [inline]
udf_statfs+0x49f/0xd70 fs/udf/super.c:2408
statfs_by_dentry fs/statfs.c:66 [inline]
vfs_statfs+0x136/0x310 fs/statfs.c:90
user_statfs fs/statfs.c:105 [inline]
__do_sys_statfs fs/statfs.c:195 [inline]
__se_sys_statfs+0xe5/0x210 fs/statfs.c:192
do_syscall_64+0x2d/0x70 arch/x86/entry/common.c:46
entry_SYSCALL_64_after_hwframe+0x44/0xae
RIP: 0033:0x444579
Code: ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 40 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 c0 ff ff ff f7 d8 64 89 01 48
RSP: 002b:00007ffc428d7b58 EFLAGS: 00000246 ORIG_RAX: 0000000000000089
RAX: ffffffffffffffda RBX: 0030656c69662f2e RCX: 0000000000444579
RDX: 0000000000402b43 RSI: 0000000000000000 RDI: 00000000200001c0
RBP: 0000000000403e10 R08: 0000000000000000 R09: 0000000000000000
R10: 00007ffc428d7a20 R11: 0000000000000246 R12: 0000000000403ea0
R13: 0000000000000000 R14: 00000000004b2018 R15: 00000000004004a0
Kernel Offset: disabled
Rebooting in 86400 seconds..


---
This report is generated by a bot. It may contain errors.
See https://goo.gl/tpsmEJ for more information about syzbot.
syzbot engineers can be reached at syzk...@googlegroups.com.

syzbot will keep track of this issue. See:
https://goo.gl/tpsmEJ#status for how to communicate with syzbot.
syzbot can test patches for this issue, for details see:
https://goo.gl/tpsmEJ#testing-patches

Randy Dunlap

unread,
May 2, 2021, 11:04:20 PM5/2/21
to syzbot, ja...@suse.com, linux-...@vger.kernel.org, syzkall...@googlegroups.com, Gustavo A. R. Silva, Arnd Bergmann
Hi all--

On 4/30/21 12:28 PM, syzbot wrote:
> Hello,
>
> syzbot found the following issue on:
>
> HEAD commit: e77a830c Merge branch 'akpm' (patches from Andrew)
> git tree: upstream
> console output: https://syzkaller.appspot.com/x/log.txt?x=14c63e6dd00000
> kernel config: https://syzkaller.appspot.com/x/.config?x=c0a6882014fd3d45
> dashboard link: https://syzkaller.appspot.com/bug?extid=7fbfe5fed73ebb675748
> compiler: Debian clang version 11.0.1-2
> syz repro: https://syzkaller.appspot.com/x/repro.syz?x=17612825d00000
> C reproducer: https://syzkaller.appspot.com/x/repro.c?x=132cb56dd00000
>
> IMPORTANT: if you fix the issue, please add the following tag to the commit:
> Reported-by: syzbot+7fbfe5...@syzkaller.appspotmail.com
>
> loop0: detected capacity change from 0 to 3974
> UDF-fs: INFO Mounting volume 'LinuxUDF', timestamp 2020/09/19 18:44 (1000)
> ================================================================================
> UBSAN: array-index-out-of-bounds in fs/udf/super.c:2524:12
> index 0 is out of range for type '__le32 [0]'


Is this just due to (from fs/udf/ecma_167.h) the "[0]" struct items?
Do they need to be "[]" instead? Will that satisfy USBAN?


/* Logical Volume Integrity Descriptor (ECMA 167r3 3/10.10) */
struct logicalVolIntegrityDesc {
struct tag descTag;
struct timestamp recordingDateAndTime;
__le32 integrityType;
struct extent_ad nextIntegrityExt;
uint8_t logicalVolContentsUse[32];
__le32 numOfPartitions;
__le32 lengthOfImpUse;
__le32 freeSpaceTable[0]; // <<<<<<<<<<<<<<<<
__le32 sizeTable[0]; // <<<<<<<<<<<<<<<<<<<
uint8_t impUse[0]; // <<<<<<<<<<<<<<<<<<<<<<<
} __packed;


(I ask because I cannot reproduce the problem -- maybe a bad GCC
version?)
thanks.
--
~Randy

Jan Kara

unread,
May 3, 2021, 4:55:10 AM5/3/21
to Randy Dunlap, syzbot, ja...@suse.com, linux-...@vger.kernel.org, syzkall...@googlegroups.com, Gustavo A. R. Silva, Arnd Bergmann
Well, checks for numOfPartitions and lengthOfImpUse are certainly missing
as well so maliciously corrupted filesystem (we have checksums for random
corruptions) could certainly cause bad access. I'll fix that. You have a
valid point that [0] arrays could confuse the compiler as well and
certainly are not the suggested way of doing stuff like this these days.
I'll get rid of those as well.

Honza
--
Jan Kara <ja...@suse.com>
SUSE Labs, CR
Reply all
Reply to author
Forward
0 new messages