Skip to content
  1. Mar 02, 2022
    • Su Yue's avatar
      btrfs: tree-checker: check item_size for dev_item · b80fbc20
      Su Yue authored
      commit ea1d1ca4
      
       upstream.
      
      Check item size before accessing the device item to avoid out of bound
      access, similar to inode_item check.
      
      Signed-off-by: default avatarSu Yue <l@damenly.su>
      Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
      Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      b80fbc20
    • Su Yue's avatar
      btrfs: tree-checker: check item_size for inode_item · 7e80846a
      Su Yue authored
      commit 0c982944 upstream.
      
      while mounting the crafted image, out-of-bounds access happens:
      
        [350.429619] UBSAN: array-index-out-of-bounds in fs/btrfs/struct-funcs.c:161:1
        [350.429636] index 1048096 is out of range for type 'page *[16]'
        [350.429650] CPU: 0 PID: 9 Comm: kworker/u8:1 Not tainted 5.16.0-rc4 #1
        [350.429652] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.13.0-1ubuntu1.1 04/01/2014
        [350.429653] Workqueue: btrfs-endio-meta btrfs_work_helper [btrfs]
        [350.429772] Call Trace:
        [350.429774]  <TASK>
        [350.429776]  dump_stack_lvl+0x47/0x5c
        [350.429780]  ubsan_epilogue+0x5/0x50
        [350.429786]  __ubsan_handle_out_of_bounds+0x66/0x70
        [350.429791]  btrfs_get_16+0xfd/0x120 [btrfs]
        [350.429832]  check_leaf+0x754/0x1a40 [btrfs]
        [350.429874]  ? filemap_read+0x34a/0x390
        [350.429878]  ? load_balance+0x175/0xfc0
        [350.429881]  validate_extent_buffer+0x244/0x310 [btrfs]
        [350.429911]  btrfs_validate_metadata_buffer+0xf8/0x100 [btrfs]
        [350.429935]  end_bio_extent_readpage+0x3af/0x850 [btrfs]
        [350.429969]  ? newidle_balance+0x259/0x480
        [350.429972]  end_workqueue_fn+0x29/0x40 [btrfs]
        [350.429995]  btrfs_work_helper+0x71/0x330 [btrfs]
        [350.430030]  ? __schedule+0x2fb/0xa40
        [350.430033]  process_one_work+0x1f6/0x400
        [350.430035]  ? process_one_work+0x400/0x400
        [350.430036]  worker_thread+0x2d/0x3d0
        [350.430037]  ? process_one_work+0x400/0x400
        [350.430038]  kthread+0x165/0x190
        [350.430041]  ? set_kthread_struct+0x40/0x40
        [350.430043]  ret_from_fork+0x1f/0x30
        [350.430047]  </TASK>
        [350.430077] BTRFS warning (device loop0): bad eb member start: ptr 0xffe20f4e start 20975616 member offset 4293005178 size 2
      
      check_leaf() is checking the leaf:
      
        corrupt leaf: root=4 block=29396992 slot=1, bad key order, prev (16140901064495857664 1 0) current (1 204 12582912)
        leaf 29396992 items 6 free space 3565 generation 6 owner DEV_TREE
        leaf 29396992 flags 0x1(WRITTEN) backref revision 1
        fs uuid a62e00e8-e94e-4200-8217-12444de93c2e
        chunk uuid cecbd0f7-9ca0-441e-ae9f-f782f9732bd8
      	  item 0 key (16140901064495857664 INODE_ITEM 0) itemoff 3955 itemsize 40
      		  generation 0 transid 0 size 0 nbytes 17592186044416
      		  block group 0 mode 52667 links 33 uid 0 gid 2104132511 rdev 94223634821136
      		  sequence 100305 flags 0x2409000(none)
      		  atime 0.0 (1970-01-01 08:00:00)
      		  ctime 2973280098083405823.4294967295 (-269783007-01-01 21:37:03)
      		  mtime 18446744071572723616.4026825121 (1902-04-16 12:40:00)
      		  otime 9249929404488876031.4294967295 (622322949-04-16 04:25:58)
      	  item 1 key (1 DEV_EXTENT 12582912) itemoff 3907 itemsize 48
      		  dev extent chunk_tree 3
      		  chunk_objectid 256 chunk_offset 12582912 length 8388608
      		  chunk_tree_uuid cecbd0f7-9ca0-441e-ae9f-f782f9732bd8
      
      The corrupted leaf of device tree has an inode item. The leaf passed
      checksum and others checks in validate_extent_buffer until check_leaf_item().
      Because of the key type BTRFS_INODE_ITEM, check_inode_item() is called even we
      are in the device tree. Since the
      item offset + sizeof(struct btrfs_inode_item) > eb->len, out-of-bounds access
      is triggered.
      
      The item end vs leaf boundary check has been done before
      check_leaf_item(), so fix it by checking item size in check_inode_item()
      before access of the inode item in extent buffer.
      
      Other check functions except check_dev_item() in check_leaf_item()
      have their item size checks.
      The commit for check_dev_item() is followed.
      
      No regression observed during running fstests.
      
      Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=215299
      
      
      CC: stable@vger.kernel.org # 5.10+
      CC: Wenqing Liu <wenqingliu0120@gmail.com>
      Signed-off-by: default avatarSu Yue <l@damenly.su>
      Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
      Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      7e80846a
    • Andy Lutomirski's avatar
      x86/ptrace: Fix xfpregs_set()'s incorrect xmm clearing · a6d9692c
      Andy Lutomirski authored
      commit 44cad52c upstream.
      
      xfpregs_set() handles 32-bit REGSET_XFP and 64-bit REGSET_FP. The actual
      code treats these regsets as modern FX state (i.e. the beginning part of
      XSTATE). The declarations of the regsets thought they were the legacy
      i387 format. The code thought they were the 32-bit (no xmm8..15) variant
      of XSTATE and, for good measure, made the high bits disappear by zeroing
      the wrong part of the buffer. The latter broke ptrace, and everything
      else confused anyone trying to understand the code. In particular, the
      nonsense definitions of the regsets confused me when I wrote this code.
      
      Clean this all up. Change the declarations to match reality (which
      shouldn't change the generated code, let alone the ABI) and fix
      xfpregs_set() to clear the correct bits and to only do so for 32-bit
      callers.
      
      Fixes: 6164331d
      
       ("x86/fpu: Rewrite xfpregs_set()")
      Reported-by: default avatarLuís Ferreira <contact@lsferreira.net>
      Signed-off-by: default avatarAndy Lutomirski <luto@kernel.org>
      Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
      Cc: <stable@vger.kernel.org>
      Link: https://bugzilla.kernel.org/show_bug.cgi?id=215524
      Link: https://lore.kernel.org/r/YgpFnZpF01WwR8wU@zn.tnic
      
      
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      a6d9692c
    • Michal Koutný's avatar
      cgroup-v1: Correct privileges check in release_agent writes · ebeb7b73
      Michal Koutný authored
      commit 467a726b upstream.
      
      The idea is to check: a) the owning user_ns of cgroup_ns, b)
      capabilities in init_user_ns.
      
      The commit 24f60085 ("cgroup-v1: Require capabilities to set
      release_agent") got this wrong in the write handler of release_agent
      since it checked user_ns of the opener (may be different from the owning
      user_ns of cgroup_ns).
      Secondly, to avoid possibly confused deputy, the capability of the
      opener must be checked.
      
      Fixes: 24f60085 ("cgroup-v1: Require capabilities to set release_agent")
      Cc: stable@vger.kernel.org
      Link: https://lore.kernel.org/stable/20220216121142.GB30035@blackbody.suse.cz/
      
      
      Signed-off-by: default avatarMichal Koutný <mkoutny@suse.com>
      Reviewed-by: default avatarMasami Ichikawa(CIP) <masami.ichikawa@cybertrust.co.jp>
      Signed-off-by: default avatarTejun Heo <tj@kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      ebeb7b73
    • Zhang Qiao's avatar
      cgroup/cpuset: Fix a race between cpuset_attach() and cpu hotplug · ffed0bf6
      Zhang Qiao authored
      commit 05c7b7a9 upstream.
      
      As previously discussed(https://lkml.org/lkml/2022/1/20/51),
      cpuset_attach() is affected with similar cpu hotplug race,
      as follow scenario:
      
           cpuset_attach()				cpu hotplug
          ---------------------------            ----------------------
          down_write(cpuset_rwsem)
          guarantee_online_cpus() // (load cpus_attach)
      					sched_cpu_deactivate
      					  set_cpu_active()
      					  // will change cpu_active_mask
          set_cpus_allowed_ptr(cpus_attach)
            __set_cpus_allowed_ptr_locked()
             // (if the intersection of cpus_attach and
               cpu_active_mask is empty, will return -EINVAL)
          up_write(cpuset_rwsem)
      
      To avoid races such as described above, protect cpuset_attach() call
      with cpu_hotplug_lock.
      
      Fixes: be367d09
      
       ("cgroups: let ss->can_attach and ss->attach do whole threadgroups at a time")
      Cc: stable@vger.kernel.org # v2.6.32+
      Reported-by: default avatarZhao Gongyi <zhaogongyi@huawei.com>
      Signed-off-by: default avatarZhang Qiao <zhangqiao22@huawei.com>
      Acked-by: default avatarWaiman Long <longman@redhat.com>
      Reviewed-by: default avatarMichal Koutný <mkoutny@suse.com>
      Signed-off-by: default avatarTejun Heo <tj@kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      ffed0bf6
    • Matthew Wilcox (Oracle)'s avatar
      mm/filemap: Fix handling of THPs in generic_file_buffered_read() · f89903ae
      Matthew Wilcox (Oracle) authored
      When a THP is present in the page cache, we can return it several times,
      leading to userspace seeing the same data repeatedly if doing a read()
      that crosses a 64-page boundary.  This is probably not a security issue
      (since the data all comes from the same file), but it can be interpreted
      as a transient data corruption issue.  Fortunately, it is very rare as
      it can only occur when CONFIG_READ_ONLY_THP_FOR_FS is enabled, and it can
      only happen to executables.  We don't often call read() on executables.
      
      This bug is fixed differently in v5.17 by commit 6b24ca4a
      ("mm: Use multi-index entries in the page cache").  That commit is
      unsuitable for backporting, so fix this in the clearest way.  It
      sacrifices a little performance for clarity, but this should never
      be a performance path in these kernel versions.
      
      Fixes: cbd59c48 ("mm/filemap: use head pages in generic_file_buffered_read")
      Cc: stable@vger.kernel.org # v5.15, v5.16
      Link: https://lore.kernel.org/r/df3b5d1c-a36b-2c73-3e27-99e74983de3a@suse.cz/
      
      
      Analyzed-by: default avatarAdam Majer <amajer@suse.com>
      Analyzed-by: default avatarDirk Mueller <dmueller@suse.com>
      Bisected-by: default avatarTakashi Iwai <tiwai@suse.de>
      Reported-by: default avatarVlastimil Babka <vbabka@suse.cz>
      Tested-by: default avatarVlastimil Babka <vbabka@suse.cz>
      Signed-off-by: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      f89903ae
  2. Feb 23, 2022