Curlの設定ファイル内の構造を利用することで、あらゆる計算可能な関数を作成できることが判明しました。この問題はCurlバージョン8.12~8.16でのみ発生し、チューリング完全性の意図しない実装が原因です。この実装では、変数値からバイト範囲を抽出する機能と、外部設定ファイルを含める際の無制限のネスト深度を利用して、チューリングマシンを作成できてしまいます。
例えば、Curlは、数値の加算を行うための2カウンタレジスタマシン(ミンスキーマシン)をシミュレートし、ループ処理を教えるために使用される「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 を計算するコードは次のようになります。

実際には、設定ファイルによって実現される計算能力はスタックサイズによって制限されます。これは、プログラム実行の各ステップで新しいネストされた設定ファイルを読み込む必要があるためです。8MBのスタックでは、約922ステップ後にオーバーフローが発生します。また、展開変数のサイズ制限(MAX_EXPAND_CONTENTパラメータは10MBに設定されています)と、すべての古いバージョンの変数を保存することによる高いメモリ消費量も、能力に影響を与えます。
特定された機能は脆弱性ではありませんが、curl 8.17以降のバージョンでは、無限再帰を防ぐために設定ファイルのネストの深さが5レベルに制限されているため、問題のトリックは機能しなくなります。
出所: オープンネット.ru
