В версиях curl с 8.12 по 8.16 конфигурационные файлы могли выполнять вычисления, по сложности сопоставимые с универсальной машиной Тьюринга.
Это стало возможным благодаря двум функциям: обработке частей строковых переменных и подключению других конфигов без ограничения глубины вложенности.
Исследователь показал, что с их помощью можно реализовать двухсчетчиковую машину Минского — математическую модель, способную выполнять любые вычисления при неограниченных ресурсах.
В curl эти возможности использовали необычным образом. Значения переменных изображали счетчики, а имена конфигурационных файлов — команды программы.
Читают прямо сейчас:
Самые интересные и необычные винтажные компьютеры — что такое машина Тьюринга и почему такой простой модели хватает для любых вычислений
Как тестируют API: разбираемся на примере REST API — как отправлять запросы с помощью curl и читать ответ сервера
Командная строка: что это такое и как её открыть — что такое командная строка, откуда запускают curl и другие утилиты
Как это работало
Каждый счетчик представляли строкой из символов x.
Например, значение xxxxx означало число 5. Команды изменения счетчиков реализовывали через операции со строками:
- Добавление
xувеличивало значение на единицу. - Удаление первого символа уменьшало его на единицу.
- Проверка первого символа позволяла определить, равен ли счетчик нулю.
- Подключение другого конфигурационного файла переводило выполнение к следующей команде.
Таким способом можно было описать программу с двумя счетчиками и переходами между состояниями. Исследователь даже подготовил демонстрацию: четыре конфигурационных файла вычисляют сумму 2 + 3. Результат — строка из пяти символов x.
Ограничения и исправление
На практике возможности curl были ограничены. Максимальный размер раскрываемого содержимого составлял 10 МБ, а каждый переход к следующему конфигу создавал новый уровень вложенности и занимал память.
В тесте с обратным отсчетом программа завершалась с ошибкой после 922 шагов при размере стека 8 МБ.
В curl 8.17.0 разработчики добавили еще одно ограничение: теперь конфигурационные файлы можно подключать с вложенностью не более пяти уровней. Этого достаточно, чтобы описанная схема перестала работать.
Изначально изменение предназначалось для защиты от бесконечного подключения файла к самому себе. В публичном описании исправления разработчики не упоминали машину Тьюринга и не объясняли, почему выбрали именно пять уровней.
Что это значит для безопасности
Исследователь отдельно подчеркивает: обнаруженная особенность не представляет угрозы безопасности. Речь идет о необычном способе использовать возможности конфигурационных файлов, а не об уязвимости, позволяющей атаковать чужие системы.
Впрочем, эксперимент показал, насколько неожиданными могут быть последствия сочетания обычных функций программы. Даже инструмент для передачи данных по сети оказался способен выполнять вычисления общего назначения — пусть и с существенными ограничениями.
Скидка на все курсы Практикума
Раз вы дочитали эту новость до конца, с технологиями у вас всё в порядке. А если давно присматривались к разработке, аналитике, нейросетям, тестированию или кибербезопасности, сейчас туда можно зайти дешевле.
Промокод KOD (можно просто нажать) даст скидку на любой платный курс! А если пока не готовы покупать курс, у Практикума есть бесплатные вводные части.
