I have been able to trigger a use-after-free in btrfs on a stock Arch
Linux kernel, versions 5.2.9 and 5.2.11. I also reproduced it on
kernel.org mainline 5.3-rc8, resulting in this KASAN report:


[49286.511157] BTRFS info (device sdi1): balance: start 
-dvrange=2221681934336..2221681934337
[49286.515651] BTRFS info (device sdi1): relocating block group 2221681934336 
flags data|raid0
[49294.092536] 
==================================================================
[49294.092637] BUG: KASAN: use-after-free in btrfs_init_reloc_root+0x2bf/0x330 
[btrfs]
[49294.092645] Write of size 8 at addr ffff8885b4901440 by task 
kworker/u24:6/10894

[49294.092657] CPU: 8 PID: 10894 Comm: kworker/u24:6 Tainted: P           OE    
 5.3.0-rc8-rc-kasan #2
[49294.092661] Hardware name: To Be Filled By O.E.M. To Be Filled By O.E.M./X99 
Extreme4, BIOS P3.80 04/06/2018
[49294.092726] Workqueue: btrfs-endio-write btrfs_endio_write_helper [btrfs]
[49294.092730] Call Trace:
[49294.092743]  dump_stack+0x71/0xa0
[49294.092751]  print_address_description+0x67/0x323
[49294.092817]  ? btrfs_init_reloc_root+0x2bf/0x330 [btrfs]
[49294.092879]  ? btrfs_init_reloc_root+0x2bf/0x330 [btrfs]
[49294.092884]  __kasan_report.cold+0x1a/0x3d
[49294.092945]  ? btrfs_init_reloc_root+0x2bf/0x330 [btrfs]
[49294.092951]  kasan_report+0xe/0x12
[49294.093012]  btrfs_init_reloc_root+0x2bf/0x330 [btrfs]
[49294.093066]  record_root_in_trans+0x2ba/0x3a0 [btrfs]
[49294.093119]  btrfs_record_root_in_trans+0xd2/0x150 [btrfs]
[49294.093170]  start_transaction+0x1c3/0xea0 [btrfs]
[49294.093226]  btrfs_finish_ordered_io+0x811/0x1610 [btrfs]
[49294.093233]  ? syscall_return_via_sysret+0xf/0x7f
[49294.093238]  ? syscall_return_via_sysret+0xf/0x7f
[49294.093243]  ? __switch_to_asm+0x40/0x70
[49294.093248]  ? __switch_to_asm+0x34/0x70
[49294.093300]  ? btrfs_unlink_subvol+0xa30/0xa30 [btrfs]
[49294.093307]  ? finish_task_switch+0x1a1/0x760
[49294.093312]  ? __switch_to+0x457/0xe90
[49294.093317]  ? __switch_to_asm+0x34/0x70
[49294.093378]  normal_work_helper+0x15a/0xb90 [btrfs]
[49294.093387]  process_one_work+0x706/0x1200
[49294.093394]  worker_thread+0x92/0xfb0
[49294.093401]  ? __kthread_parkme+0x85/0x100
[49294.093406]  ? process_one_work+0x1200/0x1200
[49294.093410]  kthread+0x2ba/0x3b0
[49294.093414]  ? kthread_park+0x130/0x130
[49294.093420]  ret_from_fork+0x35/0x40

[49294.093431] Allocated by task 11689:
[49294.093441]  __kasan_kmalloc.part.0+0x3c/0xa0
[49294.093493]  btrfs_read_tree_root+0x8f/0x350 [btrfs]
[49294.093542]  btrfs_read_fs_root+0xc/0xc0 [btrfs]
[49294.093601]  create_reloc_root+0x445/0x920 [btrfs]
[49294.093660]  btrfs_init_reloc_root+0x1da/0x330 [btrfs]
[49294.093709]  record_root_in_trans+0x2ba/0x3a0 [btrfs]
[49294.093758]  btrfs_record_root_in_trans+0xd2/0x150 [btrfs]
[49294.093806]  start_transaction+0x1c3/0xea0 [btrfs]
[49294.093856]  __btrfs_prealloc_file_range+0x1c2/0xa50 [btrfs]
[49294.093907]  btrfs_prealloc_file_range+0x10/0x20 [btrfs]
[49294.093966]  prealloc_file_extent_cluster+0x24e/0x4a0 [btrfs]
[49294.094025]  relocate_file_extent_cluster+0x193/0xc90 [btrfs]
[49294.094083]  relocate_data_extent+0x1f2/0x460 [btrfs]
[49294.094142]  relocate_block_group+0x5a5/0xf50 [btrfs]
[49294.094200]  btrfs_relocate_block_group+0x38f/0x990 [btrfs]
[49294.094258]  btrfs_relocate_chunk+0x5c/0x100 [btrfs]
[49294.094315]  btrfs_balance+0x1292/0x2f00 [btrfs]
[49294.094373]  btrfs_ioctl_balance+0x4c2/0x6a0 [btrfs]
[49294.094430]  btrfs_ioctl+0xe56/0x82d0 [btrfs]
[49294.094434]  do_vfs_ioctl+0x99f/0xf10
[49294.094437]  ksys_ioctl+0x5e/0x90
[49294.094440]  __x64_sys_ioctl+0x6f/0xb0
[49294.094446]  do_syscall_64+0xa0/0x370
[49294.094451]  entry_SYSCALL_64_after_hwframe+0x44/0xa9

[49294.094457] Freed by task 11689:
[49294.094464]  __kasan_slab_free+0x144/0x1f0
[49294.094468]  kfree+0x95/0x2a0
[49294.094516]  btrfs_drop_snapshot+0x1529/0x1c40 [btrfs]
[49294.094573]  clean_dirty_subvols+0x23f/0x380 [btrfs]
[49294.094632]  relocate_block_group+0x95b/0xf50 [btrfs]
[49294.094691]  btrfs_relocate_block_group+0x38f/0x990 [btrfs]
[49294.094748]  btrfs_relocate_chunk+0x5c/0x100 [btrfs]
[49294.094805]  btrfs_balance+0x1292/0x2f00 [btrfs]
[49294.094863]  btrfs_ioctl_balance+0x4c2/0x6a0 [btrfs]
[49294.094920]  btrfs_ioctl+0xe56/0x82d0 [btrfs]
[49294.094923]  do_vfs_ioctl+0x99f/0xf10
[49294.094926]  ksys_ioctl+0x5e/0x90
[49294.094929]  __x64_sys_ioctl+0x6f/0xb0
[49294.094934]  do_syscall_64+0xa0/0x370
[49294.094939]  entry_SYSCALL_64_after_hwframe+0x44/0xa9

[49294.094946] The buggy address belongs to the object at ffff8885b4901100
                which belongs to the cache kmalloc-2k of size 2048
[49294.094953] The buggy address is located 832 bytes inside of
                2048-byte region [ffff8885b4901100, ffff8885b4901900)
[49294.094957] The buggy address belongs to the page:
[49294.094962] page:ffffea0016d24000 refcount:1 mapcount:0 
mapping:ffff88864400e800 index:0x0 compound_mapcount: 0
[49294.094968] flags: 0x2ffff0000010200(slab|head)
[49294.094976] raw: 02ffff0000010200 dead000000000100 dead000000000122 
ffff88864400e800
[49294.094981] raw: 0000000000000000 00000000800f000f 00000001ffffffff 
0000000000000000
[49294.094983] page dumped because: kasan: bad access detected

[49294.094987] Memory state around the buggy address:
[49294.094992]  ffff8885b4901300: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb 
fb
[49294.094997]  ffff8885b4901380: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb 
fb
[49294.095002] >ffff8885b4901400: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb 
fb
[49294.095006]                                            ^
[49294.095010]  ffff8885b4901480: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb 
fb
[49294.095015]  ffff8885b4901500: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb 
fb
[49294.095018] 
==================================================================
[49301.893672] BTRFS info (device sdi1): 1 enospc errors during balance
[49301.893675] BTRFS info (device sdi1): balance: ended with status: -28


Without KASAN, I would eventually get an oops like this:


[170020.060858] BUG: unable to handle page fault for address: fffff47e48011248
[170020.060863] #PF: supervisor read access in kernel mode
[170020.060865] #PF: error_code(0x0000) - not-present page
[170020.060866] PGD 0 P4D 0 
[170020.060870] Oops: 0000 [#1] PREEMPT SMP PTI
[170020.060873] CPU: 1 PID: 26807 Comm: kworker/1:1 Tainted: P        W  OE     
5.2.9-arch1-1-ARCH #1
[170020.060875] Hardware name: To Be Filled By O.E.M. To Be Filled By 
O.E.M./X99 Extreme4, BIOS P3.80 04/06/2018
[170020.060882] Workqueue: events proc_cleanup_work
[170020.060888] RIP: 0010:kfree+0x4e/0x1a0
[170020.060891] Code: 80 48 01 df 0f 82 64 01 00 00 48 c7 c0 00 00 00 80 48 2b 
05 0c 9f ef 00 48 01 c7 48 c1 ef 0c 48 c1 e7 06 48 03 3d ea 9e ef 00 <48> 8b 47 
08 48 8d 50 ff a8 01 48 0f 45 fa 48 8b 57 08 48 8d 42 ff
[170020.060892] RSP: 0018:ffffa9f1883f7df8 EFLAGS: 00010282
[170020.060895] RAX: 00006da180000000 RBX: 000000000044996c RCX: 
0000000000800058
[170020.060896] RDX: 0000000000800059 RSI: ffff9262044c9fe0 RDI: 
fffff47e48011240
[170020.060897] RBP: ffff9260e4ca8e00 R08: 0000000000000001 R09: 
ffffffff8a223a2e
[170020.060899] R10: ffff926487403980 R11: ffffa9f1883f7de0 R12: 
ffffffff8a223a2e
[170020.060900] R13: ffff92648786f700 R14: 0000000000000000 R15: 
0ffff92648786f70
[170020.060902] FS:  0000000000000000(0000) GS:ffff926487840000(0000) 
knlGS:0000000000000000
[170020.060904] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[170020.060906] CR2: fffff47e48011248 CR3: 00000001c55fe006 CR4: 
00000000001606e0
[170020.060907] Call Trace:
[170020.060915]  memcg_destroy_list_lru_node.isra.0+0x2e/0x40
[170020.060918]  list_lru_destroy+0xb9/0xf0
[170020.060923]  deactivate_locked_super+0x42/0x70
[170020.060927]  cleanup_mnt+0x3f/0x70
[170020.060931]  process_one_work+0x1d1/0x3e0
[170020.060935]  worker_thread+0x4a/0x3d0
[170020.060938]  kthread+0xfb/0x130
[170020.060941]  ? process_one_work+0x3e0/0x3e0
[170020.060943]  ? kthread_park+0x80/0x80
[170020.060948]  ret_from_fork+0x35/0x40
[170020.060952] Modules linked in: qmi_wwan cdc_wdm usbnet mii i2c_dev 
snd_seq_dummy snd_seq xfs jfs rpcsec_gss_krb5 auth_rpcgss nfsv4 dns_resolver 
nfs lockd grace sunrpc fscache tun ipt_REJECT nft_redir nf_tables_set 
nft_fib_inet nft_fib_ipv4 nft_fib_ipv6 nft_fib nft_reject_inet nf_reject_ipv4 
nf_reject_ipv6 nft_reject nft_ct nft_chain_nat nf_tables nfnetlink ip6table_nat 
ip6table_mangle ip6table_raw ip6table_security iptable_nat nf_nat 
iptable_mangle iptable_raw iptable_security nf_conntrack nf_defrag_ipv6 
nf_defrag_ipv4 ip6table_filter ip6_tables iptable_filter cfg80211 rfkill 8021q 
garp mrp stp llc nct6775 vmnet(OE) hwmon_vid nls_iso8859_1 nls_cp437 vfat fat 
intel_rapl x86_pkg_temp_thermal intel_powerclamp coretemp kvm_intel iTCO_wdt 
iTCO_vendor_support joydev mousedev kvm irqbypass crct10dif_pclmul crc32_pclmul 
ghash_clmulni_intel aesni_intel aes_x86_64 crypto_simd cryptd glue_helper 
intel_cstate intel_uncore snd_hda_codec_hdmi intel_wmi_thunderbolt 
intel_rapl_perf pcspkr mxm_wmi
[170020.060991]  snd_usb_audio snd_usbmidi_lib snd_rawmidi snd_seq_device 
input_leds media snd_hda_codec_realtek snd_hda_codec_generic usblp 
ledtrig_audio snd_hda_intel snd_hda_codec snd_hda_core snd_hwdep snd_pcm e1000e 
snd_timer mei_me mei snd lpc_ich soundcore i2c_i801 pcc_cpufreq evdev mac_hid 
fuse vmmon(OE) vmw_vmci sg crypto_user ip_tables x_tables btrfs libcrc32c 
crc32c_generic xor usbhid raid6_pq uas usb_storage sd_mod ahci libahci libata 
xhci_pci crc32c_intel scsi_mod ehci_pci xhci_hcd ehci_hcd wmi nvidia_drm(POE) 
drm_kms_helper syscopyarea sysfillrect sysimgblt fb_sys_fops drm agpgart 
nvidia_uvm(OE) nvidia_modeset(POE) nvidia(POE) ipmi_devintf ipmi_msghandler 
hid_generic hid
[170020.061024] CR2: fffff47e48011248
[170020.061027] ---[ end trace 51e55b474e252eae ]---
[170020.061029] RIP: 0010:kfree+0x4e/0x1a0
[170020.061032] Code: 80 48 01 df 0f 82 64 01 00 00 48 c7 c0 00 00 00 80 48 2b 
05 0c 9f ef 00 48 01 c7 48 c1 ef 0c 48 c1 e7 06 48 03 3d ea 9e ef 00 <48> 8b 47 
08 48 8d 50 ff a8 01 48 0f 45 fa 48 8b 57 08 48 8d 42 ff
[170020.061033] RSP: 0018:ffffa9f1883f7df8 EFLAGS: 00010282
[170020.061035] RAX: 00006da180000000 RBX: 000000000044996c RCX: 
0000000000800058
[170020.061037] RDX: 0000000000800059 RSI: ffff9262044c9fe0 RDI: 
fffff47e48011240
[170020.061038] RBP: ffff9260e4ca8e00 R08: 0000000000000001 R09: 
ffffffff8a223a2e
[170020.061039] R10: ffff926487403980 R11: ffffa9f1883f7de0 R12: 
ffffffff8a223a2e
[170020.061041] R13: ffff92648786f700 R14: 0000000000000000 R15: 
0ffff92648786f70
[170020.061043] FS:  0000000000000000(0000) GS:ffff926487840000(0000) 
knlGS:0000000000000000
[170020.061044] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[170020.061045] CR2: fffff47e48011248 CR3: 00000001c55fe006 CR4: 
00000000001606e0


I only noticed this bug because I keep an eye on dmesg. In one instance,
I ignored it for a few hours, then my graphics driver crashed because of
memory allocation failure and/or heap corruption. Aside from that, I
have seen no obvious effects.

I have hit this bug at least 5 times over the last two weeks. Every
time, it has been caused by a balance on various volumes (typically to
balance a single block group). I was able to trigger it somewhat
reliably by attempting a balance on a volume with a size of 596.18GiB
and 1.68GiB of estimated free space, but that stopped working
eventually.
-- 
Cebtenzzre <cebtenz...@gmail.com>

Reply via email to