Zidentyfikowano możliwość tworzenia dowolnych funkcji obliczeniowych za pomocą konstrukcji w plikach konfiguracyjnych narzędzia Curl. Ta cecha występuje tylko w wersjach Curl od 8.12 do 8.16 i jest wynikiem niezamierzonej realizacji pełności Turinga, co pozwala na tworzenie maszyn Turinga, wykorzystując możliwość wyodrębniania zakresów bajtów z wartości zmiennych oraz nieograniczoną głębokość zagnieżdżenia podczas dołączania zewnętrznych plików konfiguracyjnych.
Na przykład, za pomocą Curl stworzono symulację pracy dwu-przyciskowej maszyny rejestrowej (maszyny Mińskiego) do dodawania liczb oraz realizacji programu „99 butelek piwa”, używanego w nauczaniu pracy z pętlami. Aby uruchomić program, zaprogramowany za pomocą plików konfiguracyjnych Curl, wystarczy rozpakować archiwum i wykonać polecenie „curl -q -s -K 99_bottles/main.conf”.
Maszyna rejestrowa jest symulowana poprzez przedstawienie wartości licznika w postaci ciągu „n” znaków „x”. Operacje inkrementacji i dekrementacji są zrealizowane poprzez konkatenację i przycinanie ciągów (synchronizacja „[0-0]” dla pozostawienia pierwszego bajtu oraz „[1-]” dla pozostawienia całej zawartości poza pierwszym bajtem), a przejścia między stanami są zarządzane przez dyrektywę „expand-config”, która dynamicznie ładowała następny plik konfiguracyjny, używając jego nazwy jako etykiety przejścia. Operacja INC(R) w maszynie rejestrowej jest realizowana jako ‘expand-variable = «r={{r}}x»’ w pliku konfiguracyjnym Curl, DEC(R) — jako ‘expand-variable = «r[1-]={{r}}»’, a JMP(S) — jako ‘expand-config = «S.conf»’. Na przykład, kod do obliczenia 2 + 3:

W praktyce obliczeniowe możliwości realizowane za pomocą plików konfiguracyjnych są ograniczone rozmiarem stosu, ponieważ każdy krok wykonania programu wymaga załadowania nowego zagnieżdżonego pliku konfiguracyjnego. Przy stosie wynoszącym 8 MB, przepełnienie występuje mniej więcej po 922 krokach. Na możliwości wpływa także ograniczenie wielkości rozwijanych zmiennych (parametr MAX_EXPAND_CONTENT ustawiony jest na 10 MB) oraz duże zużycie pamięci z powodu przechowywania wszystkich starych wersji zmiennych.
Pomimo że odkryta możliwość nie jest luką w wersjach od curl 8.17, omawiany trik już nie zadziała z powodu ograniczenia głębokości zagnieżdżenia plików konfiguracyjnych do 5 poziomów w celu ochrony przed nieskończoną recursją.
Źródło: opennet.ru
