[Bug 200401] New: Another buffer overrun in ext4_xattr_set_entry() when operating a corrupted ext4 image

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



https://bugzilla.kernel.org/show_bug.cgi?id=200401

            Bug ID: 200401
           Summary: Another buffer overrun in ext4_xattr_set_entry() when
                    operating a corrupted ext4 image
           Product: File System
           Version: 2.5
    Kernel Version: 4.18
          Hardware: All
                OS: Linux
              Tree: Mainline
            Status: NEW
          Severity: normal
          Priority: P1
         Component: ext4
          Assignee: fs_ext4@xxxxxxxxxxxxxxxxxxxx
          Reporter: wen.xu@xxxxxxxxxx
        Regression: No

Created attachment 277155
  --> https://bugzilla.kernel.org/attachment.cgi?id=277155&action=edit
The (compressed) crafted image which causes crash

- Reproduce (tested w/ dev branch)
# mkdir mnt
# mount -t ext4 final.img mnt
# gcc -o poc poc.c
# ./poc ./mnt

- Kernel message
[  211.941955]
==================================================================
[  211.943725] BUG: KASAN: out-of-bounds in ext4_xattr_set_entry+0x14e2/0x1990
[  211.945175] Read of size 18446744073709551604 at addr ffff8801cf4bc3f8 by
task poc/1379
[  211.946854]
[  211.947737]
[  211.948087] The buggy address belongs to the page:
[  211.949138] page:ffffea00073d2f00 count:2 mapcount:0
mapping:ffff8801e6f28610 index:0x11
[  211.950849] flags: 0x2ffff0000001074(referenced|dirty|lru|active|private)
[  211.952308] raw: 02ffff0000001074 ffff8801e6f28610 0000000000000011
00000002ffffffff
[  211.953921] raw: ffffea00073d2ee0 ffffea00073d2f60 ffff8801dc030c78
ffff8801e5212200
[  211.955548] page dumped because: kasan: bad access detected
[  211.956736] page->mem_cgroup:ffff8801e5212200
[  211.957673]
[  211.958021] Memory state around the buggy address:
[  211.959046]  ffff8801cf4bc280: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00
[  211.960581]  ffff8801cf4bc300: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00
[  211.962096] >ffff8801cf4bc380: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00
[  211.963637]                                                                
^
[  211.965106]  ffff8801cf4bc400: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00
[  211.966630]  ffff8801cf4bc480: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00
[  211.968154]
==================================================================
[  212.070820] systemd[1]: segfault at 5593546f5010 ip 00005593546f5010 sp
00007ffd3ee613c0 error 15
[  212.073130] systemd[1]: segfault at 8f8 ip 00007f997d5f266a sp
00007ffd3ee60cb0 error 4 in libc-2.23.so[7f997d575000+1c0000]
[  212.165887] BUG: unable to handle kernel paging request at ffff8801da800000
[  212.167411] PGD ef40067 P4D ef40067 PUD ef47067 PMD 1da8e5063 PTE
80000001da800061
[  212.169039] Oops: 0003 [#1] SMP KASAN PTI
[  212.169923] Modules linked in: snd_hda_codec_generic snd_hda_intel
snd_hda_codec snd_hwdep snd_hda_core snd_pcm snd_timer snd soundcore i2c_piix4
mac_hid ib_iser rdma_cm iw_cm ib_cm ib_core iscsi_tcp libiscsi_tcp libiscsi
scsi_transport_iscsi autofs4 btrfs zstd_decompress zstd_compress xxhash raid10
raid456 async_raid6_recov async_memcpy async_pq async_xor async_tx xor raid6_pq
raid1 raid0 multipath linear 8139too qxl drm_kms_helper syscopyarea
crct10dif_pclmul sysfillrect sysimgblt fb_sys_fops crc32_pclmul ttm drm
aesni_intel aes_x86_64 crypto_simd cryptd glue_helper 8139cp mii pata_acpi
floppy
[  212.181267] CPU: 1 PID: 1379 Comm: poc Tainted: G    B            
4.17.0-rc4+ #9
[  212.182814] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS
Ubuntu-1.8.2-1ubuntu1 04/01/2014
[  212.184864] RIP: 0010:__memmove+0x5b/0x1a0
[  212.185575] request_module: kmod_concurrent_max (0) close to 0
(max_modprobes: 50), for module binfmt-003e, throttling...
[  212.185756] RSP: 0018:ffff8801f283f0e8 EFLAGS: 00010286
[  212.189141] RAX: ffff8801cf4bc3e8 RBX: fffffffffffffff4 RCX:
ffffffffa0556472
[  212.190632] RDX: fffffffff4cbc3b4 RSI: ffff8801da800018 RDI:
ffff8801da7fffe8
[  212.192169] RBP: ffff8801f283f108 R08: 0000000000000000 R09:
0000000000000000
[  212.193679] R10: 0000000000000000 R11: 0000441f0f66ffff R12:
ffff8801cf4bc3e8
[  212.195185] R13: ffff8801cf4bc3f8 R14: ffff8801e0646d80 R15:
ffff8801f283f520
[  212.196683] FS:  00007f82fc326700(0000) GS:ffff8801f7100000(0000)
knlGS:0000000000000000
[  212.198365] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[  212.199580] CR2: ffff8801da800000 CR3: 00000001f37ac000 CR4:
00000000000006e0
[  212.201120] Call Trace:
[  212.201656]  ? memmove+0x45/0x50
[  212.202351]  ext4_xattr_set_entry+0x14e2/0x1990
[  212.203351]  ? save_stack+0x46/0xd0
[  212.204102]  ? kasan_kmalloc+0xad/0xe0
[  212.204896]  ? __kmalloc+0x11f/0x240
[  212.205672]  ? ext4_expand_extra_isize_ea+0x532/0xd20
[  212.206770]  ? __ext4_expand_extra_isize+0xd4/0x100
[  212.207863]  ? ext4_mark_inode_dirty+0x3a8/0x3d0
[  212.208869]  ? syscall_return_slowpath+0x80/0xd0
[  212.209851]  ? ext4_xattr_inode_get+0x430/0x430
[  212.210809]  ? __find_get_block+0x106/0x400
[  212.211724]  ? is_bpf_text_address+0xe/0x20
[  212.212644]  ? kernel_text_address+0xd6/0xf0
[  212.213550]  ? _cond_resched+0x1a/0x50
[  212.214347]  ? __getblk_gfp+0x31/0x3f0
[  212.215169]  ? kasan_check_write+0x14/0x20
[  212.216051]  ? _raw_spin_lock_irqsave+0x2a/0x60
[  212.217019]  ? strlen+0xf/0x40
[  212.217690]  ? xattr_find_entry+0x5b/0x140
[  212.218600]  ext4_xattr_ibody_set+0x58/0x120
[  212.219529]  ext4_expand_extra_isize_ea+0x897/0xd20
[  212.220578]  ? ext4_xattr_set+0x200/0x200
[  212.221483]  ? __getblk_gfp+0x31/0x3f0
[  212.222317]  ? mark_page_accessed+0x133/0x200
[  212.223428]  ? kasan_check_write+0x14/0x20
[  212.224306]  __ext4_expand_extra_isize+0xd4/0x100
[  212.225292]  ext4_mark_inode_dirty+0x3a8/0x3d0
[  212.226260]  ? ext4_expand_extra_isize+0x2e0/0x2e0
[  212.227298]  ? kasan_check_write+0x14/0x20
[  212.228180]  ? ext4_add_dirent_to_inline.isra.12+0x206/0x230
[  212.229389]  ? ext4_update_inline_data+0x340/0x340
[  212.230410]  ext4_try_add_inline_entry+0x16f/0x330
[  212.231686]  ? ext4_da_write_inline_data_end+0x110/0x110
[  212.232750]  ext4_add_entry+0x1d9/0x570
[  212.233536]  ? make_indexed_dir+0x940/0x940
[  212.234391]  ? jbd2__journal_start+0x19d/0x300
[  212.235401]  ? __ext4_journal_start_sb+0x89/0x180
[  212.236364]  ext4_rename+0xb01/0xd00
[  212.237109]  ? __x64_sys_rename+0x3b/0x50
[  212.237933]  ? ext4_tmpfile+0x2d0/0x2d0
[  212.238990]  ? ext4_find_entry+0x17d/0x770
[  212.239852]  ? legitimize_path.isra.28+0x61/0xa0
[  212.240835]  ? ext4_dx_find_entry+0x2c0/0x2c0
[  212.241755]  ? kasan_check_write+0x14/0x20
[  212.242613]  ? lockref_get+0xc2/0x140
[  212.243386]  ext4_rename2+0xa6/0x100
[  212.244122]  vfs_rename+0xaa5/0xde0
[  212.244838]  ? memcg_kmem_put_cache+0x55/0xa0
[  212.245719]  ? path_mountpoint+0x5b0/0x5b0
[  212.246551]  ? kasan_check_write+0x14/0x20
[  212.247403]  ? security_path_rename+0xcb/0x130
[  212.248302]  do_renameat2+0x7d2/0x860
[  212.249049]  ? user_path_create+0x40/0x40
[  212.249866]  ? lockref_put_return+0xd0/0x140
[  212.250731]  ? memset+0x31/0x40
[  212.251398]  ? handle_mm_fault+0x24b/0x380
[  212.252233]  ? __fput+0x28d/0x380
[  212.252916]  ? mm_fault_error+0x1f0/0x1f0
[  212.253738]  ? task_work_run+0x4d/0xf0
[  212.254506]  __x64_sys_rename+0x3b/0x50
[  212.255312]  do_syscall_64+0x78/0x170
[  212.256070]  entry_SYSCALL_64_after_hwframe+0x44/0xa9
[  212.257095] RIP: 0033:0x7f82fbdac367
[  212.257825] RSP: 002b:00007ffcc27d23c8 EFLAGS: 00000202 ORIG_RAX:
0000000000000052
[  212.259350] RAX: ffffffffffffffda RBX: 0000000000000000 RCX:
00007f82fbdac367
[  212.260763] RDX: 0000000001a700a0 RSI: 0000000001a700a0 RDI:
0000000001a70080
[  212.262177] RBP: 00007ffcc27d2530 R08: 0000000000000003 R09:
0000000000000000
[  212.265946] R10: 0000000000000640 R11: 0000000000000202 R12:
0000000000400c20
[  212.267382] R13: 00007ffcc27d2630 R14: 0000000000000000 R15:
0000000000000000
[  212.268798] Code: 40 38 fe 74 3b 48 83 ea 20 48 83 ea 20 4c 8b 1e 4c 8b 56
08 4c 8b 4e 10 4c 8b 46 18 48 8d 76 20 4c 89 1f 4c 89 57 08 4c 89 4f 10 <4c> 89
47 18 48 8d 7f 20 73 d4 48 83 c2 20 e9 a2 00 00 00 66 90
[  212.272600] RIP: __memmove+0x5b/0x1a0 RSP: ffff8801f283f0e8
[  212.273748] CR2: ffff8801da800000
[  212.274454] ---[ end trace c7e666925cc65cc5 ]---

- Note
This is a different issue from Bugzilla 199347
https://elixir.bootlin.com/linux/v4.18-rc3/source/fs/ext4/xattr.c#L1726
        } else if (s->not_found) {
                /* Insert new name. */
                size_t size = EXT4_XATTR_LEN(name_len);
                size_t rest = (void *)last - (void *)here + sizeof(__u32);

                memmove((void *)here + size, here, rest);
                memset(here, 0, size);
Kernel crashes at memmove with negative length

Reported by Wen Xu (wen.xu@xxxxxxxxxx) from SSLab at Gatech.

-- 
You are receiving this mail because:
You are watching the assignee of the bug.



[Index of Archives]     [Reiser Filesystem Development]     [Ceph FS]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux FS]     [Yosemite National Park]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Device Mapper]     [Linux Media]

  Powered by Linux