Атака квадратичного вибуху — у комп'ютерній безпеці є різновидом атаки на відмову в обслуговуванні (DoS), яка спрямована на парсери документів XML.
Це також називається XML-бомба, атака мільярда реготань або як атака експоненційного розширення сутності.
Деталі Приклад атаки складається з визначення 10 об'єктів, кожен визначений як такий, що складається з 10 попередніх об'єктів, при цьому документ складається з одного екземпляра найбільшої сутності, яка розширюється до одного мільярда копій першої сутності.
У найбільш частому прикладі перша сутність — це рядок «lol», звідси й назва «мільярд реготань». У той час, коли про цю вразливість було повідомлено вперше, пам'ять комп'ютера, яку використовують мільярд екземплярів рядка «lol», ймовірно, перевищувала б доступну для процесу, що аналізує XML.
Хоча початкова форма атаки була спрямована саме на синтаксичний аналізатор XML, цей термін також може бути застосовний до подібних тем.
Вперше про проблему було повідомлено ще в 2002 р., але її почали широко розглядати в 2008 році.
Захист від такого роду атаки включає обмеження пам'яті, виділеної в окремому синтаксичному аналізатору, якщо втрата документа прийнятна, або символічне оброблення об'єктів і ліниве розширення сутностей лише тоді, коли (і в тій мірі) буде використаний їхній вміст.
Приклад коду <?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 гігабайт пам'яті.
Варіації
Описана вище атака мільярда реготань може зайняти експоненційну кількість простору або часу. Варіація квадратичного збільшення викликає квадратичне зростання потреби в ресурсах, просто повторюючи велику сутність знову і знову, щоб уникнути контрзаходів, які виявляють сильно вкладені об'єкти. (Див. теорію обчислювальної складності для порівняння різних класів зростання.)
Атака «мільярд сміху» має існувати для будь-якого формату файлу, який може містити розширення макроса, наприклад, ця бомба 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. З цієї причини часто віддають перевагу форматам файлів, які не допускають посилань, для даних, що надходять з ненадійних джерел.
Див. також Fork-бомба: аналогічний метод вичерпання ресурсів системи через рекурсію Zip-бомба: подібна атака з використанням zip-архівів : XML-атака для повернення довільних файлів сервера Document type definition: шаблон для перевірки XML-файлів
Примітки