WebUSBは、 WebアプリケーションからUSBデバイスへの安全なアクセスを提供するJavaScriptアプリケーションプログラミングインターフェース(API)仕様です[ 1 ]。[ 2 ]
これはWeb Platform Incubator Community Groupによって公開されました。2021年7月現在、ドラフトコミュニティのステータスであり、Chromiumベースのブラウザでサポートされています[ 3 ]。
ユニバーサルシリアルバス、またはUSBは、コンピュータから周辺機器や他のコンピュータへコネクタやケーブルを介してデータを通信するために使用される業界標準の通信プロトコルです。[ 4 ] WebUSBは、Webページからこれらのハードウェアデバイスにアクセスできるようにする一連のAPI呼び出しです。WebUSBは、World Wide Web Consortium(W3C)によって開発されました。[ 1 ] WebUSB APIは、Webページからエッジデバイスへの安全で開発者にとって馴染みのある通信手段を提供します。WebUSB APIは既存のUSBライブラリに統合され、これらのデバイスのブラウザサポートを待つ必要がないため、新しいデバイスをWeb環境に統合するための開発サイクルを短縮します。
WebUSBの初期バージョンは、 Flash 、Chrome Serial、およびブラウザをハードウェアに接続するための他のカスタムアプローチの代替として登場しました。WebUSBは、あらゆるインターフェースの4つの目標、つまり、作成が速いこと、クロスプラットフォームであること、見栄えが良いこと、アクセシビリティを解決することを目指しています。[ 5 ]
WebUSB APIはハードウェアプロトコルとインターネットプロトコルを橋渡しすることができ、エッジデバイスを中央ネットワークに接続する統一ゲートウェイの作成を可能にします。[ 6 ]
過去数十年間のコンピューティング能力の爆発的な向上により、エッジデバイスが増加しました。ライト、温度計、HVAC、モーターなどのデバイスは、中央集中型のインターネット制御サーバーにますます統合されています。[ 7 ]これらのデバイスは、これまで統合されていなかった孤立した開発環境から進化してきました。そのため、Webサービスへの即時接続を開発するために必要な、統一された一貫性のある通信プロトコルが欠けています。WebUSBのAPIフレームワークは、さまざまなプロトコルを標準化し、非標準のユニバーサルシリアルバス(USB)互換デバイスをWebに公開することができます。[ 8 ]
WebUSBは知覚層とネットワーク層の間に位置しているようです。[ 6 ]このゲートウェイのソフトウェアの主な目標は、スケーラビリティ、コスト、信頼性です。WebUSBライブラリのクラウドベースの展開によりスケーラビリティが実現され、オーバーヘッドの少ない展開によりコストが大幅に削減され、ライフサイクル全体にわたる継続的な使用開発によりフレームワークは高い信頼性を達成しています。[ 9 ]
WebUSB は、BIPES (Block based Integrated Platform for Embedded Systems) アーキテクチャ フレームワークの基盤を形成しています。このシステム アーキテクチャ モデルは、関連するソフトウェアを完全なコード ユニットである「ブロック」に集約し、中央のクラウド インフラストラクチャからエッジ デバイスに展開することで、IoT システム開発の複雑さを軽減することを目的としています。[ 10 ]すでに述べたように、WebUSB の役割は、USB 通信プロトコルを介して組み込みソフトウェアと通信する能力に大きく依存しています。情報が WebUSB の JavaScript 環境内に入ると、さまざまなソフトウェア プロトコルを介して変換および通信できます。[ 1 ]この特定のアーキテクチャ モデルでは、WebUSB は組み込みソフトウェアとWeb ブラウザーの間のギャップを埋めます。Web ブラウザーは、統一された WebUSB 構築データを使用してクラウド 環境と通信します。[ 10 ]
WebUSBは、エッジデバイスへのコネクタへのWebページアクセスを提供します。デバイスをインターネットに公開すると、固有のリスクとセキュリティ上の懸念が生じます。[ 7 ]設計上、USBポートは接続されているデバイスを信頼するように設計されています。このようなポートをインターネットに接続されたアプリケーションに接続すると、新たなセキュリティリスクが生じ、悪意のある攻撃者にとって攻撃対象領域が大幅に拡大します。[ 8 ] [ 1 ]
例えば、悪意のあるホストのウェブページが周辺機器からデータを要求すると、機器は標準のUSBコネクタを介して通信していると思い込んで、その要求に喜んで応じてしまう可能性があります。この種の攻撃を軽減するために、WebUSBはrequestDevice()関数呼び出しを開発しました。これにより、サイトがエッジデバイスへのアクセスを要求していることをユーザーに通知します。これは、ウェブページが内蔵カメラやマイクにアクセスしようとする場合のブラウザ制御のアクセス要求に似ています。ユーザーの警戒心によっては、このプロトコルだけで特定の攻撃を防ぐのに十分です。開発された2番目のプロトコルは、セキュアなコンテキストから発信される要求の仕様です。[ 11 ] [ 1 ]これにより、実行されるコードと返されるデータの両方が転送中に傍受または変更されないことが保証されます。このセキュリティはclaimInterface()関数によって実装されます。これはOSでサポートされている関数であり、単一の実行インスタンスのみがユーザー空間またはカーネル空間ドライバでデバイスにアクセスできることを保証し、ウェブページ上の悪意のあるコードがデバイスへの2番目の通信チャネルを開くことを防ぎます。[ 1 ]その他のセキュリティ上の考慮事項には、承認された接続の公開レジストリを作成することが含まれていましたが、このアイデアは、ベンダーが WebUSB を念頭に置いてデバイスを開発する必要があるため、最終的に破棄されました。[ 1 ]
しかし、USB の脅威対象は双方向であり、悪意のある周辺機器がホストを攻撃する可能性があります。感染したエッジ デバイスは、WebUSB API では容易に軽減できません。多くのデバイス構成では、ファームウェアのアップグレードを提供するために信頼できる USB ポートが使用されており、悪意のあるエッジ デバイスは攻撃者にシステム内での永続性を与える可能性があります。[ 11 ] [ 4 ]
WebUSB が抱えるセキュリティ上の懸念から、WebUSB は推定 76% のブラウザでしかサポートされていません。ブラウザレベルでの WebUSB のサポートは、時間の経過とともに不安定で、特定のセキュリティ上の脅威が発見された後、一部のブラウザが一定期間アクセスを停止していました。[ 12 ]このサポートの変動は、基本的なセキュリティリスクに対する適切な対策が講じられなかったために普及しなかったAdobe Flashや Google Serial と似ています。[ 5 ]
インターネット上でデジタルIDを所有および検証する能力は、インターネットに接続されたインフラストラクチャとのやり取りに不可欠です。WebUSBは、専用デバイスおよび公開識別レジストリと組み合わせることで、インターネット上のデジタルIDに対するインフラストラクチャ規模のソリューションの重要な構成要素として使用できます。[ 13 ] WebUSB APIライブラリは、周辺機器とWebページの接続を標準化できます。WebUSBへのセキュリティ投資により、識別可能なデバイスをインターネットに接続するための適切なソフトウェアコンポーネントとなっています。[ 1 ]最近の研究では、SMSベースの認証の不完全性が示されており、インフラストラクチャの重要な部分がどのように侵害される可能性があるかが明らかになっています。[ 14 ]デジタルIDを保護するための代替案には、生体認証センサーや個人識別子の使用が含まれます。しかし、これらは個人を識別するのに優れていますが、既存のインターネット技術スタックに適切に統合できるのはWebUSBを介してのみです。[ 13 ]政府および専用ハードウェアのサポートにより、個人識別のための暗号化された安全なソリューションが存在します。しかし、これらのソリューションはWebベースのインフラストラクチャの一般的な仕様を欠いており、一般的にサポートが困難です。このような通信プロトコルのゲートウェイサポートは、WebUSBなどのソフトウェア中間者によってサポートされる可能性があります。[ 10 ] [ 13 ]
多要素認証のモデルシステムでは、WebUSB を、ISO/IEC 7810 :2003 ID-1 [ 15 ]規格に準拠した ID カードなどの識別ハードウェアと併用します。このカードは、個人の身元を物理的に表現するものです。WebUSB は、ハードウェアに保存されているデータを特定の Web サーバーに転送するための仲介役として機能します。番号カードは、承認された当事者によってデジタル署名され、サーバーにデジタル接続されます。この接続には、ISO/IEC 14443タイプ B 接続を読み取ることができるデバイスが必要です。[ 16 ]このデジタル接続を有効にするために、WebUSB はソフトウェア コネクタとして機能します。[ 13 ]
WebUSB は、 Chromeなどのサポートされているブラウザでのみ動作します。プライバシーとセキュリティ上の懸念から、HTTPSなどの安全なコンテキストでのみ動作し、ユーザー操作によってのみ呼び出すことができます。たとえば、接続をインスタンス化するにはnavigator.usb.requestDevice()、タッチやマウスのクリックなどのユーザー操作によってのみ呼び出すことができます。同様に、機能ポリシーを使用して WebUSB からの保護を提供することもできます。たとえば、Feature-Policy: fullscreen "*"; usb "none"; payment "self" https://payment.example.comWebUSB の実行を防止できます。[ 17 ]
ブラウザから見えるデバイスにアクセスするには、2 つのオプションがあります。navigator.usb.requestDevice()は、どの USB アクセスを許可するかをユーザーに選択するように促します。 は、navigator.usb.getDevices()オリジンがアクセスできる USB デバイスのリストを返します。
デバイスの検索をより効率的に行うために、WebUSB にはいくつかのフィルタリング オプションがあります。これらのフィルタは、navigator.usb.requestDevice()JavaScript フィルタリング オブジェクトとして渡されます。これらのフィルタはvendorId、、、、、、およびです。productIdclassCodeprotocolCodeserialNumbersubclassCode
例えば、Arduinoデバイスに接続する場合、次のように接続できます。ここで、0x2341は USB ID のリストにある Arduino です[ 18 ]
navigator.usb.requestDevice ( { filters : [ { vendorId : 0x2341 } ] } ) . then ( device = > { console.log ( device.productName ) ; console.log ( device.manufacturerName ) ; } ) . catch ( error = > { console.error ( error ) ; } ) ;上記のコードスニペットから返されるUSBdevice記述子には、バージョン、パケットサイズ、構成オプションなど、デバイスに関するすべての重要な情報が含まれます。
代替の呼び出しはnavigator.usb.getDevices()次のようになります。
navigator.usb.getDevices ( ) . then ( devices = > { devices.forEach ( device = > { console.log ( device.productName ) ; console.log ( device.manufacturerName ) ; } ) ; } )デバイスと通信するには、いくつかの重要な関数呼び出しを実行する必要があります。はdevice.open()、デバイスの設定に必要なすべての手順を実行し、device.selectConfiguration()構成、特に電源の供給方法とインターフェースの数を設定します。次に、インターフェースを占有することが重要です。これは、関数呼び出しによって実行できますdevice.claimInterface。これにより、実際の有線接続がシミュレートされ、接続が解放されるまで、この Web ページだけがデバイスへの読み書きができるようになります。最後に、呼び出しによって、device.controlTransferOut()デバイスが WebUSB シリアル API を介して通信するように設定されます。設定がすべて完了したら、 を使用してデバイスにデータを転送できます。device.transferIn()同様に、 の姉妹関数を使用してdevice.transferOut()デバイスからデータを読み取ることができます。[ 17 ] [ 1 ]
ハードウェアデバイスとのインタラクションを一般化するために、WebUSBは特定のハードウェア機能を抽象化する多数のインターフェースをサポートしています。[ 8 ]