1 ポイント 投稿者 GN⁺ 2023-09-14 | 1件のコメント | WhatsAppで共有
  • macOS 14 Sonomaのベータ版とリリース候補で、PFファイアウォールがトラフィックを正しくフィルタリングできず、Mullvad VPNアプリが正常に動作しない
  • ローカルネットワーク共有のような一部設定が有効な場合、トラフィック漏えいにつながる可能性があり、MullvadはmacOS 14で機能とセキュリティを保証するのは難しいと見ている
  • Mullvadは6番目のベータ以降この問題を調査してAppleに報告したが、その後のベータ版やリリース候補にもバグが残っている
  • アプリ自体のパッチで回避できるか検討したが、安全な解決策は見つからず、根本的にはAppleのファイアウォール修正が必要
  • PFフィルタリングに依存するユーザーや関連アプリはmacOS 14へのアップグレードに注意が必要で、バグが残る場合はmacOS 13 Venturaにとどまるのが安全

macOS 14 SonomaのPFファイアウォール問題

  • macOS 14 Sonomaのベータ期間中に、AppleがmacOSのファイアウォールであるpacket filter(PF) にバグを導入した
  • このバグによりMullvad VPNアプリが動作せず、特定の設定が有効な場合にはトラフィックの漏えいが発生する可能性がある
    • 例としてローカルネットワーク共有が挙げられている
  • Mullvadは6番目のmacOS 14ベータ公開後に問題を調査し、Appleにバグを報告した
  • その後のmacOS 14ベータ版やリリース候補にも同じ問題が残り続けている
  • VPNアプリだけをパッチしてmacOS 14で動作とセキュリティの両方を維持する方法を評価したが、現時点では良い解決策はないと判断している
  • 影響範囲はMullvad VPNアプリだけにとどまらない
    • ファイアウォールルールがネットワークトラフィックに正しく適用されない
    • 許可されるべきでないトラフィックが通過する可能性がある
    • PFフィルタリングに依存するユーザーや、これをバックグラウンドで使うアプリはmacOS 14へのアップグレードに注意が必要
  • macOS 14 Sonomaは9月26日にリリース予定で、バグが残っている場合はMullvadユーザーは修正されるまでmacOS 13 Venturaにとどまることが推奨される

再現手順と実際の結果

  • macOS 14で問題を再現でき、この実験ではPFに読み込まれたファイアウォールルールを消去する
  • ターミナルで仮想ロギングインターフェースを作成し、後で追加するルールに一致するトラフィックを監視する
sudo ifconfig pflog1 create
sudo tcpdump -nnn -e -ttt -i pflog1
  • pfrules ファイルに次のファイアウォールルールを記述する
pass quick log (all, to pflog1) inet from any to 127.0.0.1
block drop quick log (all, to pflog1)
  • 別のターミナルでPFを有効化し、ルールを読み込む
sudo pfctl -e
sudo pfctl -f pfrules
ping 45.83.223.209
  • 期待される結果は、pingが唯一の pass ルール条件に一致しないためブロックされ、トラフィックが pflog1block ルールへ一致したものとして記録されること
  • 実際にはpingはインターネットへ送信されて応答が返り、pflog1 にはトラフィックが記録されない
  • 実験後はファイアウォールを無効化し、すべてのルールを消去する
sudo pfctl -d
sudo pfctl -f /etc/pf.conf

1件のコメント

 
GN⁺ 2023-09-14
Hacker News のコメント
  • 同じ PF のバグが OrbStack のネットワーク機能の一つも壊している
    原因をここまで絞り込んだときは信じがたかったが、自分だけが遭遇しているわけではなさそう。安定版リリース前に必ず直ってほしい
    Apple に報告できたのは昨日になってからだが、かなり最近のリグレッションに見え、おそらく beta 6 あたりから発生したようだ
    PF は本来、最後に一致したルールが適用されるファイアウォールであるはずなのに、macOS はほとんど最初に一致したルールのように動いているように見える。前方の block ルールが quick なしでも別アンカーの pass ルールを上書きしてしまい、当然問題になる

    • 「本当にそう願う」程度では足りない。これはリリース前に必ず直さなければならない
      この状態で安定版が出るなら受け入れられないし、個人的には Mac OS を見限る理由になる。真剣な仕事に使ってほしいなら、こうしたリグレッションのある製品を出すべきではない
  • 記事がとても簡潔で有益で、バグの再現手順までシンプルに含まれていてよい
    Mullvad は好感が持てる
    余談だが、macOS はここ数リリースで奇妙なファイアウォール関連のバグが全体的に多く、なぜファイアウォール周りを作り直すことになったのか気になる

    • 書き直しは Catalina から Big Sur への移行で、カーネル拡張からユーザー空間の System Extensions、特に NetworkExtension への移行を強制した影響が確実にあったはず: https://developer.apple.com/documentation/networkextension
    • ローカル OS プラットフォームのこうしたバグが心配なら、リモートブラウザでローカルの接続地点を抽象化する方法も検討できる
      ローカルマシンや OS が何であれ、ブラウジングを専用サーバー経由にできる。ネットワーク接続全体を包むわけではなくブラウジングだけだが、その範囲内では IP アドレスを変え、位置を隠し、ブラウザのゼロデイからの保護も追加してくれる
      BrowserBox にはプライバシーを尊重・保護し、体験全体を改善する機能を継続的に追加している。オープンソースなので好きなように変更もできる。AGPL-3.0 が気に入らなければ商用ライセンスも可能: https://github.com/dosyago/BrowserBoxPro
      オープンソースが嫌で大企業の安心感を好むなら、Mullvad にも似たことをする Mullvad Browser があるようだ
    • rdar/Feedback 番号まで含まれていたら、さらによかったと思う
    • macOS は何年も ネットワークスタックを進化させようとしてきたが、リグレッションが出ると元に戻すことがあった
      関連する古い記事: https://9to5mac.com/2015/05/26/apple-drops-discoveryd-in-lat...
  • この 再現コードは本当に見やすい

    • シンプルなのもよいが、後片付けの手順まで入っている点が特によい。こういう再現手順ではよく抜け落ちる要素だ
    • 単にシンプルなファイアウォールルールを設定し、そのルールに違反する問い合わせを試しているだけではないかと思う
      もちろんそれがバグの範囲ではあるが、この検査が特別に精巧だったり美しかったりするようには見えない
  • 関係あるかは分からないが、直近 2 回の macOS アップグレード直後にネットワークが動作しなかった
    Wi‑Fi、Ethernet、ホットスポットには接続できたが、ブラウザや ping のような実際の接続は何もできず、ルーターにも届かなかった
    2 回とも Mullvad VPN アプリを一度開くだけで、また全部動作するようになった。なぜアプリを開くだけで問題が直るのかは分からない

    • VPN アプリは ルーティングテーブルを変更するので、VPN アプリを起動するまでトラフィックが存在しないインターフェースへルーティングされていたのだと思う
  • 完全に関係があるわけではないが、別の古いバグもある: macOS Popen() の 11 年前からのバグ: https://news.ycombinator.com/item?id=37238433

    • 自分のバグなら、パッチと一緒に Feedback も送るとよい。オープンソースプロジェクト側は通常 PR を受け付けない
  • 参考までに、Mullvad.app では接続問題があったが、Wireguard.app で Mullvad WireGuard 設定を実行すると問題なく動作した

  • 最近最新の Sonoma beta を入れたのだが、Mullvad をどうやっても動かせなかった理由が分かった
    Mullvad が回避策に取り組んでいるとのことで安心した。今朝は Ventura にダウングレードしようかとも思っていたので、自分の問題だったのだと感じる

    • 回避策に取り組んでいるとは書かれていない。Apple がバグを修正するまでユーザーは Sonoma にアップグレードしないようにと書かれている
    • tailscale/mullvad の組み合わせはまだ動くと思う。Apple が直すまでのよい 回避策になるかもしれない
  • Mullvad がこの問題への 公開圧力を高めてくれてうれしい。このバグは確かに目立っていたし、かなり懸念していた

    • これは他でもすでに知られていたのか? Mullvad は 6 番目の beta の後に報告したようで、その時点なら RC にかなり近い
      原文には “we have investigated this issue after the 6th beta was released and reported the bug to Apple” とある
  • 自分の場合は WireGuard 設定をダウンロードして Wireguard アプリを使うのが解決策だった

    • でも Wireguard アプリがデータを漏らし、Mullvad アプリより安全性が低いということはないのか?
    • WireGuard 設定に PostUpPostDown のファイアウォールルールを入れない場合に限って解決策になる。そうすると、あまり解決策とは言いにくい
  • 質問: pflog1 が作成されない場合、pf は期待どおりに動作するのか?
    tcpdumppflog1 に出ていくものを何も記録しないなら、データが pflog1 に送られていないという意味に見える。ならば、それより前段の問題ということになる
    pflog1 は接続され、up になっていたのか? 以前はインターフェースを手動で接続して up にする必要があった。MacOS はそれを自動でやってくれるのか?
    もちろん、これを切り分けるのはバグ報告者の仕事ではない。だがいずれ担当エンジニアがこうした質問をするはずなので、先に答えておくほうがよい

    • 再現手順に回避策として追加できるものはあるだろうか? たとえば言及したように、pfrules のロード後にインターフェースを接続して up にする、といった形で
    • その後、追加インターフェースを削除するにはこれも必要:
      ifconfig pflog1 destroy