本文の内容は、2023年10月12日に MIGUEL HERNÁNDEZ が投稿したブログ(https://sysdig.com/blog/cve-2023-38545/)を元に日本語に翻訳・再構成した内容となっております。
10 月 11 日に、curl の新しいバージョン(8.4.0) がリリースされ、いくつかの新しい脆弱性 (severity HIGH のCVE-2023-38545および severity LOW のCVE-2023-38546 )が修正されました。これらの問題は、プロジェクトのディスカッションで以前に発表されました。このブログの執筆時点では、CVE-2023-38545 に対していくつかの概念実証がリリースされており、クラッシュは発生しますが、悪用はされませんでした。
- CVE-2023-38545は SOCKS5 ヒープ バッファー オーバーフローです。この欠陥により、SOCKS5 プロキシ ハンドシェイクにおけるヒープベースのバッファでのカール オーバーフローが発生します。
- CVE-2023-38546 は、noneという名前のファイルによる Cookie インジェクションです。この欠陥により、特定の一連の条件が満たされた場合、攻撃者は libcurl を使用して実行中のプログラムに任意に Cookie を挿入できます。
CVE-2023-38545 を発見したリサーチャーの言葉:
「ステートマシンが遅延している場合、リモートから不正なSOCKSパケットで解決されます。攻撃者はヒープに書き込み、 data->state.buffer
の後に来る使用中のデータを上書きしている可能性があります。良く言えば未定義の動作であり、悪く言えば RCE の可能性があります。」
CVE-2023-38545 の影響を受けるバージョンは次のとおりです。
- libcurl 7.69.0 から 8.3.0 (このコミットで実装) まで
- 影響を受けないバージョン: libcurl < 7.69.0 および >= 8.4.0。
この記事では、CVE-2023-38545、その悪用方法、およびその検出方法について説明します。
CVE-2023-38545 詳細
CVE-2023-38545 の悪用を成功させるには、ターゲットが curl バイナリ (libcurl ではなく) である場合に満たす必要がある要件がいくつかあります。
- Curl は過剰なサイズのドメイン名を使用する必要があります。
- SOCKSの設定には、–
socks5-hostname
を含めるか、スキームsocks5h://
を使用するように-proxyまたは-preproxyを設定する必要があります。 - CURLOPT_BUFFERSIZE 環境変数が設定されていないか、65541 より小さい値が設定されています。
この脆弱性は、libcurl と呼ばれるカールのライブラリ バージョンにも存在します。このライブラリは任意のプログラムに含めることができますが、上記の条件はプログラム自体内で設定でき、通常はセキュリティ ツールには表示されないため、検出が困難になる可能性があります。
脆弱性の仕組み
この脆弱性は、 do_SOCKS5
関数の実装方法におけるロジック上の欠陥が原因で存在します。 この関数は、プロキシ サーバーへの接続から最終リクエストまでのすべてのロジックを処理するステート マシンを実装します。 SOCKS5H socks proxyの仕様では、ホスト名のリモート解決は最大 255 文字であると規定されているため、このチェックは、 CONNECT_SOCKS_INIT
と呼ばれる最初の状態で do_SOCKS5
によって実行されます。ただし、次の時点でステート マシンを終了できることは考慮されていません。 サーバーへの”hello”パケットの受信中に強制的に遅延を導入することで、 CONNECT_SOCKS_READ
内の任意の時点で実行できます。 これにより、ソケットは保留状態のままになります。
後続の do_SOCKS5
の呼び出しでは、要求をローカルで解決するかリモートで解決するかを制御する変数 socks5_resolve_local
が以前の状態 (FALSE) に設定されます。 CONNECTION_SOCKS_INIT
状態ではなくなったため、ホスト名が 255 文字を超えていないことを確認するためのさらなるチェックは行われず、ヒープ バッファ オーバーフローが発生します。
詳細については、この発見を行ったリサーチャーが完全なウォークスルーを公開しました。
CVE-2023-38545 エクスプロイトの課題
このブログ公開時点では、次のようなさまざまな要因により、この脆弱性の悪用を成功させることは困難になるでしょう。
- 攻撃者は、バッファをオーバーフローさせるために非常に長いドメイン名への HTTP 30X リダイレクトを引き起こすために宛先サーバーを制御する必要があります。あるいは、攻撃者は、悪意のあるサーバーを指すように、またはオーバーフローするデータを渡すために、curl に渡されるドメイン名を制御できる必要があります。
- ヒープ内の動的メモリ割り当ては実行時に動的に変化する可能性があるため、操作または上書きするデータの正確な場所を予測することが困難になります。
- これはリモートから悪用される脆弱性であるため、ASLR (アドレス空間レイアウトのランダム化) メモリ保護をバイパスするために使用できる一貫したメモリ リークはありません。また、攻撃者は、実行を成功させるためにオーバーフローしているバッファ付近のメモリにどのようなオブジェクトが割り当てられているかも知りません。
CVE-2023-38545 の検出
この脆弱性を検出するには、2 つのユースケースに対処する必要があります。検出には、オープンソース ツールFalcoを使用します。最初のケースは、curl バイナリ自体が悪用のターゲットである場合です。ネットワーク パケットやデータ内の悪用コードを検出することは現実的ではありませんが、動作ルールを作成することはできます。
以下のルールでは、curl を親プロセスとして持ち、curl が SOCKS5 を使用している起動されたプロセスを検出します。Curl は通常、プロセスを起動しないため、これは侵害の兆候である可能性があります。
- macro: curl_pname_socks
condition: proc.pcmdline contains " --socks" or proc.pcmdline contains " -x socks" or proc.pcmdline contains " --preproxy socks" or proc.env icontains "all_proxy=socks" or proc.env icontains "https_proxy=socks" or proc.env icontains "http_proxy=socks"
- rule: Curl with Socks options opening processes
desc: Detect a curl command with socks options spawning processes
condition: spawned_process and proc.pname=curl and (curl_pname_socks)
output: A curl command with Socks options has just spawned a new process (proc.name=%proc.name proc.pname=%proc.pname proc.cmdline=%proc.cmdline proc.pcmdline=%proc.pcmdline proc.env=%proc.env gparent=%proc.aname[2] ggparent=%proc.aname[3] gggparent=%proc.aname[4] proc.sid=%proc.sid proc.exepath=%proc.exepath user.uid=%user.uid user.loginname=%user.loginname group.gid=%group.gid group.name=%group.name container.name=%container.name image=%container.image.repository)
priority: WARNING
tags: [host, container, CVE-2023-38545]
Code language: JavaScript (javascript)
libcurl が悪用された場合、ライブラリはあらゆるプロセスで使用される可能性があるため、検出はさらに困難になります。この場合、エクスプロイト後の動作を検出する、より一般的な脅威検出ルールをお勧めします。プログラムの悪用方法は異なる場合がありますが、攻撃者のその後の行動は通常同じです。
Falcoで利用可能な、エクスプロイト後の動作を検出できるオープンソース ルールの例:
- 信頼できないシェルを実行する
- プライベートキーまたはパスワードを検索する
- STDOUT/STDINをコンテナ内のネットワーク接続にリダイレクトする
- memfd_createによるファイルレス実行
- sshキーをauthorized_keysに追加する
まとめ
最近発表された、curl の重大度の高い脆弱性は、リモートでコードが実行される可能性があるため懸念されていますが、現時点では重大なものとは考えられていません。この脆弱性の悪用は簡単ではなく、攻撃者はアクセス中の Web サイトを制御するか、curl に渡されるドメイン名を制御できる必要があります。また、ライブラリのバージョンが影響を受けるため複雑になり、実行時の検出が困難になります。代わりに、検出が容易で変更されにくい、エクスプロイト後の動作を探すことをお勧めします。
Sysdig Secure は、Kubernetes クラスターのベンチマークを実行し、PCI や NIST などのセキュリティ標準に準拠しているかどうかを確認するのに役立ちます。