macOS 27 がアプリから netstat と ARP を隠すと何が壊れるか
公開 2026-09-29
macOS 27 では、アプリが起動したプログラムに対して 2 つのネットワークテーブルが渡されなくなりました。コマンドは成功して終了コード 0 を返しますが、何も出力しません。同じコマンドをターミナルで実行すると動くため、症状は「監視ツールがすべて正常と報告する」ことだけです。
確認したこと
netstat -an -p tcpとnetstat -an -p udpは終了コード 0 で、出力がまったくありません。netstat -anはマルチパスと UNIX ドメインソケットのセクションだけを出力し、TCP/UDP のテーブルが丸ごと欠けます。arp -a -nは終了コード 0 で出力なし。arp -n 192.168.1.1は、ターミナルでは解決できるホストに対して-- no entryを返します。
これはアプリサンドボックスによる拒否ではありません。サンドボックスなしのビルドでも再現し、サンドボックスのログにも何も残りません。ARP については、未署名・アドホック署名・バンドル化したテスト用バイナリのいずれも同じ挙動です。
なぜ問題なのか
空の出力は「安全に見える」方向に失敗します。待ち受けポートを netstat で調べるスクリプトはポートが閉じていると判断し、確立済みの VPN 接続を探すチェックは VPN が切断されていると判断し、ルータを MAC アドレスで照合するルールは一致しなくなります。FrontierStack を修正する前の社内テストでは、接続中の VPN が「切断」と表示され、すべてのポートが「公開されていない」と表示されました。
引き続き動くもの
制限されるのはこの 2 つのテーブルだけです。netstat -rn(経路)と netstat -bi(インターフェイスのカウンタ)は動作し、試したほかのコマンド(ifconfig・route・scutil・sysctl・ps・df・diskutil・launchctl・dscl・dig・ping・curl・log、lsof の全形式)もすべて正常でした。
netstat の代わりに lsof を使う
lsof は同じソケット情報を返し、制限を受けません。自分のプロセスなら権限は不要で、すべてのプロセスを見るには sudo で実行します。
# 開いているすべてのネットワークソケット
lsof -nP -i
# 待ち受け中の TCP ポート
lsof -nP -iTCP -sTCP:LISTEN
# UDP ポートを使っているプロセス
lsof -nP -iUDP:1194ARP にはまだ確実な代替がない
IPv4 の ARP キャッシュについては、代わりの取得方法が見つかっていません。ルーティングソケットも同じエントリを返さず、ndp -an は IPv6 の近隣を表示できますが IPv4 の代わりにはなりません。アクセスはローカルネットワークのプライバシー許可と関係しているようですが、それだけでは決まりません。ローカルネットワークを許可したアプリでテーブルが空のまま、同じ Mac の別のアプリでは普通に読めるケースを確認しています。詳しいことが分かれば、この記事を更新します。
やるべきこと
- アプリやエージェントが netstat で実行しているスクリプトや監視チェックは、lsof に置き換えます。
- コマンドはターミナルではなく、実際に実行するプロセスから試します。ターミナルでは動くのにツールでは何も返らない、というのが見分け方です。
- 空の出力は「見つからない」ではなく「不明」として扱います。MAC アドレスのチェックは「一致しない」ではなく「判定できない」と報告すべきです。
FrontierStack の対応
FrontierStack は待ち受けポートと確立済みの接続を lsof で取得し、netstat は旧い macOS 向けのフォールバックとしてだけ使います。ARP が関わる箇所(デバイス検出・ルータとネットワーク・ロケーション)では「MAC がキャッシュにない」と「macOS が教えてくれない」を区別し、チェックを失敗ではなく不明として表示し、ローカルネットワークへのアクセスを許可するカードを表示します。
すべてをひとつの Mac アプリで。
FrontierStack は、ローカルでもフリート全体でも、スタック全体のインストール・監視・保護をひとつのネイティブ macOS アプリで行います。
FrontierStack をダウンロードApple 公証済み · 安全・安心 · macOS 13 Ventura 以降
