В конфигурационните файлове на curl случайно е реализирана пълнота по Тюринг

Открита е възможността за създаване на произволни изчисляеми функции чрез конструкции в конфигурационните файлове на утилитата Curl. Тази особеност се проявява само в версиите на Curl от 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.conf“‘. Например, кодът за изчисляване на 2 + 3:

На практика изчислителните способности, реализирани чрез конфигурационни файлове, са ограничени от размера на стека, тъй като всяка стъпка на изпълнение на програмата изисква зареждане на нов вложен конфигурационен файл. С големина на стека от 8 MB преливането настъпва приблизително след 922 стъпки. На възможностите влияе също така ограничението на размера на разширените променливи (параметър MAX_EXPAND_CONTENT е зададен на 10 MB) и високото потребление на памет, дължащо се на запазването на всички стари версии на променливите.

Въпреки че откритата възможност не е уязвимост в версиите от 8.17 на curl, разгледаният трик вече няма да работи поради ограничението на дълбочината на вложените конфигурационни файлове до 5 нива, за да се предотврати безкрайна рекурсия.

Източник: opennet.ru

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster