У конфігураційних файлах curl випадково реалізована повнота за Тьюрингом

Виявлено можливість створення будь-яких функцій, що обчислюються, за допомогою конструкцій у файлах конфігурації утиліти Curl. Дана особливість проявляється тільки у версіях Сurl з 8.12-8.16 і викликана ненавмисною реалізацією повноти по Тьюрингу, що дозволяє створювати машини Тьюринга, використовуючи можливість витягувати байтові діапазони зі значень змінних та необмежену глибину вкладеності при підключенні зовнішніх конфігурацій.

Як приклад за допомогою Curl організовано симуляцію роботи дволічильникової реєстрової машини (машини Мінського) для складання чисел та реалізації програми «99 пляшок пива», що використовується при навчанні роботи з циклами. Для запуску програми, запрограмованої через конфігураційні файли curl, достатньо розпакувати архів і виконати команду «curl -q -s -K 99_bottles/main.conf».

Регістрова машина симулюється через уявлення значення лічильника у вигляді рядка із «n» символів «x». Операції інкременту і декремента реалізовані через конкатенацію і усічення рядків (синтаксис «[0-0]» для залишення першого байта і «[1-]» для залишення всього вмісту крім першого байта), а переходи між станами керуються директивою «expand-config», яка динамічно підвантажує наступний файл конфігурації, Операція INC(R) у регістровій машині реалізується як 'expand-variable = r={{r}}x'' у файлі конфігурації Curl, DEC(R) - як 'expand-variable = r[1-]={{r}}'', а JMP(S) - як 'expand-config = 'S. Наприклад, код для обчислення 2 + 3:

На практиці обчислювальні можливості, що реалізуються через файли конфігурації, обмежені розміром стека, так як кожен крок виконання програми вимагає завантаження нового вкладеного файлу конфігурації. При стеку 8 МБ переповнення виникає приблизно після 922 кроків. На можливості також впливає обмеження на розмір змінних, що розкриваються (параметр MAX_EXPAND_CONTENT виставлений в 10 МБ) і велике споживання пам'яті через збереження всіх старих версій змінних.

Незважаючи на те, що виявлена ​​можливість не є вразливістю у версіях починаючи з curl 8.17 трюк, що розглядається, вже не спрацює через обмеження глибини вкладеності файлів конфігурації 5 рівнями для захисту від нескінченної рекурсії.

Джерело: opennet.ru

Купити надійний хостинг для сайтів із захистом від DDoS, VPS VDS сервери 🔥 Купити надійний хостинг для сайтів із захистом від DDoS, VPS VDS сервери | ProHoster