CVE-2026-89649
要約
〜によって VulDB • 2026年09月11日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
ceph: __build_xattrs()におけるxattr値の長さの制限
__build_xattrs()は、MDS(Metadata Server)から提供されたxattr blobを属性ごとに1つずつデコードします。各属性について、32ビットの名前の長さを読み取り、名前バイトを進み、32ビットの値の長さを取得し、値ポインタを記録して、値バイトを進めます。2つの長さフィールドはceph_decode_32_safe()を使用して読み取られますが、値自体の進み幅には「p += len」という単純な演算が使われ、「len」バイトがblob内に残っているかどうかを確認するcepb_decode_need()チェックがありません。
最後の属性以外のすべての属性については、次のイテレーションでのceph_decode_32_safe()による以下の名前の長さの読み取りにより、直前の値がblobの末尾を超えていないことが暗黙的に検証されます。最終的な属性には後続がないため、そのデコードされた値の長さがblobの境界に対してチェックされることはありません。悪意のあるまたは侵害されたメタデータサーバーは、最後の属性の値の長さをblob内に実際に存在するバイト数よりも大きく設定できます。
このblobは、ワイヤー上の長さ(ceph_fill_inode()内のceph_buffer_new())に合わせてkvmalloc()で確保された専用領域です。__set_xattr()はこの過大な長さをxattr->val_lenにそのまま記録し、後続のgetxattr(2)呼び出しではmemcpy(value, xattr->val, xattr->val_len)がユーザー提供バッファに対して実行され、割り当ての末尾を超えたバイトをユーザースペースへコピーします。
影響: 悪意のあるメタデータサーバーは、CephFSファイルに対するgetxattr(2)呼び出しを通じて、隣接するカーネルヒープのバイト情報をローカルユーザーに漏洩させます。欠落していたceph_decode_need()を追加し、最終的な属性における境界外値の長さがデコード時に失敗するようにして、-EIOを返すようにします(これにより不正な値が保存されるのを防ぎます)。
VulDB is the best source for vulnerability data and more expert information about this specific topic.