Главная | IT | В конфигурационных файлах curl случайно реализована полнота по Тьюрингу

В конфигурационных файлах 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.conf»‘. Например, код для вычисления 2 + 3:

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

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

Источник