CVE-2025-39735 in Linux
要約
〜によって VulDB • 2026年06月28日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
jfs: ea_get() におけるスラブ外読み取りの修正
ea_get() の「size_check」ラベル内では、拡張属性リスト(xattr)のサイズが ea_size と一致するかどうかをチェックします。一致しない場合、「ea_get: invalid extended attribute」とログに記録され、print_hex_dump() が呼び出されます。
ここで EALIST_SIZE(ea_buf->xattr) は 4110417968 を返しますが、これは INT_MAX (2,147,483,647) を超えています。その後 ea_size クランプ処理が行われます:
int size = clamp_t(int, ea_size, 0, EALIST_SIZE(ea_buf->xattr));
clamp_t は ea_size を 0 から 4110417968 の範囲に収めることを目的としていますが、上限値が int 型として扱われるため、2^31 - 1 を超えるとオーバーフローが発生します。これにより「size」はラップアラウンドして負の値(-184549328)になります。
その後、「size」は print_hex_dump() に渡されます(print_hex_dump() では「len」と呼ばれます)。これは size_t 型(符号なし型)として渡され、次に「int remaining」という変数に格納され、さらに「int linelen」に割り当てられて hex_dump_to_buffer() に渡されます。print_hex_dump() の for ループでは len-1 から 0 まで反復処理を行い、len は 18446744073525002176 という非常に大きな値であるため、各イテレーションで hex_dump_to_buffer() が呼び出されます:
for (i = 0; i < len; i += rowsize) {
linelen = min(remaining, rowsize); remaining -= rowsize;
hex_dump_to_buffer(ptr + i, linelen, rowsize, groupsize, linebuf, sizeof(linebuf), ascii);
... }
期待される停止条件(i < len)は、len が壊れて非常に大きいため実質的に機能しなくなります。これにより最終的に「ptr+i」が hex_dump_to_buffer() に渡され、「ptr」の実際の境界に近づこうとします。その結果、以下の for ループ内で hex_dump_to_buffer() において範囲外アクセスが発生します:
for (j = 0; j < len; j++) {
if (linebuflen < lx + 2) goto overflow2; ch = ptr[j];
... }
これを修正するには、「EALIST_SIZE(ea_buf->xattr)」を使用する前に検証を行う必要があります。
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.