Квадратичний вибух
Атака квадратичного вибуху - у комп'ютерній безпеці є різновидом атаки на відмову в обслуговуванні (DoS), яка спрямована на парсери документів XML.[1]
Це також називається XML-бомба, атака мільярда реготань або як атака експоненційного розширення сутності.[2]
Приклад атаки складається з визначення 10 об’єктів, кожен визначений як такий, що складається з 10 попередніх об’єктів, при цьому документ складається з одного екземпляра найбільшої сутності, яка розширюється до одного мільярда копій першої сутності.
У найбільш частому прикладі перша сутність — це рядок «lol», звідси й назва «мільярд реготань». У той час, коли про цю вразливість було повідомлено вперше, пам’ять комп’ютера, яку використовують мільярд екземплярів рядка «lol», ймовірно, перевищувала б доступну для процесу, що аналізує XML.
Хоча початкова форма атаки була спрямована саме на синтаксичний аналізатор XML, цей термін також може бути застосовний до подібних тем.[1]
Вперше про проблему було повідомлено ще в 2002 р.,[3] але її почали широко розглядати в 2008 році. [4]
Захист від такого роду атаки включає обмеження пам'яті, виділеної в окремому синтаксичному аналізатору, якщо втрата документа прийнятна, або символічне оброблення об'єктів і ліниве розширення сутностей лише тоді, коли (і в тій мірі) буде використаний їхній вміст.
<?xml version="1.0"?>
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ELEMENT lolz (#PCDATA)>
<!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
<!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>
Коли синтаксичний аналізатор XML завантажує цей документ, він бачить, що він містить один кореневий елемент, "lolz", який містить текст "&lol9;". Однак "&lol9;" є визначеною сутністю, яка розгортається до рядка, що містить десять рядків "&lol8;". Кожен рядок "&lol8;" – це визначена сутність, яка розширюється до десяти рядків "&lol7;" тощо. Після обробки всіх розширень сутності цей невеликий (< 1 КБ) блок XML насправді міститиме 109 = мільярд "lol", що займе майже 3 гігабайт пам'яті.[5]
Описана вище атака мільярда реготань може зайняти експоненційну кількість простору або часу. Варіація квадратичного збільшення викликає квадратичне зростання[en] потреби в ресурсах, просто повторюючи велику сутність знову і знову, щоб уникнути контрзаходів, які виявляють сильно вкладені об'єкти. [6] (Див. теорію обчислювальної складності для порівняння різних класів зростання.)
Атака «мільярд сміху» має існувати для будь-якого формату файлу, який може містити розширення макроса, наприклад, ця бомба YAML:
a: &a ["lol","lol","lol","lol","lol","lol","lol","lol","lol"]
b: &b [*a,*a,*a,*a,*a,*a,*a,*a,*a]
c: &c [*b,*b,*b,*b,*b,*b,*b,*b,*b]
d: &d [*c,*c,*c,*c,*c,*c,*c,*c,*c]
e: &e [*d,*d,*d,*d,*d,*d,*d,*d,*d]
f: &f [*e,*e,*e,*e,*e,*e,*e,*e,*e]
g: &g [*f,*f,*f,*f,*f,*f,*f,*f,*f]
h: &h [*g,*g,*g,*g,*g,*g,*g,*g,*g]
i: &i [*h,*h,*h,*h,*h,*h,*h,*h,*h]
Це привело до збою попередніх версій Go, оскільки процесор YAML у Go (на відміну від специфікації YAML) розширює посилання, як якщо б вони були макросами. Процесор Go YAML був модифікований так, щоб синтаксичний аналіз був неможливим, якщо об’єкт результату стає занадто великим.
Корпоративне програмне забезпечення, як-от Kubernetes, постраждало від цієї атаки через його синтаксичний аналізатор YAML. [7][8] З цієї причини часто віддають перевагу форматам файлів, які не допускають посилань, для даних, що надходять з ненадійних джерел. [9]
- Fork-бомба: аналогічний метод вичерпання ресурсів системи через рекурсію
- Zip-бомба: подібна атака з використанням zip-архівів
- Атака зовнішніх сутностей XML[en]: XML-атака для повернення довільних файлів сервера
- Document type definition: шаблон для перевірки XML-файлів
- ↑ а б Harold, Elliotte Rusty (27 травня 2005). Tip: Configure SAX parsers for secure processing. IBM developerWorks. Архів оригіналу за 4 березня 2011. Процитовано 4 березня 2011.
- ↑ Sullivan, Bryan (November 2009). XML Denial of Service Attacks and Defenses. MSDN Magazine. Microsoft Corporation. Архів оригіналу за 19 Вересня 2019. Процитовано 31 травня 2011.
- ↑ SecurityFocus. 16 грудня 2002. Архів оригіналу за 16 Квітня 2021. Процитовано 3 липня 2015.
- ↑ CVE-2003-1564. Common Vulnerabilities and Exposures. The MITRE Corporation. 2 лютого 2003. Архів оригіналу за 3 Березня 2016. Процитовано 1 червня 2011.
- ↑ Bryan Sullivan. XML Denial of Service Attacks and Defenses. Архів оригіналу за 19 Вересня 2019. Процитовано 21 грудня 2011.
- ↑ 19.5. XML Processing Modules — Python 2.7.18 documentation. Архів оригіналу за 8 Березня 2022. Процитовано 23 Лютого 2022.
- ↑ CVE-2019-11253: Kubernetes API Server JSON/YAML parsing vulnerable to resource exhaustion attack · Issue #83253 · kubernetes/Kubernetes. GitHub. Архів оригіналу за 23 Лютого 2022. Процитовано 23 Лютого 2022.
- ↑ Wallen, Jack (9 жовтня 2019). Kubernetes 'Billion Laughs' Vulnerability Is No Laughing Matter. The New Stack. Архів оригіналу за 23 Лютого 2022. Процитовано 23 Лютого 2022.
- ↑ XML is toast, long live JSON. 9 червня 2016. Архів оригіналу за 24 Березня 2022. Процитовано 23 Лютого 2022.