Ошибку в работе Cloudflare первым обнаружил специалист Google Project Zero Тевис Орманди (Tavis Ormandy). На прошлой неделе Орманди работал над сторонним проектом и случайно обратил внимание, что при обращении к Cloudflare сервис возвращает не только запрошенные данные, но и данные других ресурсов, в том числе токены аутентификации, API ключи, пароли и так далее. Сначала Орманди принялся искать ошибку в собственном коде и даже привлек к проблеме коллег из Project Zero. Но даже совместными усилиями эксперты не сразу поняли, с чем имеют дело.
«Те образцы, что мы обнаружили, были настолько плохи, что я отменил все планы на выходные и поехал в офис в воскресенье, — рассказывает эксперт. — Я проинформировал Cloudflare о том, над чем работаю. Я нашел приватные сообщения с популярных сайтов знакомств, сообщения хорошо известных чат-сервисов, данные сетевого менеджера паролей, кадры видео с сайтов для взрослых, данные о бронировании отелей. Речь шла о полных HTTPS-запросах, клиентских IP-адресах, куки, паролях, ключах, данных, обо всем».
Вскоре эксперты поняли, как воспроизвести проблему. Если HTML-страница, хостящаяся за Cloudflare, содержала определенную комбинацию тегов, в output прокси попадали страницы из неинициализированной области памяти. Орманди пишет, что механика работы проблемы напомнила ему известный баг Heartbleed, и он всеми силами старался не называть обнаруженную проблему Cloudbleed. Рабочая теория Орманди предполагала, что источником утечки выступает приложение ScrapeShield, которое было создано для парсинга обфусцированного HTML, но оказалось, что проблема была куда сложнее. Обнаружив нечто настолько странное, Орманди незамедлительно связался с представителями Cloudflare, и компания отреагировала очень оперативно.
Cloudflare have been leaking customer HTTPS sessions for months. Uber, 1Password, FitBit, OKCupid, etc. https://t.co/wjwE4M3Pbk
— Tavis Ormandy (@taviso) February 23, 2017
Вечером четверга, 23 февраля 2017 года, инженеры Cloudflare опубликовали подробный отчет о случившемся. Выяснилось, что ошибку провоцировал баг в коде HTML-парсера, а именно модуль, который компания использовала для чтения исходных кодов сайтов. Считанные данные затем передавались другим модулям, которые переписывали контент, в зависимости от настроек аккаунта пользователя (например, добавляли теги Google Analytics, конвертировали HTTP-ссылки в более надежный HTTPS). Если точнее, кто-то использовал в коде >= вместо ==. В итоге происходило переполнение буфера, и контент из памяти серверов Cloudflare попадал в пользовательские HTTP-запросы. Согласно данным Cloudflare, проблема проявлялась лишь в том случае, если для аккаунта были активированы опции Email Obfuscation, Server-Side Excludes и Automatic HTTPS Rewrites.
Как показало расследование, ошибка в коде нового парсера компании возникла еще 22 сентября 2016 года, а расследованием происходящего специалисты компании занялись 18 февраля 2017 года. Таким образом, проблема была актуальна на протяжении пяти месяцев.
По словам одного из руководителей Cloudflare Джона Грэма-Камминга (John Graham-Cumming), наибольшую силу проблема набрала в период 13-18 февраля, когда один из 3 300 000 HTTP-запросов к Cloudflare приводил к потенциальной утечке памяти (0,00003% запросов).
После того как Орманди связался с разработчиками Cloudflare, на купирование бага специалистам компании понадобилось всего 47 минут: они отключили Email Obfuscation для всех пользователей, а затем отключили и функцию Automatic HTTPS Rewrites. Шесть часов спустя разработчики обнаружили и злосчастную опечатку и связались с представителями крупных поисковых систем, так как часть утекших данных осела в их кеше.
К своему отчету об ошибке Орманди приложил ряд скриншотов, демонстрирующих последствия существования проблемы. В качестве примера исследователь приводит HTTP-запросы к Uber, OKCupid и Fitbit.
Однако услугами Cloudflare пользуются тысячи компаний и миллионы сайтов по всему миру. Так, на GitHub уже появился список из 4 287 625 доменов, которые могли стать жертвами данной бреши. Помимо всемирно известных сервисов, в этом списке оказались и популярные российские сайты avito.ru, diary.ru, 2ip.ru, 4pda.ru, rghost.ru, forbes.ru и другие.
Специалисты Google Project Zero и Cloudflare полагают, что, несмотря на всю серьезность бага, вряд ли им успели воспользоваться хакеры. «Не знаю, была ли эта проблема замечена и эксплуатировали ли ее, но я уверен, что другие боты собирали эти данные, что пользователи сохраняли или кешировали контент, и все они даже не понимают, что попало к ним в руки», — говорит Орманди.
С детальным отчетом о случившемся можно ознакомиться в блоге Cloudflare.