Rsync 3.5.0 закрывает 33 уязвимости — разработчики усилили защиту путей и daemon-протокола

13 августа 2026 года проект Rsync опубликовал версию 3.5.0 после многомесячного аудита обработки путей и протокола rsync-daemon. Релиз закрывает 33 проблемы безопасности: одну Critical, 17 High и 15 Medium; CVE-2026-53791 с оценкой CVSS 9.1 позволяет при определённой конфигурации PROXY protocol подменить адрес клиента и обойти правила hosts allow/hosts deny. Вместе с патчами команда расширила тестовое покрытие и добавила regression-тест для каждого исправления безопасности.

Rsync 3.5.0 закрывает 33 уязвимости
Rsync 3.5.0 закрывает 33 уязвимости

После регрессий Rsync 3.4.3 релиз 3.5.0 готовили с расширенным тестированием

У Rsync 3.5.0 получилась необычно длинная предыстория. 20 мая версия 3.4.3 закрыла шесть CVE, после чего пользователи обнаружили серию регрессий. Уже 8 июня разработчики выпустили 3.4.4 именно для исправления этих сбоев. В официальном сообщении команда связала проблему с недостаточным покрытием тестами ветки 3.4 и ограниченными возможностями широкого бета-тестирования security-релизов.

Подготовка 3.5.0 пошла по более жёсткой схеме. Проект расширил тестовый набор, увеличил группу разработчиков с опытом в безопасности и организовал закрытый список rsync-security для дополнительного тестирования исправлений. В официальном NEWS команда пишет, что 33 проблемы нашли во время целевого аудита обработки путей и daemon-протокола, отдельного fuzzing-прохода по протоколу и анализа отчётов внешних исследователей.

У этого изменения процесса есть вполне измеримый результат: каждое из 33 security-исправлений сопровождается regression-тестом, который воспроизводит ошибку на уязвимом дереве исходного кода. Для проекта, который всего двумя месяцами ранее столкнулся с регрессиями после крупного security-релиза, такая деталь объясняет, почему версия 3.5.0 готовилась несколько месяцев.

В списке Rsync 3.5.0 одна Critical, 17 High и 15 Medium

Страница безопасности Rsync перечисляет 33 CVE, закрытых в 3.5.0. По опубликованным уровням серьёзности они распределяются так:

УровеньКоличествоПримеры затронутых механизмов
Critical1Подмена адреса клиента в PROXY protocol
High17Выход за границы каталогов, command injection, записи за границы памяти, DoS, ошибки ACL доступа
Medium15Гонки с симлинками, ACL/xattr, TLS-проверка, тайм-ауты и ошибки разбора протокола

Совокупный набор уязвимостей затрагивает выпуски до 3.4.4 включительно, хотя диапазон версий для конкретного CVE может быть заметно уже. Часть проблем проявляется только в специальных конфигурациях: например, при use chroot = no, доступном на запись daemon-модуле, использовании ограниченного аккаунта rrsync, включённом proxy protocol = true, настроенном name converter или exec hook.

Такое распределение меняет восприятие релиза. Rsync часто работает незаметно — внутри резервного копирования, зеркалирования каталогов, автоматических задач и серверных модулей. В 3.5.0 аудит прошёл именно по тем границам, где данные переходят между доверенными и недоверенными путями, пользователями и сетевыми узлами.

CVE-2026-53791 позволяет подменить адрес клиента при включённом PROXY protocol

Самая серьёзная проблема получила идентификатор CVE-2026-53791 и оценку CVSS 9.1. Она относится к конфигурации proxy protocol = true, когда rsync-daemon ожидает информацию об исходном адресе клиента от промежуточного доверенного прокси.

До 3.5.0 клиент мог подключиться к daemon напрямую и самостоятельно отправить PROXY-заголовок. Сервер принимал переданный адрес как источник соединения, поэтому атакующий получал возможность обойти ограничения, основанные на hosts allow и hosts deny.

В 3.5.0 переданный адрес учитывается только тогда, когда непосредственный узел соединения входит в настроенный список доверенных прокси. Конфигурация proxy protocol = true без proxy protocol hosts теперь работает в режиме fail-closed: соединения отклоняются, а daemon выводит предупреждение при запуске.

Уязвимость требует конкретной настройки PROXY protocol, поэтому она не описывает поведение каждой установки Rsync. Сам advisory на GitHub содержит пометку, что точная граница версии, в которой ошибка появилась, ещё уточняется; исправленной версией указана 3.5.0.

Обработка путей и симлинков стала крупнейшей зоной усиления защиты

Большая группа CVE связана с тем, как Rsync открывает файлы и проходит компоненты пути. Сценарий повторяется в разных формах: процесс с повышенными правами проверяет путь, затем другой пользователь успевает заменить один из каталогов симлинком, и последующая операция попадает за ожидаемую границу. Такой класс гонок обычно называют TOCTOU — time-of-check to time-of-use.

CVE-2026-53802 затрагивала входные файлы, которые оператор передаёт через --filter, --files-from, --include-from, --exclude-from, --password-file и несколько связанных механизмов. Подложенный симлинк мог заставить Rsync прочитать другой файл. В случае daemon-аутентификации содержимое чужого файла могло попасть в ответ, сформированный из файла пароля.

CVE-2026-53803 работала в обратном направлении и касалась выходных путей: --log-file, batch-файлов и нескольких daemon-параметров. В changelog приведён показательный сценарий, где симлинк перенаправляет запись журнала в authorized_keys, что создаёт путь к повышению привилегий при подходящих правах процесса.

Ещё несколько исправлений закрывают выход из дерева назначения или источника:

  • CVE-2026-53785 — создание подразумеваемых родительских каталогов при --relative могло уйти за пределы дерева назначения;
  • CVE-2026-53793 — симлинк внутри chroot-конфигурации с /./ позволял достичь соседнего каталога за внутренней границей модуля;
  • CVE-2026-53797 — гонка с родительским компонентом исходного пути могла привести к чтению файла вне исходного дерева;
  • CVE-2026-53800 — при --remove-source-files похожая гонка могла перенаправить удаление на файл за пределами исходного дерева;
  • CVE-2026-53801 — сканирование каталогов могло перечислить содержимое за пределами transfer root или daemon-модуля.

В основе исправлений лежит общий механизм: чувствительные пути теперь разрешаются покомпонентно через удерживаемые файловые дескрипторы с O_NOFOLLOW и проверкой владельца. Такой подход сокращает окно между проверкой и фактической операцией, потому что Rsync продолжает работать с уже открытым объектом каталога.

Для ACL и extended attributes картина зависит от платформы. На Linux 6.13+ используются новые *xattrat-вызовы, возможны варианты с обновлённой libacl или /proc/self/fd. На BSD, Solaris, macOS и в Linux-контейнере без /proc NEWS описывает остаточный путь через традиционные path-based операции. Эта разница в возможностях ОС остаётся частью модели безопасности 3.5.0.

rrsync жёстче удерживает ограниченный SSH-доступ внутри разрешённого каталога

rrsync — вспомогательный restricted-shell wrapper, который часто применяют для SSH-ключа с доступом только к заданному каталогу. CVE-2026-53783 получила уровень High из-за гонки между проверкой пути через realpath() и последующим запуском Rsync с тем же именем.

В 3.5.0 wrapper на Linux фиксирует проверенный объект через inode и передаёт Rsync путь, привязанный к открытому дескриптору в /proc/self/fd. Одновременно rrsync запрещает --copy-unsafe-links, принудительно включает --no-D в restricted-подкаталоге и отклоняет симлинк в --log-file.

Для дополнительного ограничения появился механизм --confine-root=DIR. Он блокирует операторский или переданный другой стороной путь, если тот разрешается за пределами указанного корня. rrsync использует этот параметр для своего ограниченного каталога, включая merge-файлы фильтров.

У inode-pinning есть платформенная граница. NEWS прямо связывает эту защиту с поведением /proc/self/fd в Linux. На BSD, macOS, Solaris и Cygwin wrapper продолжает передавать имя, прошедшее realpath()-проверку, поэтому полный набор Linux-механизмов там недоступен.

Daemon получил защиту от зависающих соединений и чрезмерного расхода CPU

Сразу несколько High-проблем связаны с доступностью rsync-daemon. Здесь особенно показателен CVE-2026-70464 с CVSS 7.5: он затрагивает версии с 2.0.0 по 3.4.4 и позволяет неаутентифицированному клиенту удерживать соединение ещё до начала передачи файлов.

Клиент мог завершить приветствие @RSYNCD, а затем бесконечно тянуть отправку строки или NUL-терминированных аргументов по одному байту. Параметр timeout не закрывал этот участок, поскольку таймер включался позднее нужных вызовов read_args(). После выбора модуля такое соединение занимало слот max connections; серия параллельных подключений могла сделать модуль недоступным для легитимных клиентов.

В 3.5.0 отдельный deadline охватывает handshake и оба ранних вызова чтения аргументов. Одновременно ограничено количество аргументов на ранней стадии протокола.

CVE-2026-70455 касается Zstandard. Клиент daemon-а мог запросить произвольное число потоков через --compress-threads; в тесте значение 256 породило 257 потоков в одном соединении. Для daemon-режима 3.5.0 ограничивает число workers восемью, сохраняя операторское значение для локального запуска и соединения через remote shell.

Ещё один High, CVE-2026-70453, связан с квадратичным расходом CPU в hash_search() при специально сформированной цепочке одинаковых слабых контрольных сумм. В новой версии длина такого прохода ограничена.

Fuzzing daemon-протокола нашёл несколько записей за границы памяти

Отдельный fuzzing-проход по daemon-протоколу выявил серию memory-safety ошибок. Разработчики специально отделили случаи с записью в память от ошибок, которые приводили только к падению процесса.

Один из самых наглядных примеров — CVE-2026-70456, High с CVSS 8.2. Если удалённый daemon-клиент формировал количество аргументов ровно на границе maxargs, операция argv[argc] = NULL записывала указатель за предел выделенного массива. На 64-битной системе речь идёт о восьми байтах. Advisory указывает диапазон затронутых версий от 3.0.1 до 3.4.4.

Рядом находятся ещё три ошибки:

  • CVE-2026-70458 — запись за пределы массива при принятом флаге FLAG_HLINKED, хотя режим -H не был включён;
  • CVE-2026-70461 — однобайтовая heap out-of-bounds write в add_implied_include() из-за неверного расчёта длины правила с завершающим обратным слешем;
  • CVE-2026-70457 — запись по смещению, контролируемому атакующим, в обработке ошибки для слишком больших значений --max-size, --min-size или --max-alloc.

Публичные advisory описывают эти проблемы как memory corruption и указывают сетевой путь до уязвимого daemon-кода. Заявлений о подтверждённом удалённом выполнении кода в опубликованном changelog нет, поэтому уровень риска здесь задают конкретные CVE и их CVSS, без расширения последствий сверх описанного исследователями.

rsync-ssl теперь проверяет сертификат и имя удалённого узла

CVE-2026-70454 с уровнем Medium затрагивает rsync-ssl. В stunnel-режиме прежняя логика устанавливала TLS-соединение без обязательной проверки центра сертификации и без привязки сертификата к запрошенному имени хоста. При активной атаке в сети это позволяло подменить сервер.

В 3.5.0 stunnel-режим требует верификацию сертификата и проверку hostname. Отключение этой проверки вынесено в явный insecure-режим. Для GnuTLS разработчики выбрали консервативное поведение и отказываются использовать backend без подтверждённой проверки.

В changelog отдельно упоминается похожий пробел hostname verification в OpenSSL backend версий 3.2.0–3.2.3, который нашли и исправили ещё в 2020 году. Новый CVE сводит требования для актуального rsync-ssl к более строгой модели проверки удалённой стороны.

Несколько привычных сценариев Rsync 3.5.0 теперь ведут себя строже

Security-hardening затронул наблюдаемое поведение программы, поэтому 3.5.0 меняет несколько сценариев даже при отсутствии атаки.

СценарийПоведение до 3.5.0Поведение в 3.5.0
Симлинк в каталог назначения обычного receiverПуть мог пройти через симлинк, созданный другим uidСимлинк принимается только при доверенном владельце — root или текущем эффективном uid
proxy protocol = true без списка доверенных проксиКонфигурация могла принять переданный адресСоединения отклоняются, daemon предупреждает при старте
rrsync в restricted-подкаталогеНабор допустимых опций оставлял опасные комбинацииПринудительно используется --no-D, запрещён --copy-unsafe-links
Unix socket в подкаталоге с --specials на системах без race-safe bindat()Передача могла завершиться ошибкойОбъект пропускается с предупреждением
Переход через симлинк каталога внутри дереваПоведение зависело от платформы и конкретного путиИспользуется единый покомпонентный resolver с удерживаемыми дескрипторами

Для фонового резервного копирования от root особенно заметна новая модель доверия к компонентам пути: часть CVE как раз строится на ситуации, где непривилегированный пользователь контролирует каталог, через который затем проходит процесс с большими правами. Для публичного rsync-daemon заметнее сетевые изменения — handshake deadline, ограничения потоков Zstd, проверка ACL и исправления memory-safety. Ограниченные SSH-аккаунты через rrsync получают отдельный набор confinement-механизмов.

Так Rsync 3.5.0 разделяет угрозы по реальным режимам работы программы. Наличие CVE в релизе само по себе ещё не говорит, что одинаковый сценарий доступен через локальный backup-script, SSH-передачу и публичный daemon: условия эксплуатации у каждого advisory свои.

Rsync 3.5.0 завершает многомесячный security-аудит, но часть границ остаётся платформенной

Версия 3.5.0 фиксирует результат нескольких месяцев работы над обработкой путей, daemon-протоколом и fuzzing-тестами. После проблем с регрессиями в 3.4.3 проект одновременно изменил код и процедуру проверки: расширил security-команду, тестовую базу и добавил отдельный regression-тест к каждому из 33 исправлений.

Самые заметные изменения сосредоточены вокруг доверия к пути и удалённой стороне. PROXY protocol теперь проверяет непосредственного прокси, чувствительные файловые операции привязываются к удерживаемым дескрипторам, daemon ограничивает ранний handshake и ресурсоёмкие запросы, а rsync-ssl проверяет сертификат и имя сервера.

Полная одинаковость защиты на всех поддерживаемых ОС пока недостижима: NEWS прямо описывает fallback для ACL/xattr на системах без нужных *at-примитивов и Linux-механизмы rrsync, завязанные на /proc/self/fd. Для части advisory ещё уточняются точные версии, в которых появились отдельные ошибки. Следующий показатель зрелости ветки 3.5 будет виден уже по тому, как эти новые ограничения и расширенный тестовый набор поведут себя в разных Unix-средах после массового распространения релиза.

При использовании материалов сайта необходимо указывать ссылку на TGLand.ru. Если вы копируете фрагменты текста в интернете, прямая гиперссылка, доступная для индексации поисковыми системами, должна быть размещена в начале материала.

Вам также может понравиться