
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
http_connection が OpenSSL::SSL::VERIFY_NONE を設定している。GitHub への HTTPS は依然として暗号化されるが、任意の証明書が受け入れられる。経路上の攻撃者が、CLI が送信する OAuth トークンを読み取り、被害者の gist を読み取り・変更できる。
| ID | CVE-2026-105221 |
| 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) |
| Product | gist |
| Affected | 4.0.0 から 6.0.0。ラボの固定バージョンは 6.0.0。6.1.0 で修正 (07ccc1a)。 |
| Auth | gist CLI に対する経路上 MITM |
| License | GNU Affero GPL v3.0 |
| Lab | 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 は存在しなかった。
lib/gist.rb の 6.0.0 における 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) になる。ラボトークン CVE-2026-105221-WITNESS が対応する ~/.gist.* ファイル内に存在する。gist 6.0.0 は TLS を完了し、スタブが Authorization: token CVE-2026-105221-WITNESS を捕捉して 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