經發現,任何可計算函數都可以利用 Curl 設定檔中的結構創建。此問題僅出現在 Curl 8.12 至 8.16 版本中,是由 Curl 對圖靈完備性的無意實現所致。這種實作允許利用從變數值中提取位元組範圍的功能以及包含外部設定檔時無限的嵌套深度來創建圖靈機。
例如,Curl 可以用來模擬雙計數器暫存器(明斯基機)進行數位加法運算,並實現「99 瓶啤酒」程序,該程序用於教授循環。要運行這個使用 curl 設定檔編寫的程序,只需解壓縮檔案並執行命令「curl -q -s -K 99_bottles/main.conf」。
暫存器機透過將計數器值表示為一個 n x 個字元的字串來模擬。遞增和遞減操作使用字串連接和截斷來實現(語法為“[0-0]”保留第一個字節,“[1-]”保留除第一個字節外的所有內容),狀態轉換由“expand-config”指令控制,該指令使用檔案名稱作為跳轉標籤動態載入下一個設定檔。暫存器機中的 INC(R) 操作在 Curl 設定檔中實作為“expand-variable = "r={{r}}x"”,DEC(R) 操作實作為“expand-variable = "r[1-]={{r}}"”,JMP(S) 操作實作為“expand-config = "S.conf""。例如,計算 2 + 3 的程式碼如下:

實際上,透過設定檔實現的運算能力受限於堆疊大小,因為程式執行的每一步都需要載入一個新的巢狀設定檔。使用 8 MB 的堆疊,大約 922 步後就會發生溢位。此外,擴展變數的大小限制(MAX_EXPAND_CONTENT 參數設定為 10 MB)以及儲存所有舊版本變數導致的高記憶體消耗也會影響運算能力。
雖然已識別的功能並非漏洞,但在 curl 8.17 及更高版本中,由於設定檔嵌套深度限制為 5 層以防止無限遞歸,所討論的技巧將不再有效。
來源: opennet.ru
