Pull to refresh

MakeMeLaughNow — анализ червя нового поколения в Facebook (перевод)

Information Security *
Translation
Original author: KRZYSZTOF KOTOWICZ
В недавнем топике высказали пожелание, что было бы хорошо, если бы кто-то перевел. Я посмотрел текст — вроде не так много. Поэтому, кому интересно, смотрим…


Новое вредоносное приложение-червь в Facebook выпущено на волю.

Оно избегает механизма «песочницы» в Фейсбук и активируется ДО ТОГО, как показана форма авторизации — всего лишь посетив страницу приложения, Вы начинаете рассылать сообщение своим друзьям и обновлять свой статус.
Как сказано в новости на niebezpiecznik.pl, для распространения оно использует мобильный сайт Facebook (touch.facebook.com). Я быстренько проанализировал — давайте посмотрим, что конкретно находится в коде приложения.

Дисклеймер: Не делайте этого дома — я профессиональный каскадер и к тому же люблю жить опасно. Не производите этот анализ на своем стандартном аккаунте Фейсбука, используйте виртуальную машину на случай, если там внедрен како-нибудь эксплойт и так далее. Как только я выяснил, что в это вовлечен сайт touch.facebook.com я добавил:
127.0.0.1 touch.facebook.com
в /etc/hosts (это перенаправляет на мой компьютер все запросы на touch.facebook.com), но, пожалуйста, будьте осторожны. Вас предупредили.

Быстренько оглядимся



Домашняя страница приложения выглядит так:

image

Все, что вы можете видеть — это несколько реклам. Но под этим всем происходит много чего. Давайте посмотрим на сетевую панель Firebug.
image

Приложение, даже перед запросом у вас любых разрешений, уже посылает запросы на touch.facebook.com, возможно рассылая сообщения и производя другие действия от вашего имени. Эти запросы помечены на скриншоте красным (я заблокировал мобильный сайт фейсбука). После этого загружается реклама из be2.pl. Так что приложение совершенно точно вредоносное.

Достать коротышку код



Сам по себе код и HTML находятся в apps.facebook.com/fbml/fbjs_ajax_proxy.php?__a=1

Код «запесочен» в JSON файл и выглядит следующим образом:image

После загрузки JSON файла на локальный диск и последующего извлечения (я использовал PHP & Spidermonkey для извлечения и Eclipse для форматирования) мы получим конечный код приложения (см. step2_2.js).

Песочница



Все приложения Фейсбука "запесочены" для того, чтобы запретить им ссылаться на глобальный объект window (так что они не могут изменять страницу Фейсбука, перенаправлять, посылать спрятанные формы и так далее). Для этого конкретного анализа необходимо отметить следующие важные вещи:

  • JS код и объекты находятся в префиксном именном пространстве (aBIGNUMBER_variable_name)
  • HTML объекты имеют ID с использованием именного пространства ( div id="appBIGNUMBER_name" ) (див должен быть заключен в треугольные скобки, но с ними Хаброредактр нещадно корежит, убрал — прим. перев.)
  • $FBJS использован для предотвращения ссылки приложения на global window object. Для наших целей вы можете предполагать, что
    $FBJS.idx(a) === a
    $FBJS.ref(this) === this
  • Для удоства, я заменил BIGNUMBER на букву 'x'.


Весь код, использованный в этом посте хостится на github.com — посмотрите, это в самом деле интересно.

Анализ



Метод «помрачнения сознания»


После инициализации приложение стартует с помощью следующего объявления:

ax_domethod = ax_findvalues.firefunc(ax_document.getElementById('help_container').getFirstChild().getTitle());

Таким образом, приложение получает заголовок одного из своих DOM элементов и передает его какой-то функции. Что в заголовке? Посмотрев на код страницы (app.html) мы увидим, что выглядит он довольно странно:
<div id="app100124540047022_m"
class="m"
fbcontext="6ff9e32a4c8c"
title="choy:ketmdslqxb.ujpzgvnra/fiw_?="/>


Выглядит как будто заголовок является чем-то типа ключа, который может быть использован для дешифровки спрятанных переменных приложения. И мы правы. На самом деле, choy:ketmdslqxb.ujpzgvnra/fiw_?= является словарем — ax_create.help() функция подбирает символы из этого словаря для формирования URLов, имен полей и так далее. Смещения символов определены в слегка запутанной переменной ax_meth.

Выцарапывание данных


Ок, приложение запутанно и использует DOM объект для дешифровки своих переменных. Но что оно делает?
Давайте посмотрим на ax_findvalues:
var ax_findvalues = {
a : ((new ax_RegExp('st_.or._i.\\\x22 .al.e=\\\x22(.*?)\\\x22', ''))),
// <form action="http://www.facebook.com/wallpost.php" post_form_id value
b : ((new ax_RegExp('b_d.s.\\\x22 v..ue=\\\x22(.*?)\\\x22', ''))),
// value = type="hidden" id="fb_dtsg" name="fb_dtsg"
c : ((new ax_RegExp('p.o..le\\.p.p\\?i.=(\\d+)\\\x22', ''))),
// href="http://www.facebook.com/profile.php?id=xxx" your profile ID
d : ((new ax_RegExp('na.e=\\\x22i.s\\[]\\\x22 v.l.e=\\\x22(.*?)\\\x22', 'gi'))),
// name=ids[] value= -- your friend ids
//...


Эта переменная содержит весьма интересные регулярные выражения — они используются для извлечения ID ваших друзей, ваш собственный ID и некоторых уникальных аутентификаторов из HTML кода внедренного Фейсбуком в приложение. Но приложение не может ничего поделать с этими данными, так как мы защищены «запесочиванием», так ведь? Ну, не совсем.

Взломан прикосновением


Взломан прикосновением — вольный перевод игры слов «Exploited by touching», в буквальном смысле обозначающий, что был использван эксплойт в мобильном сайте touch.facebook.com. — (прим. перев.)


Посмотрев еще глубже в код, мы можем увидеть, что замороченные данные на самом деле:
m=http://touch.facebook.com/message_send.php
ftarg=fra
su=http://touch.facebook.com/submit_status.php (status update)
pid=post_form_id
lp=http://touch.facebook.com/reqs.php?id=
fhome=http://touch.facebook.com/home.php
fbd=fb_dtsg
hc=fb_dtsg


Так что, скорее всего, приложение контактирует touch.facebook.com для того, что посылать сообщения и обновлять статусы. Опять, мы правы. Сам процесс:
  • ax_findvalues.firefunc() извлекает ID ваших френдов и другие данные в ax_sheep, ax_params variables (line 264)
  • Создается новая форма и iframe
  • ax_methodaction (line 183) заполняет форму на touch.facebook.com со следующим сообщением некоторым (максимум 20) друзьям:
    i thought of you…

    im using up my fb ad credits to send u a gift so HERE = http: //apps.facebook.com/makemelaughnow/
  • Если у вас больше 500 или меньше 2, то тогда обновление статуса: «only go here if you are my TRUE friend http: //apps.facebook.com/makemelaughnow/»(ссылки покорежил, чтобы не дай Боже никто не кликнул. Хабраредактор если отключает создание ссылок, то и отключает автоматические переносы — прим. перев.).
  • Вы добавляете себе это приложение (line 297)
  • Отображается реклама и приложение подчищает за собой свои объекты.


Заключение



Что мы можем здесь видеть, так это приложение, предположительно использующее уязвимость в Фейсбуке, когда мобильный сайт использует ту же самую аутентификацию что и нормальный сайт, но не защищен механизмом «запесочивания». Таким образом, приложение, вместо того, чтобы запрашивать разрешения на обновление вашего статуса, тихо получает сессию данных от DOM и посылает запросы через touch.facebook.com, избегая защиты «песочницей» и быстро распространяясь — очень похоже на уязвимость CSRF / session hijacking. Совершенно ясно, что используется ошибка находящаяся на сайте Фейсбука. Урок — не забывайте о своих мобильных сайтах.

Оригинал тут.

UPD.: как подсказали в комментариях, парсер корежит ссылки немного, поэтому, чтобы пройти по ссылкам, посмотрите, куда они ведут и просто поправьте их.

P.S. Если заметите какие-то неточности в переводе — дайте знать, русским программерским лексиконом владею не в совершенстве.
Tags:
Hubs:
Total votes 67: ↑62 and ↓5 +57
Views 858
Comments Comments 15