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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
ツール/GitHubGitHub/guneykabel/cve-2026-85706
脆弱性分析エクスプロイトウェブアプリケーション悪用情報収集セキュリティ仮想化ウェブセキュリティペネトレーションテスト
GitHubguneykabel/cve-2026-85706

cve-2026-85706

CVE-2026-85706(GitLab CE/EEにおけるWorkhorseのパスエンコーディングバイパスを悪用した未認証の任意ファイル読み取り)のPython PoCエクスプロイト。解説記事とバイパス手法のバリエーション付き。

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

人気

すべて見る →

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

すべてのツールを探索

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

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

cve-2026-85706

GitLab CE/EE における未認証の任意ローカルファイル読み取り。18.7~19.1.7、19.2.0~19.2.5、19.3.0~19.3.1 に影響。19.1.8 / 19.2.6 / 19.3.2 で修正済み(2026-09-10)。CVSS 10.0、実環境で悪用が報告されている。原報告は s3ntago によるもので、このリポジトリは私の writeup と PoC にすぎない。

免責事項

この PoC は教育および防御的研究目的のみで公開されている。管理者や研究者がこの脆弱性を理解し、テストするためのものである。所有しているシステム、またはテストに対する明示的な書面による許可を得たシステムに対してのみ実行すること。あなたのインスタンスが影響範囲に該当するなら、読むのをやめてまず 19.1.8 / 19.2.6 / 19.3.2 にパッチを適用すること。

仕組み

3 つのリポジトリエンドポイント(POST :id/repository/commits、POST/PUT :id/repository/files/:file_path)は Workhorse の requestBodyUploader の背後にある。Rails ハンドラは生の file.path リクエストフィールドからディスク上のパスを直接読み取り、認証より前に File.open する。require_gitlab_workhorse! は認証として機能しない。Workhorse の署名ラウンドトリッパーはプロキシするすべてのリクエストに有効な JWT を付与するため、汎用 API プロキシにフォールスルーするものはすべてこのチェックを通過する。

Gitlab-Workhorse-Api-Request

これが誰にとっても即座の LFI にならない唯一の理由は、Workhorse が本来リクエストを先に書き換えるはずだからである。しかしそのルート正規表現はエスケープされたパス(EscapedPath() と、決して %XX をデコードしない path.Clean クローン)に対してマッチする一方、Puma は Grape ルーティングの前に %XX をデコードする。したがって、静的セグメントの任意の文字をパーセントエンコードし(%63ommits、%72epository、%66iles)、末尾にスラッシュを付け、あるいは Workhorse の正規表現が取りこぼす .json を付ければ、Rails は依然として脆弱なハンドラにルーティングする。このエンコーディングの不一致こそがバイパスの在り処である。(//、/./、%2F、; のような変種は機能しない。path.Clean が最初の 2 つを正規化し、Puma が %2F を拒否するからである。)

あとは偽造した未署名のアップロードメタデータをクエリパラメータとして送るだけである:

root@kitploit:~
POST /api/v4/projects/1/repository/%63ommits?file=&file.path=<ABSOLUTE_PATH>&file.size=1&Content-Type=application/x-www-form-urlencoded

file= を空にすると requires :file, WorkhorseFile バリデーションを満たす(空は nil に強制変換される)。読み取りは認証前に発火する。バイト列を取り戻すのが面白いところである:urlencoded 分岐ではヘルパーが Rack::Utils.parse_nested_query(File.read(path)) を実行し、パーサエラーを 400 ボディに補間する。2 桁の 16 進数が続かない % は InvalidParameterError: invalid %-encoding (<raw file bytes>) を発生させ、ファイル内容がエラーメッセージ内に返ってくる。JSON 分岐(Oj)は何も漏らさない。だからここでは urlencoded の content type が重要なのである。

修正(master 0d9ce3e7、バックポート 1fe30154 / b43c8b26 / 0ff7b6b2)は、3 つのエンドポイントすべてに authenticate! を追加し、さらに /authorize の前段ステップを追加し、パス/サイズについてはミドルウェアが生成した UploadedFile のみを信頼し、パーサエラーのエコーを停止する。このバグは 2025 年 12 月に導入された。だから影響範囲が 18.7 から始まるのである。

使い方

root@kitploit:~
./exploit.py --url http://localhost:8080 --file /etc/hostname
./exploit.py --url http://localhost:8080 --file /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml

このスクリプトは検証済みのすべてのバイパス形式(エンコードされたセグメント、末尾スラッシュ、.json;commits + files エンドポイント、POST と PUT)を順に試し、各レスポンスを分類するので、チェーン内のどこでプローブが失敗したかを判別できる。言うまでもなく、許可されたターゲットに対してのみ。

欠陥 / 制限 / 前提条件

  • エコーは、ファイルに 2 桁の 16 進数が続かない % が含まれている場合にのみ発火する。
  • リーク正規表現は貪欲である(ボディ内の最後の ) までの (.*))。標準の JSON エラーに対しては問題ないが、手前の何かがレスポンスを HTML でラップしていると過剰にキャプチャする。適切な修正は JSON の message フィールドをパースすることである。
  • Commits API には匿名で読み取り可能なプロジェクト id が必要である(そうでなければ before ブロックが 404 になる)。

参考資料

  • 修正コミット(master): https://gitlab.com/gitlab-org/gitlab/-/commit/0d9ce3e758a85f0690be751e213625f7902c0361
  • パッチリリースノート: https://docs.gitlab.com/releases/patches/patch-release-gitlab-19-3-2-released/
  • writeup: https://securityonline.info/gitlab-vulnerabilities-cve-2026-85706-cvss-10/
ツールをダウンロード