Det har upptÀckts att det Àr möjligt att skapa vilken berÀkningsfunktion som helst med hjÀlp av konstruktioner i konfiguraitonsfilerna för Curl-verktyget. Denna egenskap förekommer endast i Curl-versionerna 8.12-8.16 och orsakas av en oavsiktlig implementering av TuringfullstÀndighet, vilket gör det möjligt att skapa Turingmaskiner genom att extrahera byteomrÄden frÄn variabelvÀrden och anvÀnda obegrÀnsad nivÄ av inbÀddning nÀr externa konfigurationsfiler inkluderas.
Som exempel har Curl anvÀnts för att simulera en tvÄtÀljande registermaskin (Minsk-maskinen) för att addera tal och genomföra programmet "99 flaskor öl", som anvÀnds för att lÀra sig arbeta med loopar. För att köra programmet, som programmerats via Curl konfigurationsfiler, rÀcker det med att packa upp arkivet och köra kommandot "curl -q -s -K 99_bottles/main.conf".
Registermaskinen simuleras genom att representera vĂ€rdet av rĂ€knaren som en strĂ€ng bestĂ„ende av "n" tecken "x". Inkrementerings- och dekrementeringsoperationer genomförs genom att sammanfoga och avkorta strĂ€ngar (syntaxen "[0-0]" för att behĂ„lla det första bytet och "[1-]" för att behĂ„lla allt innehĂ„ll utom det första bytet), och övergĂ„ngar mellan tillstĂ„nd styrs av direktivet "expand-config", som dynamiskt laddar nĂ€sta konfigurationsfil med hjĂ€lp av dess namn som en övergĂ„ngsetikett. Operationen INC(R) i registermaskinen implementeras som âexpand-variable = "r={{r}}x"â i Curl-konfigurationsfilen, DEC(R) som âexpand-variable = "r[1-]={{r}}"â, och JMP(S) som âexpand-config = "S.conf"â. Till exempel, kod för att berĂ€kna 2 + 3:

I praktiken begrÀnsas de berÀkningsmöjligheter som implementeras via konfigurationsfiler av stackens storlek, eftersom varje steg i programkörningen krÀver laddning av en ny inbÀddad konfigurationsfil. Med en stack pÄ 8 MB intrÀffar överflöde efter cirka 922 steg. Möjligheterna pÄverkas ocksÄ av begrÀnsningen av storleken pÄ de expanderade variablerna (parametern MAX_EXPAND_CONTENT Àr instÀlld pÄ 10 MB) och stort minnesutnyttjande pÄ grund av att alla gamla versioner av variablerna sparas.
Trots att den upptÀckta möjligheten inte Àr en sÄrbarhet i versioner frÄn och med curl 8.17 kommer den aktuella tricken inte lÀngre att fungera pÄ grund av begrÀnsningen av inbÀddningsnivÄer i konfigurationsfiler till 5 nivÄer för att skydda mot oÀndlig rekursion.
KĂ€lla: opennet.ru
