
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는 여전히 암호화되지만, 어떤 인증서든 수용됩니다. 경로 상의 상대방은 CLI가 전송하는 OAuth 토큰을 읽은 뒤, 피해자의 gist를 읽고 변경할 수 있습니다.
| ID | CVE-2026-105221 |
| 분류 | TLS 검증 우회 (자격 증명 탈취) |
| 도달 범위 | 원격 (경로 상, on-path) |
| CWE | CWE-295 |
| CVSS | 높음: 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는 없었습니다.
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의 캡처 횟수는 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