
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. HTTPS к GitHub по-прежнему шифрует трафик, но принимается любой сертификат. Злоумышленник на пути трафика может прочитать OAuth-токен, который отправляет CLI, а затем читать и изменять gists жертвы.
| 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). |
| Аутентификация | MITM on-path для CLI gist |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1 |
Злоумышленник находится на пути трафика и перехватывает токен GitHub.
CN=mitm.invalid.Authorization: token .... Вход (gist --login) и загрузка/список/удаление gists проходят через http_connection. Токен из ~/.gist передаётся по этому же сокету.gist. Приватные gists, обновления, удаления.Злоумышленнику нужна сетевая позиция: враждебный 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 http_connection в 6.0.0:
if uri.scheme == "https"
connection.use_ssl = true
connection.verify_mode = OpenSSL::SSL::VERIFY_NONE
end
6.1.0 — это VERIFY_PEER.
Loopback-стенд представляет собой поддельный HTTPS-заглушку GitHub Enterprise с самоподписанным сертификатом. 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 и записывает свидетельство. 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 и ошибка самоподписанного TLS на 6.1.0.
cd lab
./run.sh
Нацелено только на https://127.0.0.1:18210 (контейнер 8443). run.sh устанавливает gist 6.0.0 и 6.1.0 из RubyGems, запускает заглушку внутри контейнера, а затем разбирает стек. Самоподписанный сертификат. Настоящий GitHub не используется.
Обновите gem gist до версии 6.1.0 или более поздней.
lib/gist.rb v6.0.0 L466-L468