NAT Slipstreaming攻撃とブラウザ側の対策

2021/01/29 NAT Slipstreaming v2が公開されたので、追加記事を書きました
https://asnokaze.hatenablog.com/entry/2021/01/29/014759


2020年10月31日に「NAT Slipstreaming」という攻撃手法が発見されてます
samy.pl

これは簡単に言うと

罠サイトを踏ませることで、SIPのApplication Level Gateway機能を持つNATの内側に居るクライアントに対して、外側からそのクライアントの任意のTCP/UDPポートに接続できる。という攻撃のようです。

この攻撃はさまざなテクニックを使用しており大変面白いです。調査過程も含め詳細は上記のサイトに書かれているので、そちらを読むことを強く推奨します。

ざっくり

登場人物

  • victim(攻撃対象): ブラウザで攻撃者のサイトにアクセスすr
  • attacker (攻撃者): 罠サイトを準備し、最終的にNAT内側のvictimの任意ポートにアクセスする
  • Application Level Gateway NAT: NATの機能を持つが、5060ポートで送信されるSIPメッセージを見つけると、そのSIPメッセージ内に含まれるIP/Portもちゃんと外向きに書き換え、マッピングを行い通信を中継する。

f:id:ASnoKaze:20201107225622p:plain
(解説サイトより引用)

  • 1. victimが、直接もしくは広告を通してattackerのサイトを訪れます
  • 2. attackerはWebRTCやタイミング攻撃を通してvictimのinternal IPを取得します(後のSIPメッセージを構築時に使用します)
  • 3. attackerは、Hidden Formを通して大きなデータを送信させ victim のIPスタックの最大MTUサイズを検出します(後のSIPメッセージをパケット境界に合わせるために使用します)
  • 4. attackerは、Hidden Formを通してvictimに下記のようなPOSTをport5060でattackerサイト宛に送信させます。HTTPボディにはSIPのRegisterメッセージが格納されていますが、このSIPメッセージがちょうどパケット境界になるように途中にデータを埋め込み調整します。(このSIPメッセージのContactヘッダが最終的に攻撃者が通信を行いたい先です)
POST / HTTP/1.1
Host: samy.pl:5060
Connection: keep-alive
Content-Length: 191
Cache-Control: max-age=0
Origin: http://samy.pl

(中略)

------WebKitFormBoundaryhcoAd2iSAx3TJA7A
Content-Disposition: form-data; name="textname"

REGISTER sip:samy.pl;transport=TCP SIP/2.0
Contact: <sip:samy@192.168.0.109:1234;transport=TCP>


------WebKitFormBoundaryhcoAd2iSAx3TJA7A--
  • 5. 上記のSIPメッセージを観測したApplication Level Gatewayは、SIPメッセージの内部IPをグローバルIPに変更しつつ、そのIP/Portをマッピングして中継するようになります。(パケット境界にあわせると、SIPのパケットとして処理されてしまう模様)
  • 6. attackerは受け取ったregisterパケットに含まれるIPとポートに接続することで、NATの内側のvictimの任意のポート(AttackerがRegisterメッセージに埋め込んだポート)に接続できます

UDPでNAT内部アクセスしたい場合は、WebRTC TURNをつかってSIPメッセージを偽装する)

ブラウザの対策

これはブラウザ側の脆弱性というわけではないが、ワークアラウンドとして対策されている。

具体的には5060/5061のポートへのリクエストはブラウザによってブロックされる変更が入っている。

同様に、whatwgの仕様上もブロックポートに加えられている
https://github.com/whatwg/fetch/pull/1109