Security Week 37: Facebook, Twitter и надувные баги
Околоайтишные маркетологи нынче любят обсуждать, что абсолютно любое сообщение о новом продукте, технологии или событии воспринимается лучше, если в нем присутствует блокчейн. Или машинообучаемые алгоритмы. Аналогичным образом, любое сообщение в сфере информационной безопасности становится более резонансным, если в нем упоминается социальная сеть Facebook. Информационная реальность, подогретая скандальчиком с приватностью данных пользователей, такова, что если в одном приложении разместить слова «фейсбук» и «уязвимость», они вступают в реакцию и вызывают неконтролируемый рост кликов.
Что ж, отдадимся же на волю этой непонятной химии и поговорим, что произошло в Фейсбуке на прошлой неделе. А заодно вспомним, что случилось на прошлой неделе у Твиттера. И в том случае, и в другом имели место микроскопические баги, самостоятельно обнаруженные специалистами компании, успешно закрытые с максимальным количеством предосторожностей, общественность была уведомлена. Но «проблему» Фейсбука обсуждает весь фейсбук, баг в Твиттере же почти никто не заметил. Как так? Сейчас разберемся.
Что на самом деле произошло в Фейсбуке?
Новость. Подробный отчет соцсети о событии.
А вот что. У Фейсбука есть (точнее, была, сейчас не работает, см. скриншот в начале поста) функция View As. Доступная всем пользователям, она позволяла посмотреть свой профиль так, как если бы на него глядел другой человек. Из-за многочисленных настроек приватности это достаточно полезная фича: она позволяет понять, что посторонние люди видят на вашей странице, а что нет.
Важный момент: страницу можно посмотреть «глазами» какого-то рандомного посетителя, а можно показать, как она выглядит с точки зрения конкретного пользователя, с именем и фамилией. Именно такая прецизионность и подвела разработчиков под монастырь.
По словам Педро Канауати, вице-президента Facebook по «инжинирингу, безопасности и приватности», речь идет о трех разных уязвимостях. Во-первых, был баг в самой фиче View As. По идее, она должна переключать контекст фейсбука на другого пользователя в режиме «только чтение», в смысле «только просмотр страницы пользователя, под которым ты залогинен». На самом деле в режиме View As генерировалось и поле для публикации сообщения. Во-вторых, это поле не работало (корректно) во всех случаях, кроме одного: когда вы хотите поздравить человека с днем рождения и постите видео. В-третьих, при постинге видеоролика код для загрузки этого самого видео генерировал токен, который также мог быть использован как токен доступа из мобильного приложения.
То есть сценарий со стороны атакующего получается примерно следующий. Вы создаете профиль или меняете настройки уже существующего так, чтобы у вас сегодня был день рождения (уииии!). Пользуясь функцией View As, открываете свой профиль от имени другого пользователя. При демонстрации профиля от имени другого пользователя ему (этому другому пользователю) предлагается поздравить вас с днем рождения и загрузить милый видеоролик. При загрузке видеоролика генерируется токен. Вы берете этот токен из кода страницы и в мобильном приложении заходите от имени и с правами другого пользователя.
Дальше начинаются немножко домыслы. Например, надо ли быть друзьями с человеком, от имени которого вы хотите «посмотреть» свою страницу? Судя по описаниям (ныне неработающей) фичи на сторонних сайтах — надо. Теперь вспомните, как давно к вам в друзья просились не известные вам, но крайне настойчивые люди? Получив доступ к токену одного пользователя, можно украсть ключи доступа к аккаунту кого-то из его/ее друзей. И так далее, теоретически вплоть до масштабов, ограниченных теорией шести рукопожатий. То есть практически неограниченных масштабов.
Круто, да? Интересно, что сообщение Facebook, опубликованное в пятницу вечером (по Москве), было предвосхищено жалобами пользователей, что их разлогинили как из самого Фейсбука, так и из других сервисов, для доступа к которым использовалась учетная запись соцсети. Это были те самые меры предосторожности, которые в Facebook применили к пострадавшим пользователям.
Или предположительно пострадавшим? Надо отдать должное специалистам Facebook — они рассказали об обнаруженных уязвимостях максимально подробно и оперативно. 16 сентября, по их словам, они заметили подозрительную активность, 25-го стало понятно, что к чему, 28 сентября информация была обнародована — сразу после «разлогинивания» пострадавших (что сделало любые украденные токены бесполезными). А вот как именно пострадали эти самые пострадавшие — тут Facebook высказался не очень конкретно. Возможно, они пока и сами точно не знают.
Известно, что уязвимость появилась в коде сервиса в июле 2017 года. На прошлой неделе Facebook принудительно разлогинил 90 миллионов пользователей. Из них 40 миллионов — это те, в отношении которых применялась фича View As, то есть кто-то от их имени смотрел на свою страницу, не обязательно с криминальными намерениями. Еще 50 миллионов — это те, кого уязвимость «затронула» (affected). Так как «затронула»-то? В расшифровке пресс-брифинга есть больше информации: про 50 миллионов пользователей Фейсбуку известно, что их токены были извлечены. То есть (спекуляции!) какие-то люди использовали фичу View As в свой день рождения, а потом (возможно!) заходили с того же IP в другой аккаунт. А скорее всего, та «подозрительная активность» от 16 сентября, которую упоминали представители соцсети, — это была попытка массовой автоматизированной эксплуатации бага, которая была пресечена чуть больше чем за неделю.
В целом Facebook очень неплохо отреагировал на проблему. Поделился (как мог) подробной информацией, принял меры в отношении пострадавших (реальных или потенциальных). 50 (или 90) миллионов человек — в масштабе Facebook это немного. Впрочем, учитывая беспокойство по поводу приватности отдаваемых соцсетям личных данных, понятно и повышенное внимание к этому инциденту. Позитивных моментов два. Во-первых, не были украдены пароли, а если какие-то инструменты неправомерного доступа к чужим аккаунтам и имелись, то они были уничтожены «ковровым разлогиниванием». Во-вторых, даже если вы оказались в числе предположительно пострадавших и даже если к вашим данным реально кто-то получал доступ, в их руках оказалось далеко не все, что о вас знает Фейсбук. Потому что реальными знаниями о пользователях Фейсбук даже с самими пользователями не делится.
А Твиттеру на прошлой неделе повезло.
А что в Твиттере произошло?
Новость. Технический отчет соцсети.
В некотором смысле баг, обнаруженный в Twitter, похож на то, что нашли в Фейсбуке. Дыра была найдена в API, позволяющем компаниям общаться с клиентами, — в общем, это интерфейс для массовой рассылки или приема личных сообщений. Если вы общались с кем-то, используя данный API, то при определенном стечении обстоятельств ваша переписка могла оказаться в руках третьей стороны.
Окей, даже в таком виде это не звучит устрашающе. Практика еще скучнее. Во-первых, API могут использовать только зарегистрированные партнеры Twitter. Во-вторых, чтобы баг сработал и личные сообщения пошли не туда, оба партнера должны (а) сидеть на одном IP, (б) работать с API используя URL, полностью совпадающий после слэша (www.xxx.com/twitter_msg и www.yyy.com/twitter_msg — это совпадение), (в) неудачно обратиться к серверам Twitter в один отрезок времени, ограниченный шестью минутами.
Вот когда все это совпадает, карета превращается в тыкву плохо настроенный кэш Twitter начинает плеваться сообщениями куда угодно, точнее — в строго определенном направлении уникального совпадения подводных камней. В общем, неудивительно, что баг в Facebook вызвал куда больше резонанса, чем дыра в Твиттере, хотя характеристики обоих багов довольно похожие. И там, и там, видимо, имел место недосмотр при обновлении кода в сложной инфраструктуре. Вполне вероятно, что кто-то срезал пару углов при запиливании новой фичи в продакшн: это часто происходит, если над тобой кругами летает менеджер со словами «быстро запилите мне видосы на день рождения!».
Поражает масштабность ущерба. Взять любую компанию помельче, и уязвимость на 5% аудитории никто бы и не заметил. А тут речь сразу идет о десятках миллионов людей. Что по этому поводу делать? В блоге «Лаборатории Касперского» разумно рекомендуют не делать ничего. В долгосрочной перспективе рекомендую следующее упражнение. Что бы вы ни отправляли в Интернет, даже в самую приватную-переприватную службу, представьте на мгновение, что вы это же сообщение расклеиваете по всем столбам вашего города. Если сообщение в таком контексте уже не кажется безобидным, может быть, и не стоит его отправлять.
Disclaimer: Мнения, изложенные в этом дайджесте, могут не всегда совпадать с официальной позицией «Лаборатории Касперского». Дорогая редакция вообще рекомендует относиться к любым мнениям со здоровым скептицизмом.