重要なGitLab RCE脆弱性、JSONパーサー「Oj」に発見

隠されていたリモートコード実行の欠陥が明るみに

セルフホスト型のGitLabインストールに存在する重大なリモートコード実行(RCE)の欠陥が、約6週間にわたり隠されたままとなっていました。GitLabは6月10日に根本原因となる脆弱性にパッチを適用していたものの、当初この更新は単なる定型的な依存関係のメンテナンスリリースとしてしか分類していませんでした。最近になってセキュリティ研究チームdepthfirstが、権限を持たないユーザーが特別に細工されたJupyter Notebookファイルをアップロードするだけでサーバーを侵害できることを示す、完全に機能する概念実証(PoC)エクスプロイトを公開しました。実際に動作するデモはGitHubのGitLab RCE PoCリポジトリで確認できます。

この攻撃の実行には、管理者権限もGitLab Runnerへのアクセスも、他のユーザーを巻き込むソーシャルエンジニアリングも一切必要ありません。攻撃者に必要なのは、単一のプロジェクトに対する通常の書き込み権限だけです。悪意ある.ipynbファイルをコミットし、関連する差分表示(diff view)を閲覧させるだけで、エクスプロイトが自動的に発動します。この脆弱性は、脆弱なバージョンのOj Ruby gemを組み込んだビルドで稼働するセルフマネージド型GitLabインスタンスに影響を及ぼします。

Ojのメモリ破壊チェーンの内実

OjはRubyの高性能JSONパーサーで、C拡張によって大幅に最適化されています。研究者たちはこのライブラリ内に、境界外バッファ書き込みと、アドレス空間配置のランダム化(ASLR)を回避するためにメモリアドレスを漏洩させる情報開示の欠陥という、2つの異なるメモリ破壊の不具合を発見しました。この2つを組み合わせることで、攻撃者はシステムレベルのgitユーザー権限で任意のコマンドを実行できるようになります。

GitLabはJupyter Notebookファイルのバージョン差分を表示する際にOjパーサーを利用していました。差分生成の過程で、サーバーはユーザーが提供した生のファイル内容を、Pumaの主要ワーカープロセス内で動作するネイティブCパーサーに直接渡していました。構造的に不正な形式のJSONペイロードがヒープメモリを破壊し、プログラムの制御フローを乗っ取って任意のシステムコマンドを実行させていたのです。

企業環境への深刻な影響

gitサービスアカウントの侵害がもたらす結果は、単一リポジトリの侵害にとどまりません。この足がかりを得た攻撃者は、独自のソースコードを閲覧したり、Railsのシークレットを抽出したり、CI/CDパイプラインにアクセスしたり、認証トークンを読み取ったり、暗号署名鍵を収集したり、GitLabサーバーから到達可能な内部マイクロサービスへ横展開したりすることが可能になります。最終的な被害範囲は、ホストの構成や割り当てられたシステム権限に大きく左右されます。

影響を受けるバージョンと修正の経緯

この欠陥はGitLab Community Edition(CE)とEnterprise Edition(EE)の両方に、全ティアにわたって影響します。脆弱なリリースはバージョン15.2.0から18.10.7、18.11.0から18.11.4、および19.0.0と19.0.1に及びます。公式パッチはリリース18.10.8、18.11.5、19.0.2で導入され、修正済みのOjバージョン3.17.3が組み込まれています。GitLab.comは公開前に更新済みだったため、対応が必要となるのは主にセルフマネージド型サーバーの管理者です。

静かなパッチ適用をめぐる論争

業界の関心は、GitLabがこのセキュリティリスクをシステム管理者にどう伝えたかという点に強く注がれています。6月10日に公開されたリリースノートでは、Ojをバージョン3.17.3にアップグレードすることが、重大なセキュリティ更新としてではなく定型的なバグ修正の一つとして記載されていました。GitLabは専用のCVE識別子の割り当てを見送り、CVSSスコアも提示せず、この更新が高深刻度のRCE攻撃経路を緩和するものであることも開示していませんでした。一方で同じ告知の中では、より深刻度の低い他の脆弱性については専用のセキュリティ表で明確に詳細を説明していたのです。

セキュリティ勧告のセクションだけに目を通していた管理者は、この依存関係に緊急でパッチを当てる必要があることに気づかないままでした。パッチ適用から6週間後にあたる7月24日に機能するエクスプロイトが公開されたことで、パッチ未適用のセルフマネージド型インスタンスを取り巻く脅威は急激に高まりました。

depthfirstの研究者たちは当初、5月21日にこのメモリ破壊の欠陥をOjのメンテナーに報告しました。修正は5月27日にコードベースへマージされ、6月4日にOj 3.17.3のリリースへとつながりました。同研究チームは6月5日に完全なエクスプロイトチェーンをGitLabに提出し、ベンダー側は3日後に問題を検証、6月10日にパッチ済みビルドをリリースしています。実環境での悪用は当初確認されていませんでしたが、PoCが一般公開されたことで、直ちにパッチを適用することが不可欠となっています。

セルフマネージド型のGitLabサーバーを運用する管理者には、Ojライブラリまたは GitLabインスタンス自体を更新する以外にこの欠陥を緩和する代替策が存在しないため、直ちに最新のサポート対象リリースへ更新することが強く推奨されます。

翻訳元: https://meterpreter.org/gitlab-rce-vulnerability-oj-json-parser/

ソース: meterpreter.org