CVE-2020-29652: уязвимость nil‑pointer dereference в golang.org/x/crypto/ssh

Уязвимость Linux от 17 декабря 2020 года закрыта в основных дистрибутивах. Узнайте, как проверить версию и защитить устаревшие серверы от атак.

Бесплатная консультация юриста

+7 (800) 301-07-30

Реклама jurik.ru

Дата публикации: 17 декабря 2020 г.
Текущий статус : уязвимость полностью исправлена в официальных репозиториях большинства дистрибутивов Linux, однако устаревшие системы всё ещё могут быть подвержены атаке.


Содержание

  1. Общее описание
  2. Технические детали
  3. Влияние и степень риска
  4. Затронутые продукты и версии
  5. Меры по устранению и рекомендации
  6. Как обнаружить эксплойт
  7. Ссылки и источники

Общее описание

Уязвимость 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» часто становятся точкой входа для более сложных атак, если их не устранять своевременно.

Если у вас остались вопросы по внедрению исправлений или настройке мониторинга, оставляйте комментарии – будем рады помочь!