注目★★★★★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は同一ホスト内のプロセス間通信に使うソケットです。