Asayomu Tech
注目★★★★★Lobsters

iOSのUNIXソケット、40年越しのinodeバグが発覚

30秒で把握

  • 1iOS上のVMでUNIX socketのinode番号が変化するXNUバグを発見
  • 2`unp_ino++`が初回にinode 0を返し2回目の`fstat()`で値が変化
  • 3原因は1985年の4.3BSDまで遡り古いiOSにも残存

要約

iOS上のVMでSSHサーバーを動かしていた開発者が、UNIX domain socketのinode番号を変化させるXNUのバグを発見した。原因は、未初期化値0を判定するコードでグローバル変数を`unp_ino++`と後置インクリメントしていたことだった。最初の`fstat()`ではinode 0が割り当てられ、2回目に別の番号へ変わるため、VMの整合性検査がクラッシュした。このロジックは2001年のMac OS X 10.0だけでなく、1989年のNeXTSTEPや1985年の4.3BSDまで遡って残っていた。修正は`++unp_ino`への変更で済むが、古いiOSではinode 0を受けた場合の再`fstat()`が必要になる。

あなたへの影響

iOS上でUNIX domain socketや独自VMを扱う開発者は、古いOSで`fstat()`のinode 0を前提にしない実装へ見直し、対象環境で再現テストを行うべきです。

推奨:UNIX domain socketは同一ホスト内のプロセス間通信に使うソケットです。

詳細を読む → 元記事へ※ 本文は元記事をご確認ください (asayomu は要約のみ提供)

関連する記事

※ 外部記事の権利は原著作者に帰属します。著作権削除要請は copyright@asayomu.jp までご連絡ください(受領確認 24h・実処理 72h 以内)。