Статьи

Facebook не хватает X-Frame-Options — как я это исправил


В сентябре 2011 года я обнаружил уязвимость, позволяющую злоумышленнику
частично взять под контроль учетную запись жертвы в Facebook . Уязвимость позволила злоумышленнику, среди прочего, отправлять обновления статуса от имени пользователя и отправлять запросы на добавление в друзья в контролируемую злоумышленником учетную запись Facebook. Уязвимость была ответственно раскрыта в рамках программы
Facebook Security Bug Bounty и теперь исправлена.

подробности

http [s]: //www.facebook.com/plugins/serverfbml.php использовал только JavaScript для удаления фреймов и не использовалзаголовок X-Frame-Options . Можно было создатьатаку извлечения контента с восстановлением пользовательского интерфейса, чтобы заставить пользователя перетаскивать исходный HTML-код этой страницы на страницу злоумышленника. Это основывалось на способности Firefox отображать источник просмотра: страницы протокола в iframes И возможность выполнять действия перетаскивания из разных источников (таким образом, затрагивались только пользователи Firefox).

На указанной странице отображается  FBML,  указанный в параметре $ _GET . В этом случае <form> <fb: captcha> </ form>был использован в качестве примера полезной нагрузки FBML. В ответе сервера был объект Javascript Env с несколькими чувствительными пользовательскими значениями:

{
  user:100001652298988,
  locale:"en_US",
  method:"GET",
  start:(new Date()).getTime(),
  ps_limit:5,
  ps_ratio:4,
  svn_rev:441515,
  static_base:"https:\/\/s-static.ak.facebook.com\/",
  www_base:"http:\/\/www.facebook.com\/",
  rep_lag:2,
  post_form_id:"eecde0da0dc4bc800d385dde5dd37608",
  fb_dtsg:"AQAUh3Jx",
  lhsh:"0AQAQVvsl",
  error_uri:".....",
  retry_ajax_on_network_error:"1",
  ajaxpipe_enabled:"1",
  theater_ver:"2"
};

В приведенном выше источнике, кроме идентификатора пользователя (конфиденциальность!), Есть также два интересных значения: fb_dtsg и post_form_id . Эти значения сами по себе являются формой токена анти- CSRF, используемого в Facebook, и, зная их, злоумышленник может публиковать обновления статуса от имени вошедшего в систему пользователя. В Firefox можно было обмануть пользователя, чтобы выбрать и перетащить эти значения на контролируемую страницу злоумышленника. Таким образом, если какой-либо пользователь, прошедший проверку подлинности на Facebook, перешел по URL-адресу злоумышленника (например, по ссылке, которой поделился его друг) и сыграл в игру, злоумышленник получил доступ к HTML-источнику уязвимой страницы Facebook и получил идентификатор пользователя и токены CSRF. Имея это, он мог выполнять несколько запросов CSRF, используя тот факт, что браузер жертвы имел соответствующие куки FB.

демонстрация

В демонстрации, которую я использую, представлена ​​модифицированная версия технологии
перенаправления двойного перетаскивания пользовательского интерфейса, разработанная  Нафиезом Ахамедом (@skeptic_fx) . В качестве примера использования публикуется обновление статуса для пользователя-жертвы, а запрос на добавление в друзья отправляется другому пользователю (возможно, злоумышленником). Конечно, с этими токенами есть больше возможностей, таких как обмен и лайк по заданному URL, но я этого не исследовал.

Некоторые исправления происходят быстро, другие …

Предложенное исправление было следующим: Используйте
X-Frame-Options  на указанной странице. Уязвимость в Facebook была исправлена, протестирована и развернута до 14 октября 2011 года. Однако соответствующая ошибка Firefox № 605991 (
перетаскивание может использоваться для кражи контента между доменами ) подождала
2 года,  а исправление только что было развернуто в Firefox 14. Начиная с Firefox 14,
вы больше не можете перетаскивать контент между доменами . Так что — обновляйте свои Firefox и оставайтесь в безопасности!