「先輩、あのサーバーにアクセスできないんですけど...」
「え、できるけど?」
「もしかして、Google Chromeのベータ版に変えたからですかね?」
「仕事でベータ版を使うのはやめまし(略」
「そういえば火狐使ってる同僚も数か月前にそんなこといってて、どこかの設定をいじったとか...」
「呼んだ?」
「はい、さっきChrome更新したら鯖につながらなくなって」
「もしかして、あのポート10080?」
NAT Slipstreaming
「実はな、去年「NAT Slipstreaming」という攻撃手段が見つかってな... 要はウェブサイトがブラウザー経由でLAN内のサーバーにアクセスして、ファイアウォールの設定を変更するっていうものだ。しかもこの攻撃はCSRFとかと違って、攻撃先がHTTPリクエストを受け付ける必要はないんだ...」
NAT Slipstreamingの攻撃方法は、仕組み上はクロスサイトリクエストフォージェリ(CSRF)と似ています。
- 攻撃者がウェブサイトを設置する。
- 被害者がそれを閲覧する。
- 被害者のブラウザーが、攻撃先のサーバーにアクセスする。
- 攻撃先のサーバーの設定が変更される。
NAT Slipstreaming: v1
古典的なCSRFは、HTTP(ポート80と443が主)サーバーを攻撃しましたが、NAT Slipstreamingは、これに限られていません。たとえば、「Session Initiation Protocol方式のリクエストをNATのポート5060に送信して、ポートを開放する」というものがあります。
しかし、ブラウザーはSIP形式のリクエストを送信できません。そのため、攻撃者のウェブサイトはHTTP POST形式のリクエストを送信します。(これは、通常のCSRFと同じです。)被害者のOSの実装側で、このリクエストが分割され、NATにはゴミと「本当のSIP形式リクエスト(のようなもの)」2つが送信されます。
なお、この攻撃ではCSRFとは違い、攻撃先のポート番号はわかっても、IPアドレスはわかりません。そのため、事前にimgタグ等を利用したタイミング攻撃で、あるポート番号が利用可能なIPアドレスを探す「逆ポートスキャン」が行われます。
NAT Slipstreaming: v2
実はさっき述べた攻撃方法は、「バージョン1」というものです。バージョン2ももちろんあります。このバージョンでは、HTTP POSTではなくWebRTCを利用します。この方式は少しわかりにくいので、説明は省略しますが、結果は同様です。
対策
NAT Slipstreamingの対策は、「特定のポートへのアクセスをブラウザー側で遮断する」ことでした。Firefoxは対応に素早く、12月リリースのFirefox 84ではすでに対応されました。Firefox 85ではそれが強化され、Firefox 87ではNAT Slipstreaming v2対策も追加されました。
「特定のポート」は、fetch()の仕様書に記載されています。その中に最近、ポート10080が追加されました。
「ってことは、サーバーにアクセスできるのも...」
「初期設定では、Chrome 91がリリースされるまで、ですね。その後は隣の部署からMac借りてSafariでつなぐか、それとも...」
「あ、Firefoxなら設定一個変えれば大丈夫です。」
回避策
ポート番号を決める側
ポート番号に10080などの遮断される番号を使わないようにしましょう。
アクセスする側
方法は4つあります:
- requestsとかnode-fetchとかでアクセスする。この仕様はウェブブラウザー以外には影響しない。
- 古いバージョンのブラウザーを使う。(やめましょう。)
- Safariが実装するまでそっちに移行する。
- ポート遮断を無効化する。
Firefoxでは、この対策をポート単位で無効化できます。といっても、安易な無効化はセキュリティ上の問題になるのでやめましょう。
- (必要な場合は)上司に決裁を取ります。
-
about:config
に行きます。お説教されても続行します。 - 検索欄に
network.security.ports.banned.override
を入力し、文字列の規則を作成します。+ボタンを押し、「10080」と入力します。(他のポートもある場合は、10080,6666
のようにカンマ区切り。) - これでアクセスできるようになります。以上。
参考資料
- NAT Slipstreamingとは
- How to allow a restricted port? - FirefoxのQ&A
- Should we block port 10080? - WHATWG fetch仕様書のIssue
- Chrome Status: Block HTTP port 10080
- NAT Slipstreaming v1のCVE: CVE-2020-26978, CVE-2021-23961
- NAT Slipstreaming v2のCVE: CVE-2021-23982