Перейти до вмісту

Квадратичний вибух

Матеріал з Вікіпедії — вільної енциклопедії.

Атака квадратичного вибуху - у комп'ютерній безпеці є різновидом атаки на відмову в обслуговуванні (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]

Див. також

[ред. | ред. код]

Примітки

[ред. | ред. код]
  1. а б Harold, Elliotte Rusty (27 травня 2005). Tip: Configure SAX parsers for secure processing. IBM developerWorks. Архів оригіналу за 4 березня 2011. Процитовано 4 березня 2011.
  2. Sullivan, Bryan (November 2009). XML Denial of Service Attacks and Defenses. MSDN Magazine. Microsoft Corporation. Архів оригіналу за 19 Вересня 2019. Процитовано 31 травня 2011.
  3. SecurityFocus. 16 грудня 2002. Архів оригіналу за 16 Квітня 2021. Процитовано 3 липня 2015.
  4. CVE-2003-1564. Common Vulnerabilities and Exposures. The MITRE Corporation. 2 лютого 2003. Архів оригіналу за 3 Березня 2016. Процитовано 1 червня 2011.
  5. Bryan Sullivan. XML Denial of Service Attacks and Defenses. Архів оригіналу за 19 Вересня 2019. Процитовано 21 грудня 2011.
  6. 19.5. XML Processing Modules — Python 2.7.18 documentation. Архів оригіналу за 8 Березня 2022. Процитовано 23 Лютого 2022.
  7. CVE-2019-11253: Kubernetes API Server JSON/YAML parsing vulnerable to resource exhaustion attack · Issue #83253 · kubernetes/Kubernetes. GitHub. Архів оригіналу за 23 Лютого 2022. Процитовано 23 Лютого 2022.
  8. Wallen, Jack (9 жовтня 2019). Kubernetes 'Billion Laughs' Vulnerability Is No Laughing Matter. The New Stack. Архів оригіналу за 23 Лютого 2022. Процитовано 23 Лютого 2022.
  9. XML is toast, long live JSON. 9 червня 2016. Архів оригіналу за 24 Березня 2022. Процитовано 23 Лютого 2022.