经发现,任何可计算函数都可以利用 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
