
CVE-2026-105221 - gist RubyGem - 高 - MITM - GitHub OAuthトークン窃取
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cve-2026-105221-gist-tls
gist RubyGem < 6.1.0 - defunkt
クラス: TLS検証バイパス(認証情報窃取) 到達範囲: リモート(on-path)
http_connection は OpenSSL::SSL::VERIFY_NONE を設定します。GitHubへのHTTPSは依然として暗号化されますが、あらゆる証明書が受け入れられます。on-pathの相手はCLIが送信するOAuthトークンを読み取り、被害者のgistを読み取り・変更できます。
| ID | CVE-2026-105221 |
| クラス | TLS検証バイパス(認証情報窃取) |
| 到達範囲 | リモート(on-path) |
| CWE | CWE-295 |
| CVSS | High: 7.4 CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N(VulnCheck 4.0: 9.1) |
| 製品 | gist |
| 影響範囲 | 4.0.0 から 6.0.0。ラボ固定バージョン 6.0.0。6.1.0 で修正(07ccc1a)。 |
| 認証 | gist CLIのon-path MITM |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ |
攻撃者は経路上に位置し、GitHubトークンを奪取します。
CN=mitm.invalid の自己署名証明書で十分です。Authorization: token ... を読み取る。 ログイン(gist --login)およびgistのアップロード・一覧表示・削除はすべて http_connection を経由します。~/.gist 内のトークンがそのソケットを通ります。gist スコープを持つGitHub OAuth認証情報です。プライベートgist、更新、削除が可能です。攻撃者にはネットワーク上の位置が必要です。悪意あるWi-Fi、プロキシ、中間に置かれたマシンなどです。これはサーバーに対する未認証のリモートRCEではありません。
6.1.0は VERIFY_PEER を設定します。同じ偽造証明書は certificate verify failed (self-signed certificate) で失敗し、トークンがクライアントから出ることはありません。
VulnCheckが CVE-2026-105221 を公開しました。報告者はSiyang Wuです。Issue 373 が公開チケットです。PR 374 が検証モードを変更しました。私は公開CVEをラボで再現しました。公開PoCは存在しませんでした。
6.0.0の lib/gist.rb の http_connection:
if uri.scheme == "https"
connection.use_ssl = true
connection.verify_mode = OpenSSL::SSL::VERIFY_NONE
end
6.1.0 では VERIFY_PEER です。
ループバックラボは、自己署名証明書を使用した偽の GitHub Enterprise HTTPS スタブです。GITHUB_URL=https://127.0.0.1:8443 を設定すると、gist は GHE モード(POST /api/v3/gists)になります。一致する ~/.gist.* ファイル内にラボトークン CVE-2026-105221-WITNESS が配置されています。gist 6.0.0 は TLS を完了し、スタブは Authorization: token CVE-2026-105221-WITNESS をキャプチャして証跡を書き込みます。同じスタブに対して gist 6.1.0 は TLS で失敗します。6.1.0 のキャプチャ回数はゼロのままです。api.github.com とは一切通信しません。
SUCCESS CVE-2026-105221 vuln-tls=ok token-captured=1 patched-tls=fail witness-written=yes CVE-2026-105221-WITNESS
誤ったターンはまだ記録されていない。最初の run.sh は SUCCESS を出力した。リバースシェル。芝居だ。オラクルは 6.0.0 でキャプチャされたラボトークンと、6.1.0 での自己署名 TLS エラーである。
cd lab
./run.sh
対象は https://127.0.0.1:18210(コンテナ 8443)のみです。run.sh は RubyGems から gist 6.0.0 と 6.1.0 をインストールし、コンテナ内でスタブを提供した後、スタックを破棄します。自己署名証明書を使用します。実際の GitHub は使用しません。
gist gem を 6.1.0 以降にアップグレードしてください。
lib/gist.rb v6.0.0 L466-L468