Разработчики Erlang/OTP выпустили бюллетени безопасности, закрывающие три уязвимости высокой степени опасности. Проблемы затронули компоненты OTP, erts, inets и ssl (модуль реализации протокола TLS - Transport Layer Security). Обновления доступны для веток 27.3.4.13, 28.5.0.2 и 29.0.2 OTP, а также соответствующих версий подсистем. Каждой уязвимости присвоен идентификатор CVE, и все они могут быть использованы удалённо при определённых условиях.
Детали уязвимостей
Первая уязвимость, CVE-2026-49759, зафиксирована в драйвере inet_drv, отвечающем за обработку пакетов протокола SCTP (Stream Control Transmission Protocol - протокол передачи с управлением потоком). В коде BEAM-виртуальной машины обнаружено неограниченное переполнение стека (CWE-121). Злоумышленник, успешно установивший ассоциацию SCTP с прослушивающим портом, может отправить специально сформированный ERROR-блок и вызвать аварийное завершение виртуальной машины. В стандартной сборке со стековой защитой (стековый канарей) выполнение произвольного кода маловероятно - срабатывание защиты также приведёт к краху. Однако при отсутствии стековой защиты (ненулевая конфигурация) атакующий может частично управлять записью в стек, хотя полноценное удалённое выполнение кода затруднено из-за фиксированного тега. Кроме того, возможно утечка фрагментов памяти Erlang-виртуальной машины в пакет ошибки. Системы уязвимы, если поддержка SCTP включена, открыт слушающий сокет gen_sctp с бэкендом inet, и порт доступен из сети атакующего. Сборки под Windows не подвержены, так как SCTP там не поддерживается. Разработчики отмечают: "The SCTP network driver, inet_drv.c, in the BEAM VM contains a stack buffer overflow bug that allows a remote, unauthenticated attacker to crash the VM by sending a single crafted SCTP ERROR chunk". Обходных мер, кроме отказа от открытия SCTP-сокетов в доступных сетях, не предложено.
Вторая уязвимость, CVE-2026-48860, связана с механизмом проверки IP-адресов при соединениях Erlang-распределения через TLS. Флаг check_ip в ядре предназначен для ограничения соединений узлами из одной локальной сети. Однако из-за ошибки в функции check_ip/1 в файле inet_tls_dist.erl (строка 723) вместо вызова inet:peername(Socket) использован inet:sockname(Socket). Это приводит к тому, что локальный IP и IP удалённого узла оказываются одинаковыми. Сравнение по маске подсети всегда возвращает истину - проверка полностью неэффективна. Как указано в описании: "The check_ip/1 function ... calls inet:sockname(Socket) to obtain the peer IP address instead of the correct inet:peername(Socket). This means both IP and PeerIP are always identical". Уязвимость затрагивает кластеры, где распределение настроено на TLS (флаг -proto_dist inet_tls), check_ip включён, TLS-проверка сертификатов допускает цепочку, не ограниченную исключительно узлами кластера (например, общий центр сертификации - CA - используется и для других сервисов). Атакующий, владеющий действительным сертификатом от того же CA (легитимно или скомпрометировав другой сервис), может обойти LAN-ограничение и подключиться к узлу кластера, получив полный контроль над конфиденциальностью, целостностью и доступностью (оценка CVSS v4 по шкале). Проблема появилась в OTP 26.0 (ssl 11.0). Исправлено в версиях 29.0.2, 28.5.0.2, 27.3.4.13 (для ssl - 11.7.2, 11.6.0.2, 11.2.12.9). В качестве обходной меры рекомендуется реализовать пользовательскую функцию верификации ssl verify_fun, которая корректно проверяет IP.
Третья уязвимость, CVE-2026-48856, обнаружена в httpc-клиенте пакета inets. При обработке перенаправлений (коды 301, 302, 303, 307, 308) клиент без проверки копирует заголовки Authorization и proxy-authorization из исходного запроса в запрос к новому целевому серверу. Межсайтовое перенаправление (cross-origin) не анализируется: заголовки передаются, даже если хост назначения отличается от исходного. Это позволяет злоумышленнику, контролирующему первый сервер, организовать перенаправление на подконтрольный ему второй сервер и перехватить учётные данные (например, Basic-аутентификацию, переданную в URL). Как поясняют разработчики: "The redirect handler in httpc_response.erl constructs the new request by updating only the host field of the header record. All other fields (including authorization and proxy_authorization) are copied verbatim from the original request". Автоматические перенаправления включены по умолчанию (autoredirect = true), так что уязвимы все приложения, использующие httpc без отключения этой опции. Версии до OTP 17.0 также подвержены. CVSS v4 оценён как высокий (8.7) с вектором AV:N/AC:L/AT:N/PR:N/UI:P/VC:H/VI:N/VA:N. Патчи выпущены в версиях 9.7.1, 9.6.2.2 и 9.3.2.6 пакета inets (соответствуют OTP 29.0.2, 28.5.0.2, 27.3.4.13). В качестве временной меры можно отключить авторедиректы (установив {autoredirect, false}) и обрабатывать перенаправления вручную с удалением заголовков аутентификации при переходе между разными источниками.
Для организаций, использующих Erlang/OTP в критических системах - телекоме, распределённых вычислениях, финансовых сервисах, - установка обновлений является обязательной. Особенно это касается систем, где включены SCTP-соединения, кластеры с TLS-распределением и приложения, выполняющие HTTP-запросы с аутентификацией. Отсутствие патча может привести к удалённому отказу в обслуживании, краже учётных данных или несанкционированному доступу к кластеру. Каждая из уязвимостей имеет чёткие условия эксплуатации, но их совместная опасность требует оперативного восстановления защищённой конфигурации. Администраторам следует сверить используемые версии OTP, erts, inets и ssl и применить соответствующие исправления, указанные в бюллетенях.
Ссылки
- https://github.com/erlang/otp/security/advisories/GHSA-m75x-4vwg-ggjh
- https://github.com/erlang/otp/security/advisories/GHSA-gp7x-mfv6-52cv
- https://github.com/erlang/otp/security/advisories/GHSA-6f4f-chj5-5g97