Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
cve-2026-85706 — Root-cause分析、脆弱なDockerラボ、およびCVE-2026-85706(パーサー差異を利用したGitLabの未認証任意ファイル読み取り)のPoCスクリプト。 | Kitploit
ツール/GitHubGitHub/0xenesbayram/cve-2026-85706
脆弱性分析エクスプロイトウェブアプリケーション悪用ウェブセキュリティペネトレーションテスト学習と教育ラボと実践
GitHub0xenesbayram/cve-2026-85706

cve-2026-85706

Root-cause分析、脆弱なDockerラボ、およびCVE-2026-85706(パーサー差異を利用したGitLabの未認証任意ファイル読み取り)のPoCスクリプト。

リポジトリを見る
9時間24分前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2026-85706 — GitLab 未認証の任意ファイル読み取り

CVSS 10.0 · 未認証 · 活発に悪用中 (CISA KEV)

GitLab Workhorse (Go リバースプロキシ) と Puma/Grape (Ruby) の間のパーサー差異により、 未認証の攻撃者が Workhorse の高速アップロードハンドオフをバイパスし、攻撃者が制御する file.path を持つ 3 つのアップロードエンドポイントに到達でき、GitLab ホスト上で 任意のファイル読み取りが可能になります。

files の 1 文字を %66iles としてエンコードすると、Workhorse のアップロードルートは マッチしなくなり (Workhorse はエンコードされたパスでマッチする)、一方 Rails はそれを デコードして実際のハンドラに到達します (Rails はデコードされたパスでルーティングする)。 ハンドラは Workhorse が上書きするはずだった生の file.path パラメータを信頼するため、 file.path=/etc/passwd が認証情報なしでディスクから読み取られます。

root@kitploit:~
POST /api/v4/projects/1/repository/%66iles/x?file=&file.path=/etc/passwd&file.size=1
                                   ^^^^^^  Workhorse misses -> raw file.path survives to Rails

影響を受けるバージョン / 修正済みバージョン

バージョン
影響ありCE/EE 18.7 → 19.1.8, 19.2 → 19.2.6, 19.3 → 19.3.2
修正済み19.1.8 / 19.2.6 / 19.3.2 (2026-09-10)

このリポジトリの内容

パス内容
docs/ANALYSIS.md完全な根本原因分析 — パーサー差異、2 つの Workhorse JWT、生の file.path 信頼バグ、パッチ差分、およびリフレクトエラーによる外部流出チャネル。実際のソース (v19.3.1-ee 対 v19.3.2-ee) に対して分析を実施。
lab/Docker ベースの脆弱なラボ (gitlab-ce:19.3.1-ce.0) + 起動手順。
poc/detect.sh (非破壊的な存在オラクル) と exploit.sh (リフレクトエラーによるファイル読み取り)。単一ターゲット、認可ゲート付き。

背景 — GitLab のリクエストパイプライン

GitLab の内部に詳しくない方へ。リクエストが通過する順序で、各レイヤーが何をするかを以下に示します。 主要な概念を含むより詳細な用語集は docs/ANALYSIS.md §0 にあります。

root@kitploit:~
  Internet
     │
     ▼
 ┌────────┐     ┌───────────┐     ┌────────┐     ┌──────────────────────┐
 │ NGINX  │────▶│ Workhorse │────▶│  Puma  │────▶│  Grape / Rails app  │
 │(proxy) │     │   (Go)    │     │ (Ruby) │     │      (Ruby)         │
 └────────┘     └───────────┘     └────────┘     └──────────────────────┘
コンポーネント概要
NGINX最外層のリバースプロキシ。TLS を終端し、静的ファイルを配信し、それ以外をすべて内側に転送します。この脆弱性には直接関与しません。
WorkhorseGitLab 固有の Go リバースプロキシ。主な役割は、Ruby が苦手とする処理 — 特に大容量アップロードのストリーミング — をオフロードすることです。アップロードエンドポイントでは、Workhorse がボディを一時ファイルにバッファリングし、JWT に署名し、file.path を書き換えるため、Ruby が生のアップロードバイトを目にすることはありません。また、転送するすべてのリクエストにリクエストごとの Gitlab-Workhorse-Api-Request JWT を付与します (これは「プロキシを通過した」ことを証明するものであり、「このユーザーが認証済みである」ことを証明するものではありません)。
PumaRails アプリを実行する Ruby アプリケーションサーバー。Workhorse からリクエストを受け取り、ミドルウェア (Rack) を実行し、ルーターにディスパッチします。
RackRuby の Web サーバーインターフェース層。Rack ミドルウェアはクエリ文字列の解析、セッション管理、そして — ここで決定的に重要なのは — Workhorse のアップロード JWT の検証と UploadedFile オブジェクトの構築を処理します。Rack::Utils.parse_nested_query は、このエクスプロイトでエラーメッセージがファイル内容を漏洩させる関数です。
GrapeGitLab がすべての /api/v4/* エンドポイントに使用する REST API フレームワーク。ルート定義と、require_gitlab_workhorse! (プロキシチェック) や authenticate! (ユーザー ID チェック) などの before フィルタを提供します。Rails 上、Puma 上、Workhorse の背後で実行されるため、デコードされた URL パスを認識します。
Rails全体的な Web フレームワーク (Ruby on Rails)。GitLab は Rails モノリスであり、モデル、サービス、ミドルウェアはすべて Puma 内のここで実行されます。

この脆弱性は、Workhorse (エンコードされたパスでルートをマッチする) と Grape/Puma (デコードされたパスでルーティングする) の間のギャップに存在します。以下を参照してください。

メカニズムの要点

  1. パーサー差異。 Workhorse は r.URL.EscapedPath() (エンコード済み) でルートをマッチしますが、 Puma/Grape はデコードされたパスでルーティングします。Workhorse にとって %66iles は正規表現 files と 一致しませんが、Rails にとっては files にデコードされます。
  2. ハンドオフのスキップ。 アップロードルートがマッチしなかったため、Workhorse はボディを一時ファイルに バッファリングせず、file.path を署名済み一時パスに書き換えず、Gitlab-Workhorse-Multipart-Fields ヘッダーも設定しません — しかし、それでもリクエストをプロキシします (有効な Gitlab-Workhorse-Api-Request JWT 付きで)。
  3. 認証の欠如 + 生パラメータの信頼。 エンドポイントには authenticate! がなく、ハンドラは Workhorse が検証しパスを制限した params[:file] UploadedFile ではなく、params['file.path'] (攻撃者の文字列) を直接読み取っていました。
  4. エラーメッセージによる外部流出。 内容は Rack::Utils.parse_nested_query のエラー文字列 ("invalid %-encoding (<file bytes>)") を通じて漏洩します — レスポンスは最初の無効な % までの ファイルバイトをリフレクトします。

パッチは authenticate! を追加し、検証済みの UploadedFile に切り替え、e.message の リフレクトを停止します。docs/ANALYSIS.md §5 を参照してください。

クイックスタート

root@kitploit:~
# 1. Stand up the vulnerable lab (see lab/README.md for details)
cd lab && docker compose up -d      # wait ~5 min for GitLab to become healthy

# 2. Non-destructive detection
../poc/detect.sh http://localhost:8929

# 3. File-read PoC against a file you're authorized to read on your own lab
../poc/exploit.sh http://localhost:8929 /var/opt/gitlab/gitlab-rails/etc/gitlab.yml

⚠️ 責任ある使用

これは防御および教育目的で公開されています。すなわち、CISA KEV リストに掲載されている、 開示済みでパッチ適用済みの CVE を理解し、検出し、パッチを適用するためです。ここにあるスクリプトは 単一ターゲットであり、ターゲットを明示的に渡す必要があります。

  • これらはあなたが所有する、または明示的にテストを許可されているシステムに対してのみ実行してください。
  • ラボは localhost で実行するように設計されています。サードパーティのホストに向けないでください。
  • コンピュータシステムへの不正アクセスは、ほとんどの法域で違法です。

GitLab を運用している場合は、修正済みバージョンにアップグレードしてください — それが唯一の真の 修復策です。

参考文献

  • watchTowr — Rapid Reaction: GitLab Path Traversal (CVE-2026-85706)
  • Nuclei Templates — PR #17231
  • 一次ソース差分: gitlab-org/gitlab @ v19.3.1-ee 対 v19.3.2-ee

ライセンス

MIT — 分析および PoC コードのみ。GitLab は GitLab Inc. の商標です。この リポジトリは GitLab Inc. と提携しておらず、承認も受けていません。

ツールをダウンロード