2010-08-10 13 views
40
<!DOCTYPE root [ 
<!ENTITY ha "Ha !"> 
<!ENTITY ha2 "&ha; &ha;"> 
<!ENTITY ha3 "&ha2; &ha2;"> 
<!ENTITY ha4 "&ha3; &ha3;"> 
<!ENTITY ha5 "&ha4; &ha4;"> 
... 
<!ENTITY ha128 "&ha127; &ha127;"> 
]> 
<root>&ha128;</root> 

Podobno nazywa się to atakiem DoS na miliard śmiechu.Jak działa miliardowy śmiech ataków XML DoS?

czy ktoś wie jak to działa?

+12

Powinien zostać przeniesiony do BufferOverFlow ... http: //en.wikipedia.org/wiki/Billion_laughs – codingbadger

+8

Powinieneś zostać przeniesiony do barryoverflow –

+0

Wypróbuj w Firefoksie 48 SVG, aby zatrzymać twój komputer :-) https://bugzilla.mozilla.org/show_bug.cgi?id=798374 –

Odpowiedz

46

Atak typu "Billion Laughs" jest atakiem typu "odmowa usługi" skierowanym do analizatorów XML. Atak Billion Laughs jest również znany jako bomba XML lub, bardziej ezoterycznie, ekspansyjny atak ekspansji jednostek. Atak typu Billion Laughs może się zdarzyć nawet przy użyciu dobrze sformułowanego XML i może również przekazać walidację schematu XML.

Atak vanilla Billion Laughs został przedstawiony w pliku XML przedstawionym poniżej.

<?xml version="1.0"?> 
<!DOCTYPE lolz [ 
<!ENTITY lol "lol"> 
<!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;"> 
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;"> 
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;"> 
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;"> 
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;"> 
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;"> 
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;"> 
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;"> 
]> 
<lolz>&lol9;</lolz> 

W tym przykładzie, istnieje 10 różnych podmiotów XML, lol - lol9. Pierwsza jednostka, lol jest zdefiniowana jako ciąg “lol”. Jednak każda z pozostałych jednostek jest zdefiniowana jako 10 innej jednostki. Sekcja treści dokumentu tego pliku XML zawiera odniesienie do tylko jednego wystąpienia jednostki lol9. Jednak gdy jest on analizowany przez analizator składni DOM lub SAX, po napotkaniu lol9 jest on rozszerzany do 10 lol8 s, z których każdy jest rozszerzany do 10 lol7 s, i tak dalej i tak dalej. Do czasu, gdy wszystko zostanie rozszerzone do tekstu lol, istnieje 100 000 000 wystąpień ciągu "lol". Gdyby istniał jeszcze jeden byt, lub lol został zdefiniowany jako 10 ciągów “lol”, pojawiłoby się miliardowe "lol", stąd nazwa ataku. Nie trzeba dodawać, że wiele ekspansji pochłania wykładniczą ilość zasobów i czasu, powodując DOS.

Istnieje szersze wyjaśnienie na temat mojego blog.

+0

Uwielbiam sposób, w jaki witryna blogu bezpieczeństwa próbuje przechwytywać ruch za pomocą [historii i przekierowań] (http://blog.yoocare.com/how-to-remove-ib-adnxs-com-pop-ups-browser- redirect-virus-removal /);) – jww

+1

Co? Nie ma przykładu CodePen? –

2

Pisze "Ha!" 2 razy.

+0

@zneak: jak to działa to robi? –

+6

@I__: Jednostka '&ha128;' rozwija się do dwóch jednostek '&ha127;', które z kolei rozszerzają się do czterech '&ha126;', które z kolei rozszerzają się do ośmiu '&ha125;', ... aż rozwiną się do tysięcy milionów miliardów '&ha;', który przekształca się w 'Ha!'. – zneak

+0

czy możesz pokazać mi samouczek wyjaśniający, jak to działa? –

18

Jedna z bomb XML - http://msdn.microsoft.com/en-us/magazine/ee335713.aspx

Osoba atakująca może teraz skorzystać z tych trzech właściwości XML (podmiotów podmiany, podmiotów zagnieżdżonych i inline DTD) jednostkom złośliwy XML bombę. Atakujący zapisuje dokument XML z zagnieżdżonymi obiektami, tak jak poprzedni przykład, ale zamiast zagnieżdżać tylko jeden poziom głębokości, umieszcza swoje jednostki na głębokich poziomach ...

Istnieje również kod zabezpieczający przed tymi "bombami" "(w świecie .NET):

XmlReaderSettings settings = new XmlReaderSettings(); 
settings.ProhibitDtd = false; 
settings.MaxCharactersFromEntities = 1024; 
XmlReader reader = XmlReader.Create(stream, settings); 
11

<!ENTITY ha "Ha !"> określa podmiot, &ha; który rozszerza się "Ha !". Następny wiersz definiuje inny podmiot, &ha2;, który rozwija się do "&ha; &ha;", a ostatecznie "Ha ! Ha !".

&ha3; zmienia się w Ha ! Ha ! Ha ! Ha !, i tak dalej, podwajając liczbę za każdym razem. Jeśli postępujesz zgodnie ze wzorcem, &haN; jest "Ha !", 2 N-1 razy, więc &ha128, rozszerza się do 2 "Ha !" s, który jest zbyt duży, aby mógł nim sprostać każdy komputer.

+0

Ups, myślę, że podzielony przez dwa zamiast odejmowania jednego. –

Powiązane problemy