Linux: nitro_enclaves: fix use-after-free on SLOT_ALLOC failure
What fixes it
- 8bde6f643ab6fe5e3e3f4c312f84ce327ecf39b2LinuxCVE List
- 466041d14f26dc2babd606a2e85dce08774112a6LinuxCVE List
- 43f78b328f3907ca2f7424e15b7e45ffbf9fe21cLinuxCVE List
- 9bc184a2eda8b773c88ecbff934001ad649b9cc1LinuxCVE 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:
nitro_enclaves: fix use-after-free on SLOT_ALLOC failure
When ne_create_vm_ioctl() fails the SLOT_ALLOC request after anon_inode_getfile() has succeeded, the error path calls fput(enclave_file) and then frees ne_enclave.
In normal userspace context, fput() defers the final __fput() via task_work. ne_enclave_release() therefore runs after ne_enclave has already been freed and dereferences ne_enclave->slot_uid, causing a use-after-free: KASAN: slab-use-after-free in ne_enclave_release.
The enclave has no slot allocated and is not yet linked into the enclaves list on this error path, so ne_enclave_release() is expected to return early when slot_uid is zero. However, reading slot_uid already accesses the freed object.
Clear enclave_file->private_data before fput() on the error path. ne_enclave_release() then returns immediately when private_data is NULL, leaving the ioctl error path as the sole owner of ne_enclave. This is safe because the file has not been fd_install()'d yet.
Tested on an AWS EC2 m5.2xlarge with CONFIG_KASAN=y. Without the patch, the reproducer triggers a KASAN slab-use-after-free on every SLOT_ALLOC failure. With the patch, no KASAN report is produced and the SLOT_ALLOC error is still returned. Normal enclave creation and teardown are unaffected.
Text from CVE List
Affected versions 12
- Linuxaffected: 9c8eb50fe9e2bb8a2e725979e052fbf592b6b799 before 8bde6f643ab6fe5e3e3f4c312f84ce327ecf39b2CVE List
- Linuxaffected: 9c8eb50fe9e2bb8a2e725979e052fbf592b6b799 before 466041d14f26dc2babd606a2e85dce08774112a6CVE List
- Linuxaffected: 9c8eb50fe9e2bb8a2e725979e052fbf592b6b799 before f7fb6c2835ede1b8ad84cf7e78a528a9d0159b84CVE List
- Linuxaffected: 9c8eb50fe9e2bb8a2e725979e052fbf592b6b799 before 43f78b328f3907ca2f7424e15b7e45ffbf9fe21cCVE List
- Linuxaffected: 9c8eb50fe9e2bb8a2e725979e052fbf592b6b799 before 9bc184a2eda8b773c88ecbff934001ad649b9cc1CVE List
- Linuxaffected: 5.10CVE List
- Linuxunaffected: all versions before 5.10CVE List
- Linuxunaffected: 6.6.160 through 6.6.*CVE List
- Linuxunaffected: 6.12.113 through 6.12.*CVE List
- Linuxunaffected: 6.18.56 through 6.18.*CVE List
- Linuxunaffected: 7.2.10 through 7.2.*CVE List
- Linuxunaffected: 7.3CVE List
References 5
- git.kernel.org/stable/c/8bde6f643ab6fe5e3e3f4c312f84ce327ecf39b2Referencevia CVE List
- git.kernel.org/stable/c/466041d14f26dc2babd606a2e85dce08774112a6Referencevia CVE List
- git.kernel.org/stable/c/f7fb6c2835ede1b8ad84cf7e78a528a9d0159b84Referencevia CVE List
- git.kernel.org/stable/c/43f78b328f3907ca2f7424e15b7e45ffbf9fe21cReferencevia CVE List
- git.kernel.org/stable/c/9bc184a2eda8b773c88ecbff934001ad649b9cc1Referencevia CVE List