🌊

Direct Sockets API

2021/04/06に公開

ブラウザで生ソケットを使えるようにしようという話について簡単に調べました。
なぜならブラウザにそんなもの搭載して大丈夫かよと思ったからです。

参考資料

https://ewilligers.github.io/raw-sockets/index.html
https://github.com/WICG/raw-sockets/blob/main/docs/explainer.md

なぜ必要なのか

ブラウザから

  • メールサーバー
  • プリンタ
  • SSH

とかに繋ぐために必要らしいです。
『Webアプリは、ユーザーがそのシステムを変更または交換する必要なしに、レガシーシステムと通信できる必要があります』 だそうです。
せやろか。

これまでは、これらの用途のためにはこのようなプラグインが使われてきました。

  • Javaアプレット
  • ActiveX
  • Adobe Flex
  • Microsoft Silverlight

ブラウザがこれらのプラグインを排除しようと思ったらブラウザに生ソケットが必要だという主張のようです。

僕の懸念

どこかのサイトを訪れただけで、LAN内のセキュリティが薄いサーバーにアクセスされたらやばくないだろうか。
CORS的な機能はちゃんとあるのだろうか。

使い方

ブラウザがダイアログを出してユーザーに接続先のIPやホストとポート番号を入力させるらしいです。ちょっと不便ですね。
一度入力したIPやホストは、その後確認なしに使えるようです。

制限

プライベートIPアドレスの扱い

ユーザーはIPだけでなくホスト名を入力することができますが、
ただし、プライベートIPアドレスに解決されるホスト名は無効になるようです。

例えば僕はtanide.netというドメインを持っています。
僕がDNSに fishing.tanide.net: 192.168.0.10 と登録しておいたとして、
ユーザーがダイアログにfishing.tanide.netと入力した場合は無効です。

ただし、ホスト名が.localの場合は例外で許可されています。
この場合はmDNSで解決されるそうです。

ユーザーが操作するまで開始できない

ユーザーがボタンをクリックしたりするまで使えないということだと思います。
これはhistory.pushも同じですね。

デフォルトではサードパーティから使えない

iframe等からは使えないそうです。
デフォルトではというのがどういう意味なのかはわかりませんでした。
CSP等で有効にできるのでしょうか。

残った疑問

このサンプルコードを見ると、アプリからリモートアドレスを指定できるようです。

https://github.com/WICG/raw-sockets/blob/main/docs/explainer.md#tcp
これはおそらくデフォルト値をアプリが指定できるということだと思います。
ということは、攻撃対象のローカルネットワーク内の脆弱なサーバーのIPがわかっている場合、
そのIPをデフォルト値として設定しておけば、ワンチャンでクリックミスを狙えるのではないでしょうか。

まとめ

いかがでしたか?(ry

Discussion