Linux: tracing: Take trace_array reference when opening a tracer options file
What fixes it
- 61894ea0d2a1ae8ce903abf73bd56958c035f182LinuxCVE List
- 5.5LinuxCVE List
- 5.11LinuxCVE List
- 5.16LinuxCVE List
- 6.2LinuxCVE List
- 6.6LinuxCVE List
A fixed version on one release line is not the upgrade target for every line. Check your exact version and any vendor backports.
Description
In the Linux kernel, the following vulnerability has been resolved:
tracing: Take trace_array reference when opening a tracer options file
When a tracer option file is opened, it is passed a descriptor that points to an element on the trace_array's topts array. This element has information to find the trace array and other information. It uses this element to take a reference of the trace_array so that the trace_array does not get removed while this file is opened.
Unfortunately, there's a race condition where the element itself could be freed by the removal of the instance the trace_array represents causing a use-after-free as this element that is used to find the trace_array to increment its reference counter is also freed when the instance is removed.
To solve this, add a trace_array_tracer_options_get() helper function that will take the address of the element that is passed to the open function by the inode->i_private pointer and search all the trace_arrays under a lock to find the one that the element's address is in the range of the trace_arrays topts array elements. When a match happens, that trace_array's reference would be increased.
Note, there's a race where if an admin was deleting and creating trace instances at the same time and the memory of the old trace_array's array matched the memory of the new trace_array that it could in theory open the option from the wrong trace array. But we do not care because it would be stupid to perform that kind of action. As long as the only thing that can happen is that the option from the wrong trace array is used and doesn't crash the kernel it will only make the user confused. But if they are doing something stupid like this, they are already confused, so no harm done.
Text from CVE List
Affected versions 22
- Linuxaffected: 7e2cfbd2d3c86afcd5c26b5c4b1dd251f63c5838 before 61894ea0d2a1ae8ce903abf73bd56958c035f182CVE List
- Linuxaffected: 7e2cfbd2d3c86afcd5c26b5c4b1dd251f63c5838 before b2890064a12efbeb3b3c093e69e9010dd244c881CVE List
- Linuxaffected: 7e2cfbd2d3c86afcd5c26b5c4b1dd251f63c5838 before d9232a90c6f7de822177d35d73d9234cba523ef9CVE List
- Linuxaffected: 7e2cfbd2d3c86afcd5c26b5c4b1dd251f63c5838 before b2fb87d29ffb3a7a9ccc5acf12898ecb80587427CVE List
- Linuxaffected: 7e2cfbd2d3c86afcd5c26b5c4b1dd251f63c5838 before ed0aff60f83a9bdc2f6556376ac79c96b3ce7e80CVE List
- Linuxaffected: 952e477f908048145a5eb2ed3d431d9efc1e1073CVE List
- Linuxaffected: b3183f5f05cd867f5c17122773ca5aa8d07b51afCVE List
- Linuxaffected: bf38c1d29f8bfe9631b62a67f8dd1b8f7efb7139CVE List
- Linuxaffected: 2617afde0c3db285778734b0ccad9a55b4f9cda2CVE List
- Linuxaffected: 586787a0331aa2d7d244e9c4400d2a73295b0cf0CVE List
- Linuxaffected: 5.4.257 before 5.5CVE List
- Linuxaffected: 5.10.197 before 5.11CVE List
- Linuxaffected: 5.15.133 before 5.16CVE List
- Linuxaffected: 6.1.55 before 6.2CVE List
- Linuxaffected: 6.5.5 before 6.6CVE List
- Linuxaffected: 6.6CVE List
- Linuxunaffected: all versions before 6.6CVE List
- Linuxunaffected: 6.6.160 through 6.6.*CVE List
- Linuxunaffected: 6.12.112 through 6.12.*CVE List
- Linuxunaffected: 6.18.57 through 6.18.*CVE List
- Linuxunaffected: 7.2.7 through 7.2.*CVE List
- Linuxunaffected: 7.3CVE List
References 5
- git.kernel.org/stable/c/61894ea0d2a1ae8ce903abf73bd56958c035f182Referencevia CVE List
- git.kernel.org/stable/c/b2890064a12efbeb3b3c093e69e9010dd244c881Referencevia CVE List
- git.kernel.org/stable/c/d9232a90c6f7de822177d35d73d9234cba523ef9Referencevia CVE List
- git.kernel.org/stable/c/b2fb87d29ffb3a7a9ccc5acf12898ecb80587427Referencevia CVE List
- git.kernel.org/stable/c/ed0aff60f83a9bdc2f6556376ac79c96b3ce7e80Referencevia CVE List