CVE-2024-43855: md: fix deadlock between mddev_suspend and flush bio
In the Linux kernel, the following vulnerability has been resolved:
md: fix deadlock between mddevsuspend and flush bio
Deadlock occurs when mddev is being suspended while some flush bio is in progress. It is a complex issue.
T1. the first flush is at the ending stage, it clears 'mddev->flushbio' and tries to submit data, but is blocked because mddev is suspended by T4. T2. the second flush sets 'mddev->flushbio', and attempts to queue mdsubmitflushdata(), which is already running (T1) and won't execute again if on the same CPU as T1. T3. the third flush inc activeio and tries to flush, but is blocked because 'mddev->flushbio' is not NULL (set by T2). T4. mddevsuspend() is called and waits for activeio dec to 0 which is inc by T3.
T1 T2 T3 T4 (flush 1) (flush 2) (third 3) (suspend) mdsubmitflushdata mddev->flushbio = NULL; . . mdflushrequest . mddev->flushbio = bio . queue submitflushes . . . . mdhandlerequest . . activeio + 1 . . mdflushrequest . . wait !mddev->flushbio . . . . mddevsuspend . . wait !activeio . . . submitflushes . queuework mdsubmitflushdata . //mdsubmitflushdata is already running (T1) . mdhandlerequest wait resume
The root issue is non-atomic inc/dec of activeio during flush process. activeio is dec before mdsubmitflushdata is queued, and inc soon after mdsubmitflushdata() run. mdflushrequest activeio + 1 submitflushes activeio - 1 mdsubmitflushdata mdhandlerequest activeio + 1 makerequest activeio - 1
If activeio is dec after mdhandlerequest() instead of within submitflushes(), makerequest() can be called directly intead of mdhandlerequest() in mdsubmitflushdata(), and activeio will only inc and dec once in the whole flush process. Deadlock will be fixed.
Additionally, the only difference between fixing the issue and before is that there is no return error handling of makerequest(). But after previous patch cleaned mdwritestart(), makerequst() only return error in raid5makerequest() by dm-raid, see commit 41425f96d7aa ("dm-raid456, md/raid456: fix a deadlock for dm-raid456 while io concurrent with reshape)". Since dm always splits data and flush operation into two separate io, io size of flush submitted by dm always is 0, makerequest() will not be called in mdsubmitflushdata(). To prevent future modifications from introducing issues, add WARNON to ensure makerequest() no error is returned in this context.
Affected Software
Remediation
Event History
Frequently Asked Questions
What is the severity of CVE-2024-43855?
The severity of CVE-2024-43855 is classified as medium, given the potential for deadlocks in the Linux kernel.
How do I fix CVE-2024-43855?
To fix CVE-2024-43855, upgrade to the patched versions of the affected Linux kernel packages, such as 5.10.223-1 or 6.12.11-1.
Which versions of the Linux kernel are affected by CVE-2024-43855?
CVE-2024-43855 affects various versions of the Linux kernel, specifically those below 6.1.103 and those between 6.2 and 6.6.44.
What vulnerability does CVE-2024-43855 address in the Linux kernel?
CVE-2024-43855 addresses a deadlock issue that occurs during the suspension of mddev while a flush bio is in progress.
Is CVE-2024-43855 present in Debian systems?
Yes, CVE-2024-43855 is present in certain Debian systems using affected Linux kernel packages.