
GitLab CVE-2026-85706 - CVSS 10.0の未認証任意ファイル読み取りとCISA KEV追加、19.3.2/19.2.6/19.1.8で修正
パストラバーサルや認可不備の原理を体系的に学べる定番。
GitLabの運用・アップグレード実務を押さえる一冊。
侵害の疑いがある時の調査と封じ込めの流れを学べる。
当サイトは Amazon.co.jp を宣伝しリンクすることで紹介料を得る手段を提供する、Amazonアソシエイト・プログラムの参加者です。価格・在庫はリンク先の最新情報をご確認ください。
はじめに
GitLabは2026年9月10日、Community Edition(CE)とEnterprise Edition(EE)向けに19.3.2・19.2.6・19.1.8を「Critical Patch Release」として公開しました。修正されたCVEは合計18件で、そのうち最も深刻なCVE-2026-85706は、未認証の攻撃者がGitLabサーバー上の任意のファイルを読み取れるパストラバーサルです。GitLab自身が付けたCVSSスコアは最大値の10.0です。
公開翌日の9月11日には、米CISAがこのCVEをKnown Exploited Vulnerabilities(KEV)カタログに追加しました。セキュリティ企業watchTowrも、パッチ公開後まもなくインターネット上でこの脆弱性を狙ったプローブ(探索的なリクエスト)を観測したと発表しています。
GitLab.comとGitLab Dedicatedの利用者は対応不要です。一方、Self-managed環境ではアップグレードに加えて、すでに読まれた可能性を前提にしたログ調査とシークレットの棚卸しが必要になります。本記事では、GitLab公式のパッチリリースノート・NVD・CISA KEVを一次情報として、今回のリリースの内容と対応手順を整理します。7月の定例リリースについてはGitLab 19.2.1/19.1.3/19.0.5セキュリティリリースの解説で扱っているので、本記事では9月のリリース固有の内容に絞ります。
リリース概要(早見表)
| 項目 | 内容 |
|---|---|
| リリース日 | 2026年9月10日(GitLab公式リリースノートの日付) |
| リリース名 | GitLab Critical Patch Release: 19.3.2, 19.2.6, 19.1.8 |
| 修正CVE件数 | 18件(Critical 2件、High 6件、Medium 9件、Low 1件) |
| 最も深刻なCVE | CVE-2026-85706(リポジトリコミットAPIのパストラバーサル、CVSS 10.0、未認証) |
| 次点 | CVE-2026-87719(GraphQL subscriptionの安全でないデシリアライズ、CVSS 9.9、EEのみ) |
| CISA KEV | CVE-2026-85706を2026年9月11日に追加(米連邦機関向けの対応期限は2026年9月14日) |
| GitLab.com(SaaS) | パッチ適用済み。利用者側の対応は不要 |
| GitLab Dedicated | 対応不要 |
| Self-managed | ただちにアップグレードすることを強く推奨(公式) |
| ダウンタイム | DBマイグレーションを含むため、シングルノード構成は停止が発生。マルチノード構成はゼロダウンタイム手順で回避可能 |
GitLabの定例パッチリリースは毎月第2・第4水曜に出ますが、今回の9月10日は木曜で、タイトルにも「Critical」と付いています。脆弱性の詳細Issueは、パッチ公開の90日後にIssueトラッカーで公開される運用のため、2026年9月13日時点では技術的な詳細の多くがまだ公開されていません。
18件のCVE一覧
公式リリースノートに掲載されている18件を、深刻度順にまとめます。修正バージョンはいずれも19.1.8・19.2.6・19.3.2です。
| CVE | タイトル | CVSS | 深刻度 | 対象 | 影響開始バージョン |
|---|---|---|---|---|---|
| CVE-2026-85706 | リポジトリコミットAPIのパストラバーサル | 10.0 | Critical | CE/EE | 18.7 |
| CVE-2026-87719 | GraphQL subscriptionシリアライザの安全でないデシリアライズ | 9.9 | Critical | EEのみ | 18.3 |
| CVE-2026-88765 | Unicode変換ラッパーのバッファオーバーフロー | 8.5 | High | EEのみ | 12.3 |
| CVE-2026-79708 | Scheduled Pipeline Execution PolicyのテストでのCI/CD変数アクセス | 8.5 | High | EEのみ | 19.0 |
| CVE-2026-78252 | Markdown JSONテーブルレンダラーのXSS | 8.2 | High | CE/EE | 15.3 |
| CVE-2026-13210 | CI/CD変数の環境スコープの認可不備 | 7.7 | High | CE/EE | 15.7 |
| CVE-2025-14871 | GraphQL複雑度リミッターのDoS | 7.5 | High | CE/EE | 18.4.6 |
| CVE-2026-1168 | GraphQL複雑度リミッターのDoS | 7.5 | High | CE/EE | 18.4.6 |
| CVE-2024-11222 | マージリクエストパイプラインの競合状態 | 6.4 | Medium | CE/EE | 13.0 |
| CVE-2026-12910 | SAML SSO強制の認証不備 | 5.4 | Medium | CE/EE | 18.6 |
| CVE-2026-82837 | Workhorse senddataでの認証情報保護不備 | 5.3 | Medium | CE/EE | 10.1.0 |
| CVE-2026-19619 | Content EditorのXSS | 4.7 | Medium | CE/EE | 19.0 |
| CVE-2026-86341 | 保護環境の承認ルールのアクセス制御不備 | 4.4 | Medium | EEのみ | 17.1 |
| CVE-2026-86340 | 保護環境の承認の認可バイパス | 4.4 | Medium | EEのみ | 17.1 |
| CVE-2026-7514 | Generic Package Registryの認可欠如 | 4.3 | Medium | CE/EE | 13.9 |
| CVE-2026-8030 | Namespace移管時の入力検証不備 | 4.3 | Medium | CE/EE | 13.0 |
| CVE-2026-16794 | Compliance Frameworkの認可欠如 | 4.3 | Medium | EEのみ | 18.11 |
| CVE-2026-3855 | Terraform State APIの入力検証不備 | 3.1 | Low | CE/EE | 18.2.7 |
影響範囲の書き方はどのCVEも共通で、「影響開始バージョンから19.1.8未満、19.2系は19.2.6未満、19.3系は19.3.2未満」です。報告者はCVE-2026-86341/86340(GitLab社内で発見)を除き、HackerOne経由の外部研究者です。
注目CVEの技術解説
CVE-2026-85706: リポジトリコミットAPIのパストラバーサル(CVSS 10.0)
公式リリースノートの説明は「一定の条件下で、パスの閉じ込め(path confinement)が不適切で、かつ認証の強制が欠けていたため、未認証ユーザーがGitLabサーバーから任意のファイルを読み取れた」というものです。対象はCE/EEの両方で、影響範囲は18.7以降、19.1.8未満・19.2.6未満・19.3.2未満です。報告者はHackerOneのs3ntago氏です。
| 項目 | 内容 |
|---|---|
| CVSSベクター | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:N |
| CWE | NVD上のGitLab(CNA)評価はCWE-22、CISA KEVのエントリはCWE-35 |
| NVD公開日時 | 2026-09-12T03:16(UTC) |
| 発見者 | s3ntago(HackerOne) |
問題の「リポジトリコミットAPI」は、本来はトークンで認証したうえでPOST /api/v4/projects/:id/repository/commitsを呼び、actions配列でファイルの作成・更新・移動・削除をまとめて1コミットにするためのAPIです。各アクションにはfile_pathやprevious_pathといったリポジトリ内のパスを指定します。
GitLabの説明から読み取れるのは、次の2つの欠陥が重なっていたという点です。
- 認証の強制漏れ: 本来は認証とプロジェクト権限が必要な処理に、未認証のまま到達できた
- パスの閉じ込め不備: 指定されたパスが「リポジトリ内」に収まっているかの検証が不十分で、
../のような相対パス要素などを使ってサーバーのファイルシステム上の任意のファイルを指せた
一般にパストラバーサルは、ユーザー入力のパスを正規化してから「許可されたベースディレクトリ配下か」を判定する処理が抜けていたり、正規化の前後で判定がずれていたりすると発生します。今回の脆弱性の具体的なコードの欠陥、どのパラメーターがどう解釈されたのか、GitLabの言う「一定の条件」が何を指すのか(プロジェクトの公開設定などが関係するか)は、2026年9月13日時点では公開されておらず未確認です。また、説明文は「読み取り」だけを挙げているのに、CVSSベクターでは完全性(I)もHighになっています。この理由も公式には説明されていません(未確認)。
読み取れるのは「GitLabのサービスアカウントが読めるファイル」です。報道では、認証情報・シークレット・アクセストークン・SSH鍵・設定データが漏えいしうると指摘されています。一般論として、Linux package(Omnibus)構成では、Railsアプリケーションが起動時に読む/var/opt/gitlab/gitlab-rails/etc/配下の設定ファイル(secrets.ymlやdatabase.ymlなど)をサービスアカウントが読めるはずです。そのため、暗号鍵やDB接続情報が読まれた前提で影響を評価するのが安全です。
悪用状況は次のとおりです。
- CISA KEV: 2026年9月11日にカタログへ追加されました。KEVは実際に悪用された証拠がある脆弱性を載せるカタログです。エントリの
forensicTriageはYesになっています。 - watchTowr: 2026年9月11日付の速報で、自社のハニーポット網でこの脆弱性を狙ったプローブを観測したと発表しました。攻撃者はすでに脆弱性をリバースエンジニアリングして再現しているとの見立ても示しています。
- GitLab公式リリースノート: 悪用の有無には触れていません(9月13日時点で確認した範囲)。
- 侵害に成功した具体的な被害事例: 本記事の執筆時点では確認できていません(未確認)。
プローブの開始日時は、報道によって9月10日とするものと9月11日とするものがあり、一次情報では特定できませんでした(要確認)。
CVE-2026-87719: GraphQL subscriptionの安全でないデシリアライズ(CVSS 9.9、EEのみ)
こちらは認証済み、かつDuo Chatを使えるユーザーが前提です。細工したGraphQL subscriptionの引数を使うと、シリアライズ処理を迂回してサーバー側でオブジェクトを参照できてしまいます。その結果、Advanced Searchのインスタンス設定や機密性の高い認証情報を取得できるとされています。影響範囲はEEの18.3以降(19.1.8未満・19.2.6未満・19.3.2未満)で、CVSSベクターはCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H、CWEはCWE-502です。
Advanced Searchは外部の検索基盤(Elasticsearch/OpenSearch)に接続する機能なので、その認証情報が漏れると、検索インデックスに入っているソースコードやIssueの内容まで芋づる式に危険にさらされます。EEでDuo Chatを有効にしている組織は、CVE-2026-85706と同じ優先度で扱うべきです。
CVE-2026-88765: Unicode変換バッファのオーバーフローによるRCE(CVSS 8.5、EEのみ)
今回のリリースで、公式にリモートコード実行(RCE)と明記されているのはこの1件です。認証済みユーザーが細工したGitプロジェクトのエクスポートファイルをインポートすると、Advanced Searchのインデックス作成で使うUnicode変換バッファがオーバーフローし、コード実行に至るとされています。影響範囲はEEの12.3以降と非常に広く、CVSSベクターはCVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:H/A:Hです。攻撃の複雑さ(AC)はHighです。
未認証ではありませんが、プロジェクトをインポートできる一般ユーザーの権限で到達できる点が問題です。サインアップを誰にでも開放しているインスタンスでは、攻撃の前提になるハードルは低くなります。アップグレードまでの暫定策としてインポート元(Import sources)の設定を絞ることが有効かどうかは、公式には示されていません(要確認)。
なお、報道の一部には今回のリリースで「RCEにつながりうる脆弱性」が修正されたとするものがあります。GitLab公式リリースノート上でRCEと明記されているのはCVE-2026-88765のみで、CVE-2026-85706との連鎖(ファイル読み取りで得た情報を足がかりにRCEへ至る攻撃チェーン)は、公式にも観測情報としても確認できていません(未確認)。
その他15件の概要
CI/CD変数・パイプライン系(4件): CVE-2026-79708(Developer権限で、上位ロール限定の保護CI/CD変数にポリシーのテストパイプライン経由でアクセスできる)、CVE-2026-13210(環境スコープのパターンマッチの不備で、別環境向けのCI/CD変数を読める)、CVE-2026-16794(Security Managerロールが任意のCI/CDジョブを実行し、保護変数にアクセスできる)、CVE-2024-11222(パイプライン作成時の競合状態で、他人のマージリクエストのコミットの文脈で操作できる)です。CI/CD変数にはデプロイ用のクラウド認証情報が入っていることが多く、CVSSの数値以上に実害が大きくなりやすい領域です。
認証・認可系(5件): CVE-2026-12910(SAML SSOのサインイン制限を回避してSSOなしで認証できる)、CVE-2026-82837(Workhorseの内部データ出力エンドポイントの認可不備で、プロキシを経由せずに認証情報やトークンにアクセスできる)、CVE-2026-86341/86340(保護環境の承認ルールの不備)、CVE-2026-7514(Generic Package RegistryでDeveloperがパッケージの中身を差し替えたり隠したりできる)です。
XSS・DoS・入力検証系(6件): CVE-2026-78252(Markdown JSONテーブルレンダラーのXSSで、意図しない状態変更リクエストを送らせる)、CVE-2026-19619(Content EditorにHTMLを貼り付けたときのサニタイズ不備によるXSS)、CVE-2025-14871とCVE-2026-1168(GraphQL複雑度リミッターの不備によるDoS)、CVE-2026-8030(Namespace移管時のURLスラッグ検証不備)、CVE-2026-3855(Terraform stateのアップロードでサーバー上のファイルを読める、またはDoSを起こせる)です。
自分の環境が影響を受けるか確認する手順
GitLab.com(SaaS)・Dedicated利用者
対応は不要です。公式リリース時点で、GitLab.comにはパッチが適用済みです。
Self-managed利用者: バージョンを確認する
管理者エリアのダッシュボードで確認するのが最も手軽です。APIで確認する場合は、トークンを使ってMetadata APIを呼びます。
curl --header "PRIVATE-TOKEN: <アクセストークン>" \
"https://gitlab.example.com/api/v4/metadata"Linux packageでインストールしている場合は、サーバー上で次のコマンドでも確認できます。
sudo gitlab-rake gitlab:env:infoCVE-2026-85706について、確認したバージョンが次のいずれかに当てはまれば影響を受けます。
- 18.7以上で19.1.8未満(19.0系と18.7から18.11の各系列には今回の修正版がありません)
- 19.2系で19.2.6未満
- 19.3系で19.3.2未満
18.7より古いバージョンはCVE-2026-85706の影響範囲外です。ただし、CVE-2026-88765(EEは12.3以降)をはじめ、ほかのCVEの影響は受けます。そもそもサポート対象外のバージョンなので、アップグレードが必要なことに変わりはありません。
悪用の痕跡を調べる
watchTowrは検知の手がかりとして、「/api/v4/projects/:id/repository/commits/へのHTTP POSTリクエストで、file.pathパラメーターを含むもの」をログから探すよう推奨しています(Field Effectなどの報道でも同じ指針が紹介されています)。Linux package構成なら、まず次の2つのログを確認します。
# nginxのアクセスログ(ローテート済みの.gzも含めて検索)
sudo zgrep -E '"POST /api/v4/projects/[^/]+/repository/commits' /var/log/gitlab/nginx/gitlab_access.log*
# Rails APIの構造化ログ(記録されるパラメーターは設定・バージョンにより異なる)
sudo zgrep -E '"method":"POST".*repository/commits' /var/log/gitlab/gitlab-rails/api_json.log* | grep 'file.path'nginxのデフォルトのアクセスログにはリクエストボディが残らないので、パラメーターの中身まではわかりません。そこで次の順に絞り込みます。
- アクセスログで、未認証のPOSTや、普段コミットAPIを使わない送信元IPからのPOSTを探す
api_json.logの該当時刻のレコードで、ユーザーIDが空(未認証)のもの、ステータスコード、パラメーターの記録内容を照合する- 一連のリクエストの前後で、同じ送信元から別のエンドポイントへのアクセスがないかを確認する
Docker構成では、コンテナ内の/var/log/gitlab(またはマウント先)が対象です。Helm chart構成では、webserviceのPodログが対象になります。ログの保持期間が短い環境では、パッチ公開の9月10日前後のログが残っているうちに退避しておいてください。
アップグレード手順
- 移行先を決める: 19.3系なら19.3.2、19.2系なら19.2.6、19.1系なら19.1.8へ上げます。19.0系や18.7から18.11の系列は同じ系列内に修正版がないため、19.1.8以降へのアップグレードが必要です。
- アップグレードパスを確認する: 公式のUpgrade Pathツールで、必須の中間バージョン(required stop)を経由する必要があるか確認します。18系から上げる場合に具体的にどのバージョンを経由するかは、利用中のバージョンによって変わるので、ツールで確認してください。
- ダウンタイムを計画する: 今回のパッチはDBマイグレーションを含みます。シングルノード構成ではマイグレーション完了まで停止します。マルチノード構成はゼロダウンタイム手順で無停止にできます。19.3.2にはアップグレード後に実行できるpost-deploy migrationも含まれます。
- 適用までの暫定措置: すぐに上げられない場合は、インスタンスをインターネットから切り離す(VPNや社内ネットワーク経由のアクセスに限定する)ことを検討してください。watchTowrも、パッチを当てられない場合は公開アクセスを外すよう呼びかけています。WAFでコミットAPIへの未認証POSTを遮断する方法も考えられますが、GitLab公式の回避策としては示されていません(要確認)。
- 本番適用と確認: apt/yum、Docker、Helm chartなど、使っている方式の標準手順で更新し、更新後にもう一度バージョンを確認します。
防御策・教訓
「パッチを当てたら終わり」ではない: 任意ファイル読み取りは、攻撃を受けても痕跡がログ以外に残りにくい脆弱性です。9月10日以前からインターネットに公開していたインスタンスは、読まれた可能性を前提に、次のようなシークレットの棚卸しとローテーションを検討してください。
- 管理者や連携用のPersonal/Project/Group Access Token
- Runnerの認証トークン
- CI/CD変数に入っているクラウド認証情報
- LDAPバインド、SMTP、オブジェクトストレージなど、外部連携の認証情報
- DBのパスワード
Railsのdb_key_baseなどの暗号鍵は、DB内の暗号化データの復号に使われています。無計画に差し替えるとCI/CD変数などが読めなくなるおそれがあるので、公式ドキュメントやサポートを確認したうえで計画的に進めてください。Gitまわりでシークレットが漏れる典型パターンはleak-museumのシークレット漏えいパターン集にまとめています。
パス検証は「正規化してからベースディレクトリ配下か判定する」: パストラバーサルは古典的な脆弱性ですが、今も成熟したプロダクトで繰り返し見つかっています。自社で開発するAPIでも、ユーザー入力のパスは正規化(シンボリックリンクの解決を含む)してから許可されたディレクトリ配下かを判定することを徹底してください。認証チェックはルーティング層でデフォルト拒否にし、個別のエンドポイントで付け忘れても素通りしない構造にしておくと、今回のような2つの欠陥の重なりを防げます。開発ツールに潜むパストラバーサルの別事例として、pnpmのパッチ機能のCVE-2026-50015も参考になります。
開発基盤はインターネットに直接公開しない: Gitサーバーやアーティファクトリポジトリには、ソースコード・CI/CD変数・デプロイ用の認証情報が集中しています。今年もJFrog ArtifactoryのCVE-2026-82329のように、開発基盤の未認証脆弱性が実際に悪用されました。外部の協力会社がアクセスする必要がある場合も、VPNやゼロトラスト型のアクセスプロキシの背後に置くことで、今回のような未認証脆弱性の露出を大きく減らせます。自前で運用するかどうかの判断材料はセルフホスト型Gitサーバーの比較記事でも扱っています。
KEV追加を「最優先」のトリガーにする: 今回はパッチ公開の翌日にKEVへ追加され、米連邦機関向けの対応期限はわずか3日後の9月14日でした。CVSSの数値だけでなく、KEVへの追加やプローブの観測報告を監視し、定例のメンテナンス枠を待たずに適用できる体制を整えておくことが重要です。
まとめ
- GitLabは2026年9月10日、Critical Patch Releaseの19.3.2・19.2.6・19.1.8で、18件のCVE(Critical 2・High 6・Medium 9・Low 1)を修正しました。
- CVE-2026-85706(CVSS 10.0)は、リポジトリコミットAPIでの認証強制の欠如とパスの閉じ込め不備により、未認証で任意ファイルを読み取れる脆弱性です。影響は18.7以降のCE/EEです。
- CISAは9月11日にCVE-2026-85706をKEVへ追加し、watchTowrはプローブの観測を報告しています。侵害に成功した具体的な事例や「一定の条件」の中身は未確認です。
- EEでは、Duo Chat利用者が認証情報を取得できるCVE-2026-87719(CVSS 9.9)と、プロジェクトのインポートからRCEに至るCVE-2026-88765(CVSS 8.5)にも注意が必要です。
- 19.0系と18.7から18.11の系列には修正版がないため、19.1.8以降へ上げる必要があります。
- アップグレード後も、コミットAPIへの未認証POSTのログ調査と、サービスアカウントが読めたシークレットのローテーションを計画してください。
参考リンク
- GitLab Critical Patch Release: 19.3.2, 19.2.6, 19.1.8(GitLab公式リリースノート)
- GitLab Critical Patch Release: 19.3.2, 19.2.6, 19.1.8(GitLab公式フォーラム)
- CVE-2026-85706(NVD)
- CVE-2026-87719(NVD)
- Known Exploited Vulnerabilities Catalog(CISA)
- Commits API(GitLab公式ドキュメント)
- Metadata API(GitLab公式ドキュメント)
- Upgrade paths(GitLab公式ドキュメント)
- Upgrade Path tool(GitLab Support)
- CWE-22: Improper Limitation of a Pathname to a Restricted Directory(MITRE)
- GitLab fixes critical vulnerability as internet-wide probing begins(Field Effect)
- GitLab CVSS 10 File-Read Flaw Draws In-the-Wild Probes After Disclosure(The Hacker News)
- GitLab 19.2.1/19.1.3/19.0.5セキュリティリリース
- JFrog Artifactory CVE-2026-82329 - CVSS 9.8の認証バイパスと実環境での悪用
- pnpmのパッチ機能に潜むパストラバーサル - CVE-2026-50015とは何か
- leak-museumを公開 - gitでシークレットを漏らす26の悪例
- セルフホスト型Gitサーバー OSS比較


