| Title | LinuxのLinux Kernelにおける競合状態に関する脆弱性 |
|---|---|
| Summary | Linuxカーネルにおいて、以下の脆弱性が修正されました。af_unixにおいて、MSG_PEEKが介入した場合にガベージコレクション(GC)をあきらめる問題です。Igor Ushakov氏は、MSG_PEEKとの競合により生存しているソケットの受信キューがGCによって消去される問題を報告しました。この問題は、以前のコミットcbcf01128d0a("af_unix: fix garbage collect vs MSG_PEEK")で修正されたのとまったく同じ問題でした。GCが現在のアルゴリズムに置き換えられた後、このコミットはunix_peek_fds()内のロック調整を除去し、同じ問題を再導入しました。問題の原因は、MSG_PEEKがGCと連動せずにファイル参照カウントを増加させてしまうことです。sk-Aとsk-Bを含む強連結成分(SCC)を考えます。sk-Aはclose()されているがsk-B経由でrecv()が可能です。悪影響は、sk-BからMSG_PEEK付きでsk-Aがrecv()され、GCがsk-Aとsk-Bのunix_vertex_dead()をチェックしている間にsk-Bがclose()された場合に発生します。GCスレッドはunix_vertex_dead(sk-A)をtrueと判断しますが、recv(sk-B, MSG_PEEK)によりsk-Aのファイル参照カウントが1から2に増えます。次にclose(sk-B)が呼ばれ、sk-Bのファイル参照カウントが2から1になります。最初はsk-Aのファイル参照カウントはsk-Bのrecvキューにあるファイルディスクリプタによって1でした。GCはファイル参照カウントがインフライトのファイルディスクリプタ数と同じためsk-Aは死んでいると考えます。しかしMSG_PEEKによりsk-Aのファイル参照カウントが密かに増加し、GCの評価が無効になります。この時点でsk-Bのファイル参照カウントはオープンファイルディスクリプタによる1とsk-A内のインフライトファイルディスクリプタによる1の計2です。その後のclose()で1つの参照が解放されます。結果としてGCはsk-Aとsk-Bの両方が死んでいると誤判断します。一つの対策はunix_peek_fds()でロック調整を復元することですが、新しいアルゴリズムを活用し、よりエレガントに解決可能です。問題は次にclose()が発生しなければ起きず、MSG_PEEKと死んだSCC検出を同期させる必要は実際にはありません。問題発生時にclose()とGCが同じファイル参照カウントに触れます。GCがclose()による参照カウントの減少を検知すれば、SCCのガベージコレクトをあきらめるだけで済みます。したがってMSG_PEEK中の競合を正しいメモリバリアでGCに可視化するだけで十分です。seqcount_tを使いMSG_PEEK発生をGCに通知し、次の実行でSCCの処理を延期させます。これによりMSG_PEEK側にロックは不要となり、不要なペナルティを避けられます。なおunix_scc_dead()内でMSG_PEEK検出時にリトライ可能ですが、濫用によるタスクハングを避けるため、実行しません。 |
| Possible impacts | 当該ソフトウェアが扱う情報について、外部への漏えいは発生しません。 また、当該ソフトウェアが扱う情報について、書き換えは発生しません。 さらに、当該ソフトウェアが完全に停止する可能性があります。 そして、この脆弱性を悪用した攻撃の影響は、他のソフトウェアには及びません。 |
| Solution | リリース情報、またはパッチ情報が公開されています。参考情報を参照して適切な対策を実施してください。 |
| Publication Date | March 25, 2026, midnight |
| Registration Date | April 27, 2026, 10:53 a.m. |
| Last Update | April 27, 2026, 10:53 a.m. |
| CVSS3.0 : 警告 | |
| Score | 4.7 |
|---|---|
| Vector | CVSS:3.0/AV:L/AC:H/PR:L/UI:N/S:U/C:N/I:N/A:H |
| Linux |
| Linux Kernel 6.1.141 以上 6.2 未満 |
| Linux Kernel 6.10 |
| Linux Kernel 6.10.1 以上 6.18.23 未満 |
| Linux Kernel 6.19 以上 6.19.10 未満 |
| Linux Kernel 6.6.93 以上 6.7 未満 |
| Linux Kernel 7.0 |
| No | Changed Details | Date of change |
|---|---|---|
| 1 | [2026年04月27日] 掲載 |
April 27, 2026, 10:53 a.m. |
| Summary | In the Linux kernel, the following vulnerability has been resolved: af_unix: Give up GC if MSG_PEEK intervened. Igor Ushakov reported that GC purged the receive queue of This is the exact same issue previously fixed by commit After GC was replaced with the current algorithm, the cited The problem is that MSG_PEEK bumps a file refcount without Consider an SCC containing sk-A and sk-B, where sk-A is The bad thing happens if sk-A is recv()ed with MSG_PEEK from GC thread User thread close(sk-B) Initially, sk-A's file refcount is 1 by the inflight fd in sk-B However, sk-A's file refcount is bumped silently by MSG_PEEK, At this moment, sk-B's file refcount is 2; one by the open fd, Finally, GC incorrectly concludes that both sk-A and sk-B are dead. One option is to restore the locking dance in unix_peek_fds(), The point is that the issue does not occur without the subsequent When the issue occurs, close() and GC touch the same file refcount. Therefore, we only need to signal the race during MSG_PEEK with Let's use seqcount_t to notify GC when MSG_PEEK occurs and let This way no locking is needed on the MSG_PEEK side, and we can Note that we can retry within unix_scc_dead() if MSG_PEEK is |
|---|---|
| Summary | En el kernel de Linux, la siguiente vulnerabilidad ha sido resuelta: af_unix: Abandonar la recolección de basura (GC) si MSG_PEEK intervino. Igor Ushakov informó que la recolección de basura (GC) purgó la cola de recepción de un socket activo debido a una condición de carrera con MSG_PEEK con una buena reproducción. Este es exactamente el mismo problema previamente solucionado por el commit cbcf01128d0a ('af_unix: corregir recolección de basura vs MSG_PEEK'). Después de que la recolección de basura (GC) fue reemplazada por el algoritmo actual, el commit citado eliminó la 'danza de bloqueo' en unix_peek_fds() y reintrodujo el mismo problema. El problema es que MSG_PEEK incrementa un contador de referencias de archivo sin interactuar con la recolección de basura (GC). Considere un SCC que contiene sk-A y sk-B, donde sk-A está close()d (cerrado) pero puede ser recv()ed (recibido) a través de sk-B. Lo malo sucede si sk-A es recv()ed (recibido) con MSG_PEEK desde sk-B y sk-B está close()d (cerrado) mientras la recolección de basura (GC) está verificando unix_vertex_dead() para sk-A y sk-B. Hilo de GC Hilo de usuario close(sk-B) Inicialmente, el contador de referencias de archivo de sk-A es 1 por el descriptor de archivo en tránsito en la cola de recepción de sk-B. La recolección de basura (GC) piensa que sk-A está muerto porque el contador de referencias de archivo es el mismo que el número de sus descriptores de archivo en tránsito. Sin embargo, el contador de referencias de archivo de sk-A es incrementado silenciosamente por MSG_PEEK, lo que invalida la evaluación anterior. En este momento, el contador de referencias de archivo de sk-B es 2; uno por el descriptor de archivo abierto, y uno por el descriptor de archivo en tránsito en sk-A. El close() (cierre) subsiguiente libera un contador de referencias por el primero. Finalmente, la recolección de basura (GC) concluye incorrectamente que tanto sk-A como sk-B están muertos. Una opción es restaurar la 'danza de bloqueo' en unix_peek_fds(), pero podemos resolver esto de manera más elegante gracias al nuevo algoritmo. El punto es que el problema no ocurre sin el close() (cierre) subsiguiente y en realidad no necesitamos sincronizar MSG_PEEK con la detección de SCC muertos. Cuando ocurre el problema, close() (el cierre) y la recolección de basura (GC) tocan el mismo contador de referencias de archivo. Si la recolección de basura (GC) ve que el contador de referencias es decrementado por close() (el cierre), puede simplemente abandonar la recolección de basura del SCC. Por lo tanto, solo necesitamos señalar la condición de carrera durante MSG_PEEK con una barrera de memoria adecuada para hacerla visible a la recolección de basura (GC). Usemos seqcount_t para notificar a la recolección de basura (GC) cuando ocurre MSG_PEEK y permitirle aplazar el SCC a la siguiente ejecución. De esta manera, no se necesita bloqueo en el lado de MSG_PEEK, y podemos evitar imponer una penalización a cada MSG_PEEK innecesariamente. Tenga en cuenta que podemos reintentar dentro de unix_scc_dead() si se detecta MSG_PEEK, pero no lo hacemos para evitar la 'salpicadura' de tareas colgadas por llamadas abusivas a MSG_PEEK. |
| Publication Date | March 25, 2026, 8:16 p.m. |
| Registration Date | April 27, 2026, 12:19 p.m. |
| Last Update | April 25, 2026, 12:20 a.m. |
| Configuration1 | or higher | or less | more than | less than | |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.1.141 | 6.2 | |||
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.6.93 | 6.7 | |||
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.10.1 | 6.18.23 | |||
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.19 | 6.19.10 | |||
| cpe:2.3:o:linux:linux_kernel:6.10:-:*:*:*:*:*:* | |||||
| 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:*:*:*:*:*:* | |||||