ACK/Cmt: [SRU][F][PATCH 0/1] CVE-2022-48733
Koichiro Den
koichiro.den at canonical.com
Fri Oct 4 07:41:25 UTC 2024
On Mon, Sep 30, 2024 at 02:45:23PM +0800, Guoqing Jiang wrote:
>
>
> On 9/30/24 11:06, Koichiro Den wrote:
> > [Impact]
> >
> > btrfs: fix use-after-free after failure to create a snapshot
> >
> > At ioctl.c:create_snapshot(), we allocate a pending snapshot structure and
> > then attach it to the transaction's list of pending snapshots. After that
> > we call btrfs_commit_transaction(), and if that returns an error we jump
> > to 'fail' label, where we kfree() the pending snapshot structure. This can
> > result in a later use-after-free of the pending snapshot:
> >
> > 1) We allocated the pending snapshot and added it to the transaction's
> > list of pending snapshots;
> >
> > 2) We call btrfs_commit_transaction(), and it fails either at the first
> > call to btrfs_run_delayed_refs() or btrfs_start_dirty_block_groups().
> > In both cases, we don't abort the transaction and we release our
> > transaction handle. We jump to the 'fail' label and free the pending
> > snapshot structure. We return with the pending snapshot still in the
> > transaction's list;
> >
> > 3) Another task commits the transaction. This time there's no error at
> > all, and then during the transaction commit it accesses a pointer
> > to the pending snapshot structure that the snapshot creation task
> > has already freed, resulting in a user-after-free.
> >
> > This issue could actually be detected by smatch, which produced the
> > following warning:
> >
> > fs/btrfs/ioctl.c:843 create_snapshot() warn: '&pending_snapshot->list' not removed from list
> >
> > So fix this by not having the snapshot creation ioctl directly add the
> > pending snapshot to the transaction's list. Instead add the pending
> > snapshot to the transaction handle, and then at btrfs_commit_transaction()
> > we add the snapshot to the list only when we can guarantee that any error
> > returned after that point will result in a transaction abort, in which
> > case the ioctl code can safely free the pending snapshot and no one can
> > access it anymore.
> >
> > [Backport]
> >
> > Adjusted context due to missing commits:
> > - 9babda9f33fd ("btrfs: Remove async_transid from btrfs_mksubvol/create_subvol/create_snapshot")
> > - d0c2f4fa555e ("btrfs: make concurrent fsyncs wait less when waiting for a transaction commit")
> >
> > [Fix]
> >
> > Noble: not affected
> > Jammy: fixed via stable
> > Focal: Backport - adjusted context, see [Backport]
> > Bionic: fix sent to esm ML
> > Xenial: fix sent to esm ML
> > Trusty: won't fix
>
> Just curious, does the CVE applicable to kernel version less than 5.10?
> Because the fix has the tag (CC: stable at vger.kernel.org # 5.10+).
Sorry I missed this. Yeah I think so. In my opinion e4a2bcaca964
("Btrfs: if we aren't committing just end the transaction if we error
out") is suspicious. And also Smatch complained for both Bionic and
Xenial, other than Focal.
>
> Anyway, Acked-by: Guoqing Jiang <guoqing.jiang at canonical.com>
>
> Guoqing
> > [Test Case]
> >
> > Compile and boot tested (amd64 only).
> >
> > Ran Smatch and verified that with this backport, the following warn
> > message disappeared: fs/btrfs/ioctl.c:908 create_snapshot() warn:
> > '&pending_snapshot->list' not removed from list
> >
> > Also, did snapshot testing and verified that
> > btrfs_commit_transaction() triggered by it succeeded without any
> > issues (amd64 only).
> >
> > [Where problems could occur]
> >
> > This fix affects those who use btrfs snapshot feature, an issue with
> > this fix would be visible to the user via unpredicted system
> > behaviour or a system crash induced by use-after-free.
> >
> >
> > Filipe Manana (1): btrfs: fix use-after-free after failure to create
> > a snapshot
> >
> > fs/btrfs/ioctl.c | 5 +---- fs/btrfs/transaction.c | 24
> > ++++++++++++++++++++++++ fs/btrfs/transaction.h | 2 ++ 3 files
> > changed, 27 insertions(+), 4 deletions(-)
> >
>
More information about the kernel-team
mailing list