Linux: Double Free
CVE-2022-49826 is a high-severity double free vulnerability in Linux, with a CVSS 3.1 base score of 7.8 out of 10. It can be exploited with local access to the system by an attacker with a low-privileged account, without any action from a user. The record lists versions 30e12e2be27ac6c4be2af4163c70db381364706f, bec9ded5404cb14e5f5470103d0973a2ff83d6a5, ac471468f7c16cda2525909946ca13ddbcd14000 as the first without the flaw, so updating Linux to one of those releases or later removes the exposure. There is no confirmed exploitation so far. EPSS estimates a 0.23% chance of exploitation within 30 days, which is low compared with other CVEs.
High severity with no evidence of exploitation so far.
What to do
- Update Linux to 30e12e2be27ac6c4be2af4163c70db381364706f or bec9ded5404cb14e5f5470103d0973a2ff83d6a5 or ac471468f7c16cda2525909946ca13ddbcd14000 or 377ff82c33c0cb74562a353361b64b33c09562cf, whichever matches your release line, or a later version.
- Update Linux Kernel to 4.19.267 or 5.4.225 or 5.10.156 or 5.15.80, whichever matches your release line, or a later version.
Affected products and versions
| Vendor | Product | Affected versions | Fixed in |
|---|---|---|---|
| Linux | Linux | 2623c7a5f2799569d8bb05eb211da524a8144cb3 up to, but not including, 30e12e2be27ac6c4be2af4163c70db381364706f; 2623c7a5f2799569d8bb05eb211da524a8144cb3 up to, but not including, bec9ded5404cb14e5f5470103d0973a2ff83d6a5; 2623c7a5f2799569d8bb05eb211da524a8144cb3 up to, but not including, ac471468f7c16cda2525909946ca13ddbcd14000; 2623c7a5f2799569d8bb05eb211da524a8144cb3 up to, but not including, 377ff82c33c0cb74562a353361b64b33c09562cf; 2623c7a5f2799569d8bb05eb211da524a8144cb3 up to, but not including, 865a6da40ba092c18292ae5f6194756131293745; 2623c7a5f2799569d8bb05eb211da524a8144cb3 up to, but not including, 8c76310740807ade5ecdab5888f70ecb6d35732e; 4.17 | 30e12e2be27ac6c4be2af4163c70db381364706f, bec9ded5404cb14e5f5470103d0973a2ff83d6a5, ac471468f7c16cda2525909946ca13ddbcd14000, 377ff82c33c0cb74562a353361b64b33c09562cf, 865a6da40ba092c18292ae5f6194756131293745, 8c76310740807ade5ecdab5888f70ecb6d35732e |
| Linux | Linux Kernel | 4.17 up to, but not including, 4.19.267; 4.20 up to, but not including, 5.4.225; 5.5 up to, but not including, 5.10.156; 5.11 up to, but not including, 5.15.80; 5.16 up to, but not including, 6.0.10; 6.1 | 4.19.267, 5.4.225, 5.10.156, 5.15.80, 6.0.10 |
Version data comes from the organisation that assigned the CVE. Confirm against the vendor advisory before deciding you are unaffected.
How the severity score breaks down
- Attack vector
- LocalThe attacker needs local access or must trick a user into running something.
- Attack complexity
- LowNo special conditions are needed; the attack works reliably.
- Privileges required
- LowA basic user account is enough.
- User interaction
- NoneNo action by a victim is required.
- Scope
- UnchangedImpact stays within the vulnerable component.
- Confidentiality
- HighAll data handled by the component can be read.
- Integrity
- HighData or code can be modified at will.
- Availability
- HighThe component can be taken down completely.
Vector: CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H. Scored by NVD.
| Scoring system | Score | Severity | Scored by |
|---|---|---|---|
| CVSS 3.1 | 7.8 | High | CNA |
| CVSS 3.1 | 7.8 | High | NVD |
Official description
In the Linux kernel, the following vulnerability has been resolved: ata: libata-transport: fix double ata_host_put() in ata_tport_add() In the error path in ata_tport_add(), when calling put_device(), ata_tport_release() is called, it will put the refcount of 'ap->host'. And then ata_host_put() is called again, the refcount is decreased to 0, ata_host_release() is called, all ports are freed and set to null. When unbinding the device after failure, ata_host_stop() is called to release the resources, it leads a null-ptr-deref(), because all the ports all freed and null. Unable to handle kernel NULL pointer dereference at virtual address 0000000000000008 CPU: 7 PID: 18671 Comm: modprobe Kdump: loaded Tainted: G E 6.1.0-rc3+ #8 pstate: 80400009 (Nzcv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--) pc : ata_host_stop+0x3c/0x84 [libata] lr : release_nodes+0x64/0xd0 Call trace: ata_host_stop+0x3c/0x84 [libata] release_nodes+0x64/0xd0 devres_release_all+0xbc/0x1b0 device_unbind_cleanup+0x20/0x70 really_probe+0x158/0x320 __driver_probe_device+0x84/0x120 driver_probe_device+0x44/0x120 __driver_attach+0xb4/0x220 bus_for_each_dev+0x78/0xdc driver_attach+0x2c/0x40 bus_add_driver+0x184/0x240 driver_register+0x80/0x13c __pci_register_driver+0x4c/0x60 ahci_pci_driver_init+0x30/0x1000 [ahci] Fix this by removing redundant ata_host_put() in the error path.
Source: the CVE record as published by its numbering authority, via NVD and CVE.org.
The underlying weakness: Double Free
The product calls free() twice on the same memory address.
How developers prevent this class of flaw
- Choose a language that provides automatic memory management.
- Ensure that each allocation is freed only once. After freeing a chunk, set the pointer to NULL to ensure the pointer cannot be freed again. In complicated error conditions, be sure that clean-up routines respect the state of allocation properly. If the language is object oriented, ensure that object destructors delete each chunk of memory only once.
- Use a static analysis tool to find double free instances.
Timeline
- CVE record published.
- Record last changed materially (score, affected products, status or references).
References
Patches and release notes
- git.kernel.org/stable/c/30e12e2be27ac6c4be2af4163c70db381364706f
- git.kernel.org/stable/c/377ff82c33c0cb74562a353361b64b33c09562cf
- git.kernel.org/stable/c/865a6da40ba092c18292ae5f6194756131293745
- git.kernel.org/stable/c/8c76310740807ade5ecdab5888f70ecb6d35732e
- git.kernel.org/stable/c/ac471468f7c16cda2525909946ca13ddbcd14000
- git.kernel.org/stable/c/bec9ded5404cb14e5f5470103d0973a2ff83d6a5
Recent Double Free vulnerabilities
- 7.8 High severity
- 7.8 High severity
- 7.8 High severity
- 7.8 High severity
- 7.8 High severity
- 7.8 High severity
Spotted an error? Tell us.