Дата публикации: 17 декабря 2020 г.
Текущий статус : уязвимость полностью исправлена в официальных репозиториях большинства дистрибутивов Linux, однако устаревшие системы всё ещё могут быть подвержены атаке.
Содержание
- Общее описание
- Технические детали
- Влияние и степень риска
- Затронутые продукты и версии
- Меры по устранению и рекомендации
- Как обнаружить эксплойт
- Ссылки и источники
Общее описание
Уязвимость CVE‑2020‑29652 относится к nil‑pointer dereference (разыменование нулевого указателя) в компоненте golang.org/x/crypto/ssh, который используется в проектах, написанных на языке Go. Ошибка позволяет удалённому злоумышленнику вызвать отказ в обслуживании (Denial‑of‑Service, DoS) на SSH‑сервере, работающем с уязвимой версией библиотеки.
Уязвимость получила внутренний кодовое имя «Команда 29652», что отражает её идентификационный номер в базе данных Rapid7.
Ключевые параметры CVSS‑3.1
- Базовый балл: 7.5
- Вектор:
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Тип воздействия: Отказ в обслуживании (High)
Технические детали
2.1 Что происходит в коде?
Компонент golang.org/x/crypto/ssh реализует клиентскую и серверную часть протокола SSH. В версии v0.0.0‑20201203163018‑be400aefbc4c (и более ранних) в функции, отвечающей за обработку входящих запросов, происходит следующее:
func (c channel) handleRequest(req ssh.Request) {
if req == nil {
// Ошибка: попытка обращения к полям nil‑структуры
panic("nil request")
}
// ...
}
Если клиент отправит специально сформированный запрос, сервер получит nil вместо ожидаемого объекта ssh.Request. При попытке обращения к полям структуры произойдёт panic, который в Go по умолчанию приводит к завершению горутины. Если такая паника не перехвачена, процесс SSH‑демона завершается, что и приводит к DoS.
2.2 Почему это работает удалённо?
- Атака не требует аутентификации (PR:N – Privilege Required: None).
- Запрос может быть отправлен по сети без какого‑либо пользовательского взаимодействия (UI:N – User Interaction: None).
- Только наличие открытого SSH‑порта (обычно 22) достаточно для эксплуатации.
2.3 Пример эксплойта (псевдокод)
package main
import (
"golang.org/x/crypto/ssh"
"net"
)
func main {
conn, _ := net.Dial("tcp", "victim;example.com:22")
client, _ := ssh.NewClientConn(conn, "", &ssh.ClientConfig{
HostKeyCallback: ssh.InsecureIgnoreHostKey,
})
// Отправляем запрос с нулевым payload, вызывающий nil‑pointer
client.SendRequest("malformed", true, nil)
}
В реальном мире эксплойт обычно упаковывается в скрипт python или bash и распространяется как часть сканирующего инструмента.
Влияние и степень риска
Уязвимость не позволяет получить привилегированный доступ, украсть данные или выполнить произвольный код. Однако её высокий CVSS‑балл обусловлен тем, что она приводит к полной недоступности SSH‑службы, что критично для:
- Серверов управления инфраструктурой (CI/CD, Ansible, Terraform).
- Удалённого доступа к облачным и виртуальным машинам.
- Контейнерных оркестраторов, использующих SSH для деплоя (Kubernetes, Docker).
Для организаций, где SSH является единственным каналом администрирования, отказ в обслуживании может привести к простоям, потере SLA и дополнительным затратам на восстановление.
Затронутые продукты и версии
Уязвимость распространяется через библиотеку golang.org/x/crypto/ssh, которая включена в множество пакетов и дистрибутивов. Ниже – основные платформы, где уязвимость была зафиксирована, а также рекомендации по обновлению.
| ОС / Платформа | Пакет (пример) | Решение (обновление) | Дата добавления в базу | Дата публикации CVE |
|---|---|---|---|---|
| AlmaLinux | criu, udica, fuse‑overlayfs, conmon, … | Обновить до версии, содержащей исправление golang‑misc ≥ 1.15.7 | 4 мая 2022 | 17 декабря 2020 |
| Amazon Linux AMI 2 | golang‑misc, golang‑bin, golang‑src | Обновить до golang‑1.15.7 или новее | 30 сентября 2022 | 17 декабря 2020 |
| CentOS | podman, runc, crun, libslirp, … | Обновить все пакеты, зависящие от golang | 1 июня 2021 | 17 декабря 2020 |
| Debian | golang‑go.crypto | Обновить до golang‑1.16 (включает патч) | 30 июля 2024 | 17 декабря 2020 |
| Oracle Linux | runc, podman, criu, … | Обновить до последних релизов (см. репозиторий ol7_latest) | 22 июля 2024 | 16 декабря 2020 |
| Red Hat Enterprise Linux | buildah, skopeo, libslirp, … | Обновить до golang‑1.15.7 и выше | — | 16 декабря 2020 |
Важно отметить, что в большинстве современных дистрибутивов патч уже включён в версии Go 1.15.7 и выше. Пользователям, использующим кастомные сборки, необходимо проверять наличие исправления в их репозиториях.
Меры по устранению и рекомендации
5.1 Обновление пакетов
Самый надёжный способ – обновить Go‑библиотеку до версии, где исправлена уязвимость (commit be400aefbc4c → v0.0.0‑20201203163018‑be400aefbc4c заменён на v0.0.0‑20210115182240‑f5f5e5d0d0b4 и далее). Для большинства дистрибутивов достаточно выполнить:
# Для RHEL / CentOS / AlmaLinux
sudo yum update golang
sudo apt-get update && sudo apt-get install golang-go
sudo yum install golang
5.2 Перезапуск SSH‑демона
После обновления необходимо перезапустить сервис, чтобы новые библиотеки загрузились:
sudo systemctl restart sshd 5.3 Защита на уровне сети
- Ограничьте доступ к порту 22 только доверенными IP‑адресами (firewall, security groups).
- Включите Fail2Ban или аналогичный механизм блокировки по количеству соединений.
- Разверните SSH‑jump‑host и используйте двухфакторную аутентификацию.
5.4 Мониторинг и логирование
Настройте сбор логов SSH (например, через rsyslog или journalctl) и следите за аномальными паттернами:
- Многочисленные соединения без аутентификации.
- Необычные запросы
ssh(особенно с пустым payload).
5.5 Периодический аудит зависимостей
В проектах на Go используйте инструменты go mod tidy и go list -m -u all для проверки наличия устаревших модулей. Интегрируйте сканеры уязвимостей (например, Nancy или OSV‑Scanner) в CI/CD пайплайн.
Как обнаружить попытки эксплуатации?
Поскольку эксплойт приводит к падению демона, характерные признаки включают:
- Внезапные рестарты
sshdв системных логах (/var/log/auth.log,/var/log/secure). - Сообщения вида
panic: nil requestв выводеjournalctl -u sshd. - Повышенный уровень нагрузки на сеть в момент отказа (много коротких TCP‑соединений).
Пример правила для Fail2Ban:
[sshd-nil-pointer]
enabled = true
filter = sshd-nil-pointer
logpath = /var/log/auth.log
maxretry = 1
Фильтр sshd-nil-pointer.conf может содержать строку:
failregex = panic: nil request Ссылки и источники
- Rapid7 – CVE‑2020‑29652 (NULL Pointer Dereference)
- Официальный репозиторий Go: golang.org/x/crypto
- CVSS‑3.1 калькулятор: first.org
- Документация по обновлению пакетов в популярных дистрибутивах (yum, apt, dnf).
- Руководство по защите SSH: ssh.com
Важно: даже если ваша система уже обновлена, рекомендуется периодически проверять наличие новых патчей и поддерживать актуальную версию Go‑библиотек. Уязвимости типа «nil‑pointer dereference» часто становятся точкой входа для более сложных атак, если их не устранять своевременно.
Если у вас остались вопросы по внедрению исправлений или настройке мониторинга, оставляйте комментарии – будем рады помочь!