IT Share you

수십억 웃음 XML DoS 공격은 어떻게 작동합니까?

shareyou 2021. 1. 7. 19:55
반응형

수십억 웃음 XML DoS 공격은 어떻게 작동합니까?


<!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>

이것은 아마도 10 억 웃음 DoS 공격이라고합니다.

어떻게 작동하는지 아는 사람 있나요?


Billion Laughs 공격은 XML 파서를 대상으로하는 서비스 거부 공격입니다. Billion Laughs 공격은 XML 폭탄이라고도하며 더 심하게 기하 급수적 인 엔티티 확장 공격이라고도합니다. Billion Laughs 공격은 올바른 형식의 XML을 사용하는 경우에도 발생할 수 있으며 XML 스키마 유효성 검사를 통과 할 수도 있습니다.

바닐라 Billion Laughs 공격은 아래 표시된 XML 파일에 설명되어 있습니다.

<?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>

이 예에는 10 개의 다른 XML 엔티티가 있습니다. lollol9. 첫 번째 엔티티 lol는 문자열로 정의됩니다 “lol”. 그러나 다른 엔티티 각각은 다른 엔티티의 10으로 정의됩니다. 이 XML 파일의 문서 내용 섹션에는 엔티티의 한 인스턴스에 대한 참조 만 포함됩니다 lol9. 그러나 이것이 DOM 또는 SAX 파서에 의해 파싱 될 때 lol9발견되면 10 lol8초로 확장되고 각각 10 lol7초로 확장되는 식 입니다. 모든 것이 텍스트로 확장 될 때까지 lol100,000,000 개의 문자열 인스턴스가 "lol"있습니다. 하나 이상의 엔티티가 있거나 lol10 개의 문자열로 정의 된 경우“lol”, 10 억 개의 "lol"이 있으므로 공격의 이름이됩니다. 말할 필요도없이,이 많은 확장은 기하 급수적 인 양의 자원과 시간을 소비하여 DOS를 유발합니다.

블로그 에 더 광범위한 설명이 있습니다 .


XML 폭탄 중 하나-http: //msdn.microsoft.com/en-us/magazine/ee335713.aspx

이제 공격자는 XML의 이러한 세 가지 속성 (대체 엔터티, 중첩 엔터티 및 인라인 DTD)을 활용하여 악성 XML 폭탄을 만들 수 있습니다. 공격자는 이전 예제와 같이 중첩 된 엔터티가있는 XML 문서를 작성하지만 한 수준 깊이 만 중첩하는 대신 엔터티를 여러 수준 깊이로 중첩합니다.

이러한 "폭탄"(.NET 세계에서)으로부터 보호하는 코드도 있습니다.

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

<!ENTITY ha "Ha !">&ha;확장 되는 엔티티를 정의합니다 "Ha !". 다음 라인은 다른 엔티티 정의 &ha2;가 확장되어 "&ha; &ha;", 결국 및 "Ha ! Ha !".

&ha3;로 변하는 식으로 Ha ! Ha ! Ha ! Ha !매번 두 배로 늘어납니다. 패턴을 따르면 &haN;is "Ha !", 2 N-1 번, 따라서은 2127 초로 &ha128확장되며 , 이는 컴퓨터가 처리하기에는 너무 큽니다. "Ha !"

참조 URL : https://stackoverflow.com/questions/3451203/how-does-the-billion-laughs-xml-dos-attack-work

반응형