Subject: CVE-2022-48931: configfs: fix a race in configfs_{,un}register_subsystem()

From: Greg Kroah-Hartman <[email-masked]>

Description
===========

In the Linux kernel, the following vulnerability has been resolved:

configfs: fix a race in configfs_{,un}register_subsystem()

When configfs_register_subsystem() or configfs_unregister_subsystem()
is executing link_group() or unlink_group(),
it is possible that two processes add or delete list concurrently.
Some unfortunate interleavings of them can cause kernel panic.

One of cases is:
A --> B --> C --> D
A <-- B <-- C <-- D

     delete list_head *B        |      delete list_head *C
--------------------------------|-----------------------------------
configfs_unregister_subsystem   |   configfs_unregister_subsystem
  unlink_group                  |     unlink_group
    unlink_obj                  |       unlink_obj
      list_del_init             |         list_del_init
        __list_del_entry        |           __list_del_entry
          __list_del            |             __list_del
            // next == C        |
            next->prev = prev   |
                                |               next->prev = prev
            prev->next = next   |
                                |                 // prev == B
                                |                 prev->next = next

Fix this by adding mutex when calling link_group() or unlink_group(),
but parent configfs_subsystem is NULL when config_item is root.
So I create a mutex configfs_subsystem_mutex.

The Linux kernel CVE team has assigned CVE-2022-48931 to this issue.

Affected and fixed versions
===========================

	Issue introduced in 2.6.16 with commit 7063fbf22611 and fixed in 4.9.304 with commit 40805099af11
	Issue introduced in 2.6.16 with commit 7063fbf22611 and fixed in 4.14.269 with commit d1654de19d42
	Issue introduced in 2.6.16 with commit 7063fbf22611 and fixed in 4.19.232 with commit a37024f7757c
	Issue introduced in 2.6.16 with commit 7063fbf22611 and fixed in 5.4.182 with commit b7e2b91fcb5c
	Issue introduced in 2.6.16 with commit 7063fbf22611 and fixed in 5.10.103 with commit a7ab53d3c27d
	Issue introduced in 2.6.16 with commit 7063fbf22611 and fixed in 5.15.26 with commit e7a66dd26877
	Issue introduced in 2.6.16 with commit 7063fbf22611 and fixed in 5.16.12 with commit 3aadfd46858b
	Issue introduced in 2.6.16 with commit 7063fbf22611 and fixed in 5.17 with commit 84ec758fb2da

Please see https://www.kernel.org for a full list of currently supported
kernel versions by the kernel community.

Unaffected versions might change over time as fixes are backported to
older supported kernel versions.  The official CVE entry at
	https://cve.org/CVERecord/?id=CVE-2022-48931
will be updated if fixes are backported, please check that for the most
up to date information about this issue.

Affected files
==============

The file(s) affected by this issue are:
	fs/configfs/dir.c

Mitigation
==========

The Linux kernel CVE team recommends that you update to the latest
stable kernel version for this, and many other bugfixes.  Individual
changes are never tested alone, but rather are part of a larger kernel
release.  Cherry-picking individual commits is not recommended or
supported by the Linux kernel community at all.  If however, updating to
the latest release is impossible, the individual changes to resolve this
issue can be found at these commits:
	https://git.kernel.org/stable/c/40805099af11f68c5ca7dbcfacf455da8f99f622
	https://git.kernel.org/stable/c/d1654de19d42f513b6cfe955cc77e7f427e05a77
	https://git.kernel.org/stable/c/a37024f7757c25550accdebf49e497ad6ae239fe
	https://git.kernel.org/stable/c/b7e2b91fcb5c78c414e33dc8d50642e307ca0c5a
	https://git.kernel.org/stable/c/a7ab53d3c27dfe83bb594456b9f38a37796ec39b
	https://git.kernel.org/stable/c/e7a66dd2687758718eddd79b542a95cf3aa488cc
	https://git.kernel.org/stable/c/3aadfd46858b1f64d4d6a0654b863e21aabff975
	https://git.kernel.org/stable/c/84ec758fb2daa236026506868c8796b0500c047d