製品・ソフトウェアに関する情報
LinuxのLinux Kernelにおけるリソースのロックに関する脆弱性
Title LinuxのLinux Kernelにおけるリソースのロックに関する脆弱性
Summary

Linuxカーネルにおいて、以下の脆弱性が修正されました:rust_binderにおいてprocロックを保持せずにset_notification_done()が呼び出されていなかった問題です。デスリスナーでのイベントの流れは次の通りです。1. リモートプロセスが終了し、BR_DEAD_BINDERメッセージを送信します。2. ローカルプロセスがBC_CLEAR_DEATH_NOTIFICATIONコマンドを呼び出します。3. ローカルプロセスがBC_DEAD_BINDER_DONEを呼び出します。この後、カーネルはpush_work_if_looper()を使ってBC_DEAD_BINDER_DONEコマンドにBR_CLEAR_DEATH_NOTIFICATION_DONEの返信を行います。しかし、現在のスレッドがlooperでない場合、デッドロックが発生する可能性があります。なぜなら、dead_binder_done()はset_notification_done()の間にprocロックを保持しており、そのset_notification_done()でpush_work_if_looper()が呼ばれるためです。通常、push_work_if_looper()はスレッドロックを取得し、procロック下で取得するのは問題ありません。しかし、現在のスレッドがlooperでない場合は、返信をプロセスのワークキューに配送するためにprocロックを再度取得しようとするため、procロックが既に保持されていることでデッドロックが発生します。この問題はset_notification_done()の実行時にprocロックを解放することで修正されました。もともとこの関数内でprocロックを保持する意図はありませんでした。AndroidではBC_DEAD_BINDER_DONEはBR_DEAD_BINDERメッセージに対する応答としてのみ呼び出され、カーネルは常にBR_DEAD_BINDERをlooperに配送するため、この状況は発生しないと考えられています。つまり、Androidユーザースペースが非looperスレッドでBC_DEAD_BINDER_DONEを呼び出すシナリオは存在しません。

Possible impacts 当該ソフトウェアが扱う情報について、外部への漏えいは発生しません。 また、当該ソフトウェアが扱う情報について、書き換えは発生しません。 さらに、当該ソフトウェアが完全に停止する可能性があります。 そして、この脆弱性を悪用した攻撃の影響は、他のソフトウェアには及びません。 
Solution

リリース情報、またはパッチ情報が公開されています。参考情報を参照して適切な対策を実施してください。

Publication Date March 29, 2026, midnight
Registration Date April 27, 2026, 10:53 a.m.
Last Update April 27, 2026, 10:53 a.m.
CVSS3.0 : 警告
Score 5.5
Vector CVSS:3.0/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H
Affected System
Linux
Linux Kernel 6.18
Linux Kernel 6.18.1 以上 6.18.19 未満
Linux Kernel 6.19 以上 6.19.9 未満
Linux Kernel 7.0
CVE (情報セキュリティ 共通脆弱性識別子)
CWE (共通脆弱性タイプ一覧)
その他
Change Log
No Changed Details Date of change
1 [2026年04月27日]
  掲載
April 27, 2026, 10:53 a.m.

NVD Vulnerability Information
CVE-2026-23400
Summary

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

rust_binder: call set_notification_done() without proc lock

Consider the following sequence of events on a death listener:
1. The remote process dies and sends a BR_DEAD_BINDER message.
2. The local process invokes the BC_CLEAR_DEATH_NOTIFICATION command.
3. The local process then invokes the BC_DEAD_BINDER_DONE.
Then, the kernel will reply to the BC_DEAD_BINDER_DONE command with a
BR_CLEAR_DEATH_NOTIFICATION_DONE reply using push_work_if_looper().

However, this can result in a deadlock if the current thread is not a
looper. This is because dead_binder_done() still holds the proc lock
during set_notification_done(), which called push_work_if_looper().
Normally, push_work_if_looper() takes the thread lock, which is fine to
take under the proc lock. But if the current thread is not a looper,
then it falls back to delivering the reply to the process work queue,
which involves taking the proc lock. Since the proc lock is already
held, this is a deadlock.

Fix this by releasing the proc lock during set_notification_done(). It
was not intentional that it was held during that function to begin with.

I don't think this ever happens in Android because BC_DEAD_BINDER_DONE
is only invoked in response to BR_DEAD_BINDER messages, and the kernel
always delivers BR_DEAD_BINDER to a looper. So there's no scenario where
Android userspace will call BC_DEAD_BINDER_DONE on a non-looper thread.

Summary

En el kernel de Linux, la siguiente vulnerabilidad ha sido resuelta:

rust_binder: llamar a set_notification_done() sin el bloqueo de proc

Considere la siguiente secuencia de eventos en un oyente de muerte:
1. El proceso remoto muere y envía un mensaje BR_DEAD_BINDER.
2. El proceso local invoca el comando BC_CLEAR_DEATH_NOTIFICATION.
3. El proceso local luego invoca el BC_DEAD_BINDER_DONE.
Entonces, el kernel responderá al comando BC_DEAD_BINDER_DONE con una
respuesta BR_CLEAR_DEATH_NOTIFICATION_DONE usando push_work_if_looper().

Sin embargo, esto puede resultar en un interbloqueo si el hilo actual no es un
looper. Esto se debe a que dead_binder_done() aún mantiene el bloqueo de proc
durante set_notification_done(), que llamó a push_work_if_looper().
Normalmente, push_work_if_looper() toma el bloqueo de hilo, lo cual está bien tomar
bajo el bloqueo de proc. Pero si el hilo actual no es un looper,
entonces recurre a entregar la respuesta a la cola de trabajo del proceso,
lo que implica tomar el bloqueo de proc. Dado que el bloqueo de proc ya está
retenido, esto es un interbloqueo.

Solucione esto liberando el bloqueo de proc durante set_notification_done(). No
fue intencional que se mantuviera durante esa función para empezar.

No creo que esto ocurra nunca en Android porque BC_DEAD_BINDER_DONE
solo se invoca en respuesta a mensajes BR_DEAD_BINDER, y el kernel
siempre entrega BR_DEAD_BINDER a un looper. Así que no hay ningún escenario donde
el espacio de usuario de Android llame a BC_DEAD_BINDER_DONE en un hilo que no sea un looper.

Publication Date March 29, 2026, 10:16 p.m.
Registration Date April 27, 2026, 12:21 p.m.
Last Update April 25, 2026, 12:17 a.m.
Affected software configurations
Configuration1 or higher or less more than less than
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.18.1 6.18.19
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.19 6.19.9
cpe:2.3:o:linux:linux_kernel:6.18:-:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc1:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc2:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc3:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc4:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc5:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc6:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc7:*:*:*:*:*:*
Related information, measures and tools
Common Vulnerabilities List