- 家庭用NAS機器のWebインターフェースが、内部専用ホスト名を外部サービスへ送信する事例が発見された
- NASのWeb UIに含まれるsentry.ioのエラー報告スクリプトが、スタックトレースとともに内部ホスト名を外部へ送信
- sentry.io側がそのホスト名に対してTLS接続を逆向きに試行するものの、実際のリクエストは送らないという奇妙な挙動が観測された
- ワイルドカードDNSをあらかじめ設定していたおかげで漏洩の事実を検知でき、機微なホスト名を使っている場合は深刻な情報露出リスクがある
- この仕組みを悪用すると、任意のホストに対するDNSスキャンを誘発できる潜在的なセキュリティ問題がある
NASの設置と内部ホスト名の構成
- NAS機器を購入してドライブを装着し、ホームネットワークに接続して、HTTPSモードで運用
- 公開インターネット上で意味のないドメインの配下サブゾーン(例:
*.nothing-special.whatever.example.com)に対するワイルドカードTLS証明書を導入
/etc/hosts ファイルに 172.16.12.34 nas.nothing-special.whatever.example.com のようなローカル専用エントリを追加し、ブラウザからアクセス
外部からの予期しないアクセスを発見
- NASを設置して数日後、同じホスト名に対して外部("outside world")からのリクエストが届き始めた
- そのホスト名はノートPCの
/etc/hosts ファイルにしか存在しない完全に内部専用の名前
- 事前に
*.nothing-special.whatever.example.com 全体について、自分が管理するマシンへ向けるワイルドカードDNSエントリを設定していたため、漏洩を検知できた
- NASを読み込むたびに、GCPホストがその内部ホスト名をSNIとして提示し、接続を試みていた
漏洩の原因: sentry.ioのエラー報告
- NASのWebインターフェースにはphone home機能が含まれており、その一環としてsentry.ioへスタックトレースを送信
- ブラウザがsentry.ioへコールバックする際、内部ストレージ機器で使っているホスト名も一緒に送信していた
- sentry.io側がそのホスト名に対してTLS接続を逆向きに生成するが、実際のHTTPリクエストはまったく送らないことを確認
セキュリティ上の示唆と対応
- ホスト名に機微な情報(例:
mycorp-and-othercorp-planned-merger-storage のような名前)を含めている場合、深刻な情報漏洩の危険がある
- このsentryの報告メカニズムを利用して、任意の外部ホストに対するDNSスキャンを誘発することが可能(具体的方法は読者に委ねる)
- 対応策として Little Snitch を起動し、そのドメイン全体をすべてのアプリに対してブロックした
1件のコメント
Hacker Newsの意見
みんな誤解しているようだ。これは CTログ の問題ではなく、ワイルドカード証明書 に関する話だ。
Sentryがクライアント側トレースを収集する際、リクエストを送ったホスト名を抽出し、それを再度ポーリングしようとして拒否された状況だ。
ホスト名は本質的に 非公開情報ではない。
DNSクエリやTLS証明書など、さまざまな経路で外部に露出する。
非公開サービスを隠したいなら、ホスト名の代わりに URLパス に秘密を入れるほうがよい。
たとえば
fileservice.example.com/my-hidden-service-007-abc123/のようにすれば、HTTPSでのみ送られるため露出はかなり減る。「clown GCP Host」が技術用語なのか気になった。調べてみると、筆者が cloudを皮肉って 使った表現だった。
NASのWebインターフェースがSentryへログを送る際、内部ホスト名が含まれていたのが問題の核心だ。
私ならこういう場合、信頼できるオープンソースOS に入れ替えるか、PiHole のようなDNSブロックでSentry呼び出しを止めると思う。
ある人はローカルDNSと TLSプロキシ を使って、外部へ出るトラフィックを完全に遮断していると説明していた。
こうした事例があるので、私は uBlock Origin をWebセキュリティの最低基準だと見ている。
ほとんどのWebページが大量のサードパーティ製スクリプトを読み込み、データを漏らしているのは深刻すぎる。
根本的な解決ではないが、今すぐ私たちにできる最善策だ。
こうした問題を防ぐには、前段に Nginxリバースプロキシ を置き、CSPヘッダー を注入するのがよい。
こうすればNAS自身が外部へリクエストを送るのは防げないが、代わりにブラウザが送るのは遮断できる。
たとえばSteamのアバター取得リクエスト(
https://avatars.steamstatic.com/HASH_medium.jpg)もCSPポリシーでブロックできる。必要なら一部だけ許可すればよい。また Referrer-Policy: no-referrer を追加して、ホスト名が外部ログに残らないようにもできる。
私は Synology NAS を買ったが、何度も後悔した。
コミュニティ製ソフトウェア以外では、できることがほとんどない。
Let's Encrypt でSSLを適用するのも複雑で、パスが非標準的なため設定場所を見つけにくい。
古いrsyncバージョン、基本ユーティリティ不足など不満が多い。むしろ LinuxやBSDベースのNAS にしておけばよかった。
最近Sentryを設定してみたが、このシステムには 自動でアップタイム監視 を構成しようとする機能がある。
ホストを認識すると定期的にpingを送り、数日間安定して応答すると「このホストにアップタイム監視を設定しますか?」という通知を出す。
私は個人的に Sentry関連ドメインを丸ごとブロック している。
一般的な解決策ではないが、自分の環境ではそれが最善だ。
逆引きサーバー は、内部ネットワークアドレス(ULA、RFC1918)まで解決しようとする試みがしばしば見られる。
こうしたデータを他の情報と組み合わせれば、内部状態を推測できる。
「Darknet収集中にUDPオーディオが捕捉されたこともある」とのことだ。
以前 Heroku で似た現象を調べたことがある。
新しいアプリを作るとランダムなサブドメインが割り当てられるのだが、DNS問い合わせをしていなくても、すぐに 脆弱性スキャナーからのリクエスト が来る。
Herokuに問い合わせたところ、新規アプリのURLが 証明書透明性(CT)ログ に公開されるためだという。
Certificate Transparencyの仕組み のリンクも共有されていた。