🌊

Direct Sockets API

2021/04/06に公開1

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

参考資料

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

HikaruooHikaruoo

Webアプリケーションがレガシーシステムと直接通信するために生ソケットが必要という部分は、現代のWeb開発において非常に重要なトピックだと感じました。

一方で、セキュリティ面の懸念も十分理解できます。例えば、誤って脆弱なサーバーに接続してしまうリスクについて触れられていた点は、ユーザーがどれだけ慎重に利用しても危険が潜んでいることを示唆していると思います。プライベートIPアドレスへのアクセスが制限されている点や、CORSポリシーが有効であることが重要になりそうです。

この技術がどのように進化していくのか、ブラウザ側のセキュリティ強化が必要だと感じました。面白い議論を提供していただき、ありがとうございました!