Опубліковано 23 березня23 берез Адміністратор CloudflareЗа числами, Cloudflare давно є найпопулярнішою CDN на ринку. Він перевершує таких конкурентів, як Sucuri, Amazon CloudFront, Akamai та Fastly. У 2019 році через велику аварію Cloudflare більшість інтернету була недоступна більше 30 хвилин.Однією з найбільш використовуваних функцій Cloudflare є кешування. Кеш Cloudflare зберігає копії часто запитуваного контенту (наприклад, зображень, відео або веб-сторінок) у своїх дата-центрах, що знижує навантаження на сервер та покращує продуктивність веб-сайту ( https://developers.cloudflare.com/cache/](https://developers.caud/re) .Коли ваш пристрій надсилає запит на ресурс, який може бути кешований, Cloudflare отримує ресурс з локального сховища дата-центру, якщо він доступний. В іншому випадку він отримує ресурс з оригінального сервера, кешує його локально, а потім повертає. За промовчанням деякі розширення файлів автоматично кешуються, але власники сайтів також можуть настроїти свої правила кешування.Cloudflare має велику глобальну присутність, з сотнями дата-центрів у 330 містах більш ніж 120 країнах – це приблизно на 273% більше дата-центрів, ніж у Google. Наприклад, у східному регіоні США найближчий дата-центр до мене знаходиться менш ніж за 100 миль. Якщо ви живете в розвиненій країні, є висока ймовірність, що найближчий дата-центр до вас знаходиться менш ніж за 200 миль від вас.Кілька місяців тому у мене виникла ідея: якщо Cloudflare зберігає кешовані дані так близько до користувачів, чи можна використовувати це для атак деінонімізації на сайтах, які ми не контролюємо?Ви бачите, Cloudflare повертає інформацію про статус кеша запиту в HTTP-відповіді.cf-cache-statusможливо HIT/MISS, а cf-rayвключає код аеропорту найближчого аеропорту до дата-центру, який обробляє запит (у моєму випадку, IAD).Якщо нам вдасться змусити пристрій користувача зайти на сайт, що підтримується Cloudflare, і тим самим кешувати його в їхньому локальному дата-центрі, ми зможемо перерахувати всі дата-центри Cloudflare, щоб визначити, який з них кешував ресурс. Це дасть нам неймовірно точну оцінку розташування користувача.Cloudflare TeleportПеред тим, як я протестував цю теорію, мені потрібно було подолати одну серйозну перешкоду.Ви не можете надсилати запити HTTP потрібні вам дата-центри Cloudflare. З метою безпеки (імовірно для захисту від DDoS-атак) всі IP-діапазони суворо прописані. Тому всі TCP-з'єднання, приєднані до їхньої мережі, завжди обробляються найближчим доступним дата-центром до вас; ви не можете попросити дата-центр в Канаді, щоб обробити ваш запит, якщо ви живете в США.Однак після деяких досліджень я знайшов пост на форумі від учасника спільноти, який показав мені, як це зробити. Автор поділився помилкою, яку він виявив, що дозволяє надсилати запити до конкретних датів-центрів Cloudflare за допомогою Cloudflare Workers .Я все ще не на 100% впевнений у деталях цієї помилки, але використовуючи IP-діапазон, який використовується всередині Cloudflare WARP (VPN-клієнт Cloudflare), ми могли б попросити певні дата-центри обробити HTTP-запити. Зазвичай цей IP-діапазон блокує вхідні підключення із зовнішніх IP-адрес, але запити, надіслані за допомогою Workers, могли обійти це, оскільки з'єднання виходило зсередини мережі Cloudflare.Я провів кілька хвилин, читаючи їхній пост, і швидко створив інструмент для цього: Cloudflare Teleport ( https://github.com/hackermondev/cf-teleport ). IP-діапазони відповідають різним дата-центрам ( https://github.com/hackermondev/cf-teleport/blob/main/scripts/data/colos.json ).Cloudflare Teleport - це проксі, що працює на основі Cloudflare Workers, який перенаправляє HTTP-запити в конкретні дата-центри. Наприклад, https://cfteleport.xyz/?proxy=https://cloudflare.com/cdn-cgi/trace&colo=SEA буде проксирувати HTTP GET запит до https://cloudflare.com/cdn-cgi/trace спеціально в дата-центр у Сіетлі (SEA).Cloudflare зрештою повністю виправив цю помилку через кілька місяців, що зробило цей інструмент застарілим, але пізніше. Протягом більшої частини мого початкового дослідження я використав цей інструмент.Перша атака дезанонімізаціїЯк тільки інструмент Cloudflare Teleport був завершений, я зміг підтвердити свою теорію. Я написав простий скрипт, який відправляє HTTP GET запит на вказаний URL та перераховує всі дата-центри, в яких містився кеш ресурсу, а також його вік.Для першого тесту я використовував фавікон Namecheap ( https://www.namecheap.com/favicon.ico ). Цей ресурс має включене кешування Cloudflare, це просте статичне зображення їхнього логотипу. (Це був найшвидший сайт, який я зміг знайти і який не мав суворого захисту від ботів):Бум, це спрацювало. Namecheap налаштував вік свого кешу вкрай низьким (5 хвилин), але я зміг побачити кожен дата-центр, який кешував фавікон їхнього сайту за останні 5 хвилин. Оскільки кожен раз, коли ви завантажуєте свій сайт, ваш браузер автоматично завантажує цей фавікон, це означає, що користувач з кожного з цих місць відвідав сайт Namecheap.com протягом останніх 5 хвилин, причому останній візит був з Токіо, Японія.Це був простий тест, і тут майже не було впливу, але з його допомогою я підтвердив свою теорію. Це довело концепцію використання кешування Cloudflare для дезанонімізації атак.Застосування у реальному світі: SignalSignal, відкрита зашифрована месенджерська служба, широко використовується журналістами та активістами завдяки своїм функціям конфіденційності. Усередині додаток використовує дві CDN для доставки контенту: cdn.signal.org(працює на CloudFront) для аватарів профілів та cdn2.signal.org(працює на Cloudflare) для вкладень повідомлень.1-Click AttackКоли користувач надсилає вкладення (наприклад, зображення) у Signal, воно завантажується на cdn2.signal.org. Як тільки одержувач відкриває розмову, пристрій автоматично завантажує вкладення. Оскільки кешування Cloudflare включене для цих URL, зловмисник може використовувати метод геолокації кешу, щоб визначити місцезнаходження одержувача.Шлях https://cdn2.signal.org/attachments/*налаштований для кешування відповідей за допомогою Cloudflare. Це означає, що як тільки пристрій користувача автоматично завантажує вкладення, зловмисник може провести атаку геолокації кешу, щоб з'ясувати, якого локального дата-центру вони близькі — аналогічно тому, як правоохоронні органи відстежують мобільні пристрої через стільникові вишки.Щоб протестувати це, я швидко модифікував настільний додаток Signal, щоб прибрати SSL-пінінг, і налаштував Burp для перехоплення та перегляду HTTP-запитів/відповідей, що надсилаються через програму.Кроки2. Заблокуйте HTTP GET запити до cdn2.signal.org/attachments/* із Signal за допомогою Burp.Це гарантує, що програма не завантажуватиме вкладення, завантажені з нашого боку (зловмисника), оскільки це закешує їх у нашому локальному дата-центрі та зіпсує результати. Найкращий спосіб, який я знайшов для цього за допомогою Burp — налаштувати правила перехоплення для вкладень, потім залишити перехоплення запитів увімкненим і відхилити всі запити.3. AttackПісля того, як ціль відкриє розмову (перевірте це за допомогою повідомлень про прочитання), їх пристрій повинен завантажити вкладення, що, у свою чергу, викликає кешування файлу Cloudflare у локальному дата-центрі.Я провів цю атаку на собі, використав скрипт, про який згадував раніше, з URL вкладення та виявив локальні дата-центри, що кешували це вкладення.У моєму випадку я перебуваю в Нью-Йорку, і один з найближчих дата-центрів до мене знаходиться в Норці, Нью-Джерсі (EWR), який приблизно за 150 миль від моїх фактичних координат.За допомогою вкладення, що виглядає нешкідливо, зловмисник може дезанонімізувати користувачів та визначити їхнє розташування в межах приблизного радіусу.0-clickОсь де починає відбуватися цікаве. Хоча метод з одним кліком працює, він вимагає від користувача відкриття розмови Signal. Чи можливо провести цю атаку без будь-якої взаємодії з боку користувача? Вводимо push-сповіщення.Push-сповіщенняУ мобільної програми Signal є 3 налаштування push-повідомлень.Push-сповіщення спрацьовують, якщо користувач отримує повідомлення, перебуваючи неактивно у програмі Signal. За замовчуванням мобільний додаток включає автора та повідомлення, коли відправляє push-повідомлення на ваш пристрій.Зображення, показане праворуч від повідомлення, — це вкладення, надіслане із повідомленням із Signal.Якщо ціль має увімкнені push-повідомлення (що є налаштуванням за замовчуванням), їм навіть не потрібно відкривати розмову в Signal, щоб їх пристрій завантажив вкладення. Як тільки push-повідомлення відправляється на їхній пристрій, зображення автоматично завантажується з CDN Signal, що призводить до кешування відповіді в локальному дата-центрі.Зловмисник може провести цю атаку на дезанонімізацію у будь-який час та отримати поточне місцезнаходження користувача без будь-якої взаємодії.Застосування в реальному світі: DiscordПід час мого дослідження я знайшов ще одну програму, вразливу до цього типу атаки - Discord. Discord — це безкоштовна програма, яка дозволяє користувачам спілкуватися один з одним через текст, голос та відео. Хоча програма орієнтована на геймерів, останнім часом Discord ставав об'єктом новин через сприяння витокам інформації від уряду, і Discord є майданчиком для значної частки кіберзлочинів в інтернеті.Аспект з 1-click дуже простий і досить схожий на Signal; я б сказав, що його вплив навіть ширший з Discord. Discord дозволяє користувачам з підпискою Nitro (їх платний сервіс за $9.99 на місяць) використовувати емозі користувача в різних місцях: повідомленнях, статусі користувачів, каналах і т. д. Ці емодзі завантажуються з CDN Discord і налаштовані на кешування в Cloudflare. Зловмисник може використовувати ту ж атаку на дезанонімізацію, що і з Signal, щоб дезанонімізувати користувачів.Так що замість того, щоб відправляти вкладення в каналі Discord, зловмисник може відобразити емозі користувача у своєму статусі і просто дочекатися, поки мета відкриє їх профіль, щоб провести атаку на дезанонімізацію.Я розкрив весь звіт HackerOne, який відправив Discord, в якому містяться конкретні деталі, але я хочу зосередитися на аспекті з нульовим кліком тут.У Discord мобільні push-сповіщення відправляються для різних подій (не тільки для отриманих повідомлень, як Signal). Наприклад, надсилання запиту на додавання в друзі користувачу Discord викликає push-повідомлення на мобільному пристрої користувача.Цікаво, що навіть якщо користувач активно знаходиться в Discord, повідомлення про запити на додавання в друзі завжди відправляються на мобільний пристрій користувача.Як би атака на дезанонімізацію могла бути використана з повідомленням про запит на додавання до друзів? Давайте подивимося на повідомлення.Коли ви отримуєте запит на додавання до друзів, і Discord відправляє повідомлення на ваш пристрій, воно включає URL аватара користувача, який буде показаний з повідомленням. Ваш телефон завантажує URL аватара (без будь-якої взаємодії з користувачем) та відображає його поряд із повідомленням.У Discord налаштовано кешування Cloudflare на шляху CDN для URL аватарів, що означає, що ми можемо просто повторити ту саму атаку на кешування, згадану раніше.У Discord формат URL аватара, який використовується в push-повідомленнях, виглядає так: https://cdn.discordapp.com/avatars/{user_id}/{avatar_hash}. Формат URL аватара, який використовується на сайті для відображення аватарів користувачів, трохи відрізняється (він завжди містить розширення зображення): https://cdn.discordapp.com/avatars/{user_id}/{avatar_hash}.png.Обидва посилання ведуть до того самого зображення, але оскільки зображення, що відображаються в додатку, мають інший шлях, вони кешуються окремо. Це гарантує, що наші результати не забруднені, і дозволяє нам переконатися, що ми знаходимо дата-центр пристрою, який завантажив аватар через push-сповіщення, а не просто профіль Discord.Ось так у нас є кроки для версії цієї атаки з 0-click для Discord:Змініть власний аватар. Це випадково змінює ваш хеш аватара і забезпечує те, що URL вашого аватара ще не був завантажений ніким, що збільшує точність атаки.Надішліть запит на додавання в друзі цілі. Хоча є кілька способів викликати push-повідомлення в Discord, я вибираю запити на додавання в друзі, тому що вони завжди відправляються, незалежно від того, чи активний користувач Discord. Крім того, для цього не потрібна наявність спільного сервера з метою, що означає, що ви можете практично зробити це з будь-ким у Discord.Використовуйте інструмент Cloudflare Teleport для URL аватара користувача та знайдіть усі локальні дата-центри, які кешували аватар.GeoGuesserЯ знайомий з API Discord і зрозумів, що можу автоматизувати кожен крок атаки з нульовим кліком у Discord, тому саме це я й зробив.Представляю GeoGuesser. Це приватний бот Discord з функцією, яка приймає ім'я користувача, виконує атаку, використовуючи згадані раніше кроки, та повертає результати через Discord.Під час виклику він використовує облікові дані мого облікового запису для доступу до API користувача Discord, змінює аватар користувача на випадково згенероване зображення (для рандомізації хешу) та надсилає запит на дружбу вказаному імені користувача. Нарешті, він використовує приватний API на основі інтерфейсу командного рядка Teleport від Cloudflare для виконання тієї ж атаки перерахування кешу та відображає результати безпосередньо в Discord, і все це менш ніж за 30 секунд.Щоб проілюструвати масштаб цієї атаки, одним із перших користувачів, на яких я її випробував, був Станіслав Вишневський, технічний директор Discord.Бот відправляє запит на додавання в друзі Стен, потім чекає пару секунд, щоб переконатися, що він отримує push-повідомлення.Він знаходить 2 локальні дата-центри Cloudflare, які кешували аватар. Це може означати, що він має кілька пристроїв, пов'язаних з його обліковим записом Discord, які отримали push-повідомлення, або його пристрій завантажив аватар двічі, і запити були розподілені між різними дата-центрами.GeoGuesser, що працює на основі Google Maps API, генерує можливе розташування користувача. Він знаходить середню точку між 2 дата-центрами та малює 2 кола, які позначають його радіуси.Штаб-квартира Discord розташована в Сан-Франциско, штат Каліфорнія (що знаходиться у зовнішньому колі), тому ця карта влучна. Швидше за все, Стен знаходиться десь на межі внутрішнього кола, що становить близько 300 миль.Весь цей процес зайняв менше ніж хвилину. Я впевнений, що Стен побачив сповіщення на своєму телефоні, не замислився і просто проігнорував його. Це була лише проста атака, але ця атака, якщо її відкалібрувати, може бути використана для відстеження та моніторингу розташування Стену.Атака подібного роду може бути запущена на будь-якого користувача Discord і її майже неможливо виявити.Звіт про помилкуЯ відповідально повідомив постраждалим сторонам про свою дослідницьку роботу, сподіваючись, що буде вжито заходів для захисту або попередження користувачів про цей тип атаки на анонімність, але залишився розчарований.SignalSignal миттєво відхилив мій звіт, сказавши, що це не їхня відповідальність і що користувачам доведеться самим приховувати свою особистість: "Signal ніколи не намагався повністю відтворити набір анонімних функцій на мережному рівні, які можуть надати такі проекти як Wireguard, Tor та інше програмне забезпечення з відкритим вихідним кодом для використання VPN."Я не згоден із цим. Signal позиціонує себе як комунікаційна платформа, орієнтована на захист конфіденційності. Хоча він не стверджує, що надає анонімність на мережевому рівні, як Tor, користувачі довіряють Signal, що він мінімізує ризики для порушення конфіденційності.Вразливість демонструє, що платформа ненавмисно розкриває інформацію, яка може звузити розташування користувача до кількох сотень миль. Цей витік суперечить очікуванням багатьох користувачів, стурбованих конфіденційністю, які покладаються на Signal не тільки для забезпечення наскрізного шифрування.Telegram, інший додаток, орієнтований на конфіденційність, є абсолютно стійким до цієї атаки, оскільки (1) вони використовують власний протокол, розроблений всередині компанії, який не залежить від HTTP, і (2) не покладаються на хмарних провайдерів, таких як Cloudflare, для кешування.DiscordСпочатку команда безпеки Discord пообіцяла вивчити це питання та внести зміни для захисту своїх користувачів від цього типу атак, але зрештою вони також змінили свою позицію, заявивши, що це проблема Cloudflare, яка стосується й інших споживачів.CloudflareCloudflare зрештою завершив виправлення вразливості, використовуваної Cloudflare Teleport для обходу дата-центрів. Вразливість була повідомлена в їх програму HackerOne рік тому іншим дослідником, але тоді вони не зробили жодних дій, оскільки не бачили жодного впливу від обходу дата-центрів доти, доки я не поділився своєю дослідницькою роботою.Cloudflare повторно відкрив старий звіт, вивчив його та виплатив винагороду у розмірі 200 доларів за мій звіт та оригінальний.Хоча це крок у правильному напрямку, насправді це не вирішує основну проблему. Кожна атака, описана в цьому звіті, була повторно використана останні 24 години, незважаючи на те, що Cloudflare виправив цю вразливість тиждень тому. Cloudflare усунув уразливість усередині своєї мережі, яка сприяла обходу дата-центрів, але це не єдиний спосіб легко оминати дата-центри по всьому світу.Через 24 години після їх виправлення я перепрограмував Cloudflare Teleport для використання VPN. Багато VPN пропонують кілька локацій, до яких користувачі можуть підключатися, що відправляє їх трафік через сервери в різних частинах світу, і ці сервери відповідають різним дата-центрам Cloudflare по всьому світу.Я вибрав провайдера VPN з більш ніж 3000 серверами, розташованими у різних місцях у 31 країні по всьому світу. Використовуючи цей новий метод, знову можу охопити близько 54% всіх дата-центрів Cloudflare. Хоча це не виглядає як велика кількість, це покриває більшість місць у світі зі значним населенням.В остаточній заяві Cloudflare з цього питання йдеться, що вони не вважають атаку на анонімність вразливістю у своїх системах і що вони, як споживачі, несуть відповідальність за вимкнення кешування ресурсів, які вони хочуть захистити.Тут явно є проблема, оскільки Cloudflare стверджує, що споживачі несуть відповідальність за захист себе від таких атак, тоді як споживачі (як Discord) покладають провину на Cloudflare.Як захистити себе:Потенціал для експлуатації цієї атаки на анонімність є значним, особливо для користувачів у вразливих ситуаціях, таких як журналісти, активісти та особи, які дбають про конфіденційність. Атака використовує основні проектні рішення в системах кешування та push-сповіщень, демонструючи, як інфраструктура, призначена для покращення продуктивності, може бути використана для інвазивного відстеження.Хоча Cloudflare виправив вразливість у Teleport, а деякі програми, такі як Discord та Signal, могли впровадити заходи пом'якшення після мого розкриття інформації, основні ризики залишаються. Будь-яка програма, яка покладається на CDN для доставки контенту та кешування, все ще може бути вразливою, якщо не вжити відповідних запобіжних заходів.Заключні думки:Ця атака підкреслює, наскільки складною та взаємопов'язаною стала цифрова екосистема. Хоча CDN-мережі покращують продуктивність і масштабованість, вони також ненавмисно створюють ризики, які можна використовувати по-новому. Підвищуючи обізнаність та пропагуючи передовий досвід, ми можемо разом мінімізувати потенціал зловживань.Для користувачів, які виконують конфіденційні завдання, або тих, хто стурбований своєю конфіденційністю, головне — залишатися поінформованими та пильними. Хоча жодна система не є повністю захищеною від помилок, вжиття заходів для обмеження доступу може суттєво змінити ситуацію.
Для публікації повідомлень створіть обліковий запис або авторизуйтесь