CVE-2024-39486

Source
https://cve.org/CVERecord?id=CVE-2024-39486
Import Source
https://storage.googleapis.com/osv-test-cve-osv-conversion/osv-output/CVE-2024-39486.json
JSON Data
https://api.test.osv.dev/v1/vulns/CVE-2024-39486
Downstream
Related
Published
2024-07-06T09:25:21.514Z
Modified
2026-03-20T12:37:16.468165Z
Summary
drm/drm_file: Fix pid refcounting race
Details

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

drm/drm_file: Fix pid refcounting race

maarten.lankhorst@linux.intel.com, Maxime Ripard mripard@kernel.org, Thomas Zimmermann tzimmermann@suse.de

filp->pid is supposed to be a refcounted pointer; however, before this patch, drmfileupdatepid() only increments the refcount of a struct pid after storing a pointer to it in filp->pid and dropping the dev->filelistmutex, making the following race possible:

process A process B ========= ========= begin drmfileupdatepid mutexlock(&dev->filelistmutex) rcureplacepointer(filp->pid, <pid B>, 1) mutexunlock(&dev->filelistmutex) begin drmfileupdatepid mutexlock(&dev->filelistmutex) rcureplacepointer(filp->pid, <pid A>, 1) mutexunlock(&dev->filelistmutex) getpid(<pid A>) synchronizercu() putpid(<pid B>) *** pid B reaches refcount 0 and is freed here *** getpid(<pid B>) *** UAF *** synchronizercu() putpid(<pid A>)

As far as I know, this race can only occur with CONFIGPREEMPTRCU=y because it requires RCU to detect a quiescent state in code that is not explicitly calling into the scheduler.

This race leads to use-after-free of a "struct pid". It is probably somewhat hard to hit because process A has to pass through a synchronizercu() operation while process B is between mutexunlock() and get_pid().

Fix it by ensuring that by the time a pointer to the current task's pid is stored in the file, an extra reference to the pid has been taken.

This fix also removes the condition for synchronize_rcu(); I think that optimization is unnecessary complexity, since in that case we would usually have bailed out on the lockless check above.

Database specific
{
    "osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2024/39xxx/CVE-2024-39486.json",
    "cna_assigner": "Linux"
}
References

Affected packages

Git / git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git

Affected ranges

Type
GIT
Repo
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
Events
Introduced
031ddd28008971cce0b5626379b910d0a05fb4dd
Fixed
16682588ead4a593cf1aebb33b36df4d1e9e4ffa
Type
GIT
Repo
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
Events
Introduced
1c7a387ffef894b1ab3942f0482dac7a6e0a909c
Fixed
0acce2a5c619ef1abdee783d7fea5eac78ce4844
Fixed
4f2a129b33a2054e62273edd5a051c34c08d96e9

Database specific

source
"https://storage.googleapis.com/osv-test-cve-osv-conversion/osv-output/CVE-2024-39486.json"