In de configuratiebestanden van curl is per ongeluk de volledigheid volgens Turing geïmplementeerd

Er is een mogelijkheid ontdekt om elke rekenbare functie te creëren met behulp van constructies in de configuratiebestanden van de Curl-tool. Deze eigenschap komt alleen voor in de Curl-versies 8.12-8.16 en is te wijten aan de onbedoelde implementatie van de Turing-compleetheid, waardoor Turing-machines kunnen worden gemaakt die in staat zijn om byte-reeksen uit variabele waarden te extraheren en onbegrensde diepten van geneste configuratiebestanden te gebruiken.

Als voorbeeld is met Curl een simulatie opgezet van een twee-teller registermachine (de Minsk-machine) voor het optellen van getallen en de implementatie van het programma '99 flessen bier', dat wordt gebruikt voor het leren werken met lussen. Om het programma, dat via de configuratiebestanden van curl is geprogrammeerd, te starten, hoeft men alleen het archief uit te pakken en de opdracht 'curl -q -s -K 99_bottles/main.conf' uit te voeren.

De registermachine wordt gesimuleerd door de waarde van de teller voor te stellen als een string van 'n' symbolen 'x'. De increment- en decrementbewerkingen worden gerealiseerd door middel van concatenatie en afkapping van strings (de syntaxis '[0-0]' om de eerste byte te behouden en '[1-]' om de rest van de inhoud behalve de eerste byte te behouden), terwijl de overgangen tussen toestanden worden beheerd door de richtlijn 'expand-config', die het volgende configuratiebestand dynamisch laadt met zijn naam als overgangslabel. De operatie INC(R) in de registermachine wordt geïmplementeerd als 'expand-variable = "r={{r}}x"' in het Curl-configuratiebestand, DEC(R) als 'expand-variable = "r[1-]={{r}}"', en JMP(S) als 'expand-config = "S.conf"'. Bijvoorbeeld, de code voor het berekenen van 2 + 3:

In de praktijk zijn de rekencapaciteiten die via configuratiebestanden worden gerealiseerd beperkt door de grootte van de stack, aangezien elke stap van de uitvoering van het programma een nieuw genest configuratiebestand vereist. Met een stack van 8 MB treedt een overflow op na ongeveer 922 stappen. De mogelijkheden worden ook beïnvloed door de limiet op de grootte van de uit te breiden variabelen (de parameter MAX_EXPAND_CONTENT is ingesteld op 10 MB) en het grote geheugenverbruik door het opslaan van alle oude versies van variabelen.

Hoewel de ontdekte mogelijkheid geen kwetsbaarheid is in de versies vanaf curl 8.17, zal de beschouwde truc niet meer werken vanwege de beperking van de diepte van geneste configuratiebestanden tot 5 niveaus ter bescherming tegen oneindige recursie.

Bron: opennet.ru

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster