Червь, который изменил Интернет

- КиТ :: Будь в СЕТИ!

Сэми Камка, главный герой истории, не хотел быть «героем» для каждого, он даже не собирался заводить новых друзей

Но благодаря нескольким строчкам умного кода он за сутки стал «героем» и «другом» для более чем миллиона людей. Все произошло около полуночи 4 октября 2005 года в солнечном городе Лос-Анджелес. Тогда 19-летний хакер Сэми Камка выпустил в сеть нечто, более известное теперь как “червь Samy”. Это был первый самый быстрый и самораспространяющийся вирус, который навсегда изменил мир веб-безопасности.

Оставивший школу в 16 лет и основавший стартап по разработке программного обеспечения под названием Fonality в свои 17-лет, Камка объяснил свой поступок довольно просто:

Я всего лишь хотел произвести впечатление на своих друзей-технарей и ничего больше.

Все началось за неделю до запуска червя. В то время MySpace дал пользователям большую свободу в настройке их профилей, позволив использование HTML-кода, который привел к красочному и часто болезненному просмотру профилей. Однако не все на MySpace можно было настроить. У пользователей была возможность загружать не более 12 фотографий. Многих волновал вопрос, как обойти это ограничение. И вот Камка стал исследовать MySpace, чтобы найти способ обмануть сайт и сделать то, что не удавалось остальным пользователям. Вскоре он стал первым, кто смог загрузить 13 фотографий в свой профиль.

У пользователей также был узкий выбор в графе «отношения». В выпадающем меню содержались стандартные варианты: женат, одинок, в отношениях и т.п. Но Сэми, у которого в этот момент были отношения, хотел иметь возможность выделиться и указать особый статус «в разгаре отношений». И спустя какое то время, перебрав n строк кода, он смог реализовать свою оригинальную задумку. Как сказал Сэми:

Едва только сделав это, я понял, что теперь смогу сделать на своей странице практически все.

Целую неделю Камка работал над сценарием, который был бы невидимым для других пользователей и заставил бы всех, кто посетил его профиль, добавить его в друзья. Сценарий также прикрепил бы строку к профилю «вынужденного» друга под категорией «мои герои: но самый главный мой герой — Сэми». Но после этого он понял, что таким образом не удастся собрать много друзей, если ориентироваться исключительно на тех, кто посетил его страницу. Поэтому изобретательный юноша дописал в скрипте возможность самокопирования на страничку его посетителей. Именно в этот ключевой момент он и создал самораспространяющегося червя. Со слов Сэми:Я полагал, что через месяц у меня может быть порядка 100 или 200 друзей. Некоторые из них будут жаловаться, но я просто удалю их и проблем не будет.

Проснувшись следующим утром он обнаружил более 200 запросов в друзья. В этот момент Сэми был шокирован, ведь червь распространялся значительно быстрее, чем предполагалось. Спустя час запросы выросли вдвое и продолжали расти в геометрической прогрессии. Тогда Камка послал анонимное письмо в поддержку MySpace, предупреждая их о черве и указывая, как его остановить. Но по сей день так и остается загадкой, прочел ли кто-то его письмо.

В 13:30 по полудню у молодого хакера уже набралось более 2500 друзей и было более 6000 запросов на добавление в друзья. Процесс вышел из под контроля.

Камка опубликовал свое сообщение в блоге, объясняя все, что произошло в эту ночь. Как вспоминает Сэми:

Люди буквально завалили меня письмами о том, что они сообщили обо мне, как о человеке, взломавшем их страницы. Ведь именно мое имя светилось в списке их героев. Я надеюсь, что никто не подал на меня в суд.

Спустя пару часов Сэми пошел подкрепится буррито в Чипотли, после чего вернулся домой, чтобы проверить свой профиль в MySpace. В этот момент у него был почти миллион запросов в друзья. И вот что он написал в своем блоге:

Я популярен. Это официально. Число запросов пересекло отметку в миллион за пару минут до того, как MySpace стал недоступен. Компания должна была вывести сайт из эксплуатации, чтобы выяснить, что произошло, и произвести ликвидацию червя. Сэми признается:

Я чувствовал себя ужасно. Я чувствовал себя действительно неловко.Но он уже не мог ничего сделать. Как только он выпустил червя, процесс был уже необратим, вирус стремительно распространяется сам по себе. Спустя пару часов сайт снова стал доступен, но профиль Камка уже удалили.

Кунэл Ананд, который стал директором безопасности в MySpace спустя несколько месяцев после инцидента, сказал, что когда червь [Samy] совершил нападение, у компании не было практически никакой команды безопасности и они понятия не имели, что делать. Никто не видел прежде ничего подобного, так что этот момент стал переломным.

Давайте же посмотрим на то, как был устроен червь [Samy].

MySpace блокирует большинство тегов, на самом деле он разрешает только , и , возможно, некоторые другие, к примеру . Но он точно не допустит теги вроде , , с JavaScript и т.п. Однако, некоторые браузеры позволяют JavaScript в пределах CSS тегов. JavaScript потребуется для того, чтобы все это дальше работало.

Пример:

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

Пример:

Теперь мы можем сделать JavaScript в одинарных кавычках. Тем не менее, MySpace удаляет слово «JavaScript» из любой точки. Но некоторые браузеры на самом деле интерпретируют «java\nscript» как «javascript». (Это javascript).

Пример:

Хорошо, в то время как у нас есть работающие одинарные кавычки, все же иногда понадобятся двойные кавычки. Но проблема в том, что MySpace не пропустит любое экранирование кавычек. Однако можем просто преобразовать десятичное число в ASCII в JavaScript, чтобы фактически получить кавычки.

Пример:

Для того чтобы оставить код на странице пользователя, просмотревшего вашу, нужно получить исходный код страницы. Чтобы получить исходный код можно использовать document.body.innerHTML. Но опять-таки MySpace удалит слово innerHTML, и, во избежание этого, стоит использовать eval(), чтобы оценить две последовательности и соединить их, получая «innerHTML».

Пример:

Во время актуального доступа к другим страницам хотелось бы использовать плавающие фреймы. Но, как правило, фреймы (даже скрытые) не так полезны и очевидны для пользователей, что «что-то еще» продолжается. Можно использовать AJAX (HTTP XML) для выполнения HTTP захвата и копирования кода на страницу пользователя. Тем не менее, MySpace удаляет слово «onreadystatechange», которое необходимо для XML-HTTP-запросов. Опять же, мы можем использовать оценку, чтобы избежать этого. Другой плюс HTTP XML — то, что необходимые куки, требуемые для выполнения действий с MySpace, будут передаваться без каких-либо хлопот.

Пример:

В то время, когда мы получаем доступ к профилю пользователя, мы получаем и доступ к списку его героев. Нам не нужно удалять список текущих героев, нам просто нужно дописать себя в этот список. Если мы получили доступ к профилю, мы можем получить доступ к текущему списку героев и сохранить его на потом. Со всем вышеупомянутым и вычисленным сделать это довольно просто с запросом HTTP XML. За исключением того, что мы должны получить ID друга — фактического пользователя, просмотревшего наш профиль. Как и упоминалось выше, мы можем это сделать, получив доступ к исходному коду страницы. Правда теперь нам нужно выполнить поиск по странице в соответствии с определенным запросом. Но производя запрос поиска по словам, мы столкнемся с проблемой. Скорее всего данное слово будет найдено внутри нашего же кода. Соответственно запрос «если страница содержит «что-то», сделай то-то» будет всегда иметь положительный результат, так как это «что-то» содержится в нашем собственном коде, который был скопирован на страницу пользователя. Использование функции eval() позволяет избежать данной проблемы.

Пример:

В этой точке у нас уже есть список героев. Однако для начала нужно добавиться в друзья выполнив XML-HTTP запрос на странице «Добавить друзей». Но тут вдруг «опаньки», не работает. Но почему? Мы находимся на profile.myspace.com, однако запрос должен быть сделано по домену . Ничего страшного, можно подумать, но HTTP XML не позволит отправить/принимать запросы на сайт с другим доменным именем. Чтобы обойти это, давайте фактически перейдем к тому же URL, но с доменом . Вы по прежнему можете просматривать профиль от имени , таким образом, перезагрузка страницы с указанием нужного www домена позволяет нам выполнить запрос.

Пример:

Наконец мы можем выполнить запрос. Да только отправляя запрос, на самом деле мы не добавляем друга. Почему так происходит? Ведь все сделано правильно. А дело вот в чем. MySpace генерирует случайный хеш на странице для подтверждения запроса (например, «Вы уверены что хотите добавить этого пользователя в друзья?»). Если кэш не был передан вместе с запросом, то запрос не будет обработан. Чтобы обойти этот момент, нужно вести себя как браузер, разобрав источник хэш перед добавлением пользователя, затем отправить запрос при передаче хэш.

После того как запрос был завершен, нам нужно добавить себя в «герои» и вставить наш основной код. В конечном итоге код будет помещен в том же разделе «герои», поэтому для завершения нам нужен будет только один запрос. Тем не менее нам нужно предварительно получить страницу, чтобы получить новый хэш. Но до этого нам следует воспроизвести код, который мы хотим там поместить. Самый простой способ — взять исходный код, разобрать его и внести коррективы. Это работает, но теперь код будет искажен. Нам нужен зашифрованный URL для извлечения исходного кода и добавления запроса должным образом. Странно, но и это все еще не будет работать. Видимо URL-кодирование в JavaScript и функция escape () не выводят все необходимые данные, нужно внести некоторые изменения вручную чтобы получить необходимые данные на выходе. Добавляем «но больше всех мой герой — Сэми» как это было у Камки, после этого вставляем весь код целиком и — вуаля! У нас есть самовоспроизводящийся код, то самый червь.

ПодпискаБудь в СЕТИ! Новости социальных сетей - всегда актуальное
 
Группы: ВК | OK | Tg