
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) |
| 제품 | gist |
| 영향받는 버전 | 4.0.0부터 6.0.0까지. 랩 고정 버전 6.0.0. 6.1.0에서 수정됨 (07ccc1a). |
| 인증 | gist CLI의 경로 상 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가 보고했습니다. 이슈 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)로 전환합니다. 랩 토큰 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의 캡처 횟수는 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