Abusing Service Workers
基本情報
サービスワーカーは、ブラウザによってバックグラウンドで実行されるスクリプトで、任意のウェブページとは別に動作し、ウェブページやユーザーの操作を必要としない機能を有効にし、オフラインおよびバックグラウンド処理の能力を向上させます。サービスワーカーに関する詳細情報はこちらで確認できます。脆弱なウェブドメイン内でサービスワーカーを悪用することで、攻撃者はそのドメイン内のすべてのページに対する被害者の操作を制御することができます。
既存のサービスワーカーの確認
既存のサービスワーカーは、開発者ツールのアプリケーションタブのサービスワーカーセクションで確認できます。別の方法として、chrome://serviceworker-internalsを訪れることで、より詳細なビューを得ることができます。
プッシュ通知
プッシュ通知の権限は、サービスワーカーが直接ユーザーの操作なしにサーバーと通信する能力に直接影響します。権限が拒否されると、サービスワーカーが継続的な脅威をもたらす可能性が制限されます。逆に、権限を付与すると、潜在的なエクスプロイトの受信と実行を可能にすることでセキュリティリスクが増加します。
サービスワーカーを作成する攻撃
この脆弱性を悪用するには、次のものを見つける必要があります:
サーバーに任意のJSファイルをアップロードする方法と、アップロードしたJSファイルのサービスワーカーを読み込むためのXSS
出力を操作できる(任意のJSコードを使用)脆弱なJSONPリクエストと、ペイロードを持つJSONPを読み込むためのXSSが必要です。これにより、悪意のあるサービスワーカーを読み込むことができます。
次の例では、fetch
イベントをリッスンし、攻撃者のサーバーに各取得URLを送信する新しいサービスワーカーを登録するためのコードを示します(これはサーバーにアップロードするか、脆弱なJSONPレスポンスを介して読み込む必要があるコードです):
そして、これはワーカーを登録するためのコードです(XSSを悪用して実行できるはずのコードです)。この場合、攻撃者のサーバーに登録が成功したかどうかを通知するためのGETリクエストが送信されます:
JSONPエンドポイントの脆弱性を悪用する場合は、値を var sw
の中に入れる必要があります。例えば:
There is a C2 dedicated to the exploitation of Service Workers called Shadow Workers that will be very useful to abuse these vulnerabilities.
The 24-hour cache directive limits the life of a malicious or compromised service worker (SW) to at most 24 hours after an XSS vulnerability fix, assuming online client status. To minimize vulnerability, site operators can lower the SW script's Time-To-Live (TTL). Developers are also advised to create a service worker kill-switch for rapid deactivation.
Abusing importScripts
in a SW via DOM Clobbering
importScripts
in a SW via DOM ClobberingThe function importScripts
called from a Service Worker can import a script from a different domain. If this function is called using a parameter that an attacker could modify he would be able to import a JS script from his domain and get XSS.
This even bypasses CSP protections.
Example vulnerable code:
index.html
sw.js
DOMクラッキングを使用して
DOMクラッキングが何であるかの詳細については、次を確認してください:
Dom ClobberingSWが**importScripts
を呼び出すために使用しているURL/ドメインがHTML要素内にある場合**、それをDOMクラッキングを介して変更することが可能であり、SWが自分のドメインからスクリプトを読み込むようにできます。
この例については、参照リンクを確認してください。
参考文献
Last updated