В Rsync, популярном инструменте синхронизации файлов для Unix-систем, было обнаружено шесть уязвимостей безопасности, некоторые из которых позволяют злоумышленникам выполнять произвольный код на клиентской системе.
CERT Coordination Center (CERT/CC) сообщил, что при наличии контроля над вредоносным сервером злоумышленники могут читать и записывать любые файлы на подключённых клиентах. Это создаёт угрозу утечки конфиденциальной информации, такой как SSH-ключи, и выполнения вредоносного кода путём изменения файлов, например, ~/.bashrc или ~/.popt.
Список обнаруженных уязвимостей включает:
- CVE-2024-12084 (CVSS 9.8): переполнение кучи из-за некорректной обработки длины контрольной суммы;
- CVE-2024-12085 (CVSS 7.5): утечка данных через неинициализированное содержимое стека;
- CVE-2024-12086 (CVSS 6.1): утечка произвольных файлов клиента сервером Rsync;
- CVE-2024-12087 (CVSS 6.5): уязвимость обхода пути;
- CVE-2024-12088 (CVSS 6.5): обход опции –safe-links, ведущий к атаке обхода пути;
- CVE-2024-12747 (CVSS 5.6): состояние гонки при обработке символических ссылок.
Первые пять уязвимостей обнаружили исследователи из Google Cloud Vulnerability Research – Саймон Сканнелл, Педро Галлегос и Джазиел Спелман. Последняя уязвимость была раскрыта исследователем безопасности Алексеем Горбанем.
Особо опасной признана CVE-2024-12084, для эксплуатации которой злоумышленнику достаточно иметь анонимный доступ на чтение к серверу Rsync. Как отметил Ник Тейт из Red Hat Product Security, комбинированное использование уязвимостей CVE-2024-12084 и CVE-2024-12085 позволяет добиться выполнения произвольного кода на клиенте, использующем сервер Rsync.
В версии Rsync 3.4.0, доступной с сегодняшнего дня, разработчики устранили все шесть уязвимостей. Пользователям, не имеющим возможности обновиться, рекомендуется применить следующие меры:
- Для CVE-2024-12084: отключить поддержку SHA, скомпилировав с флагами CFLAGS=-DDISABLE_SHA512_DIGEST и CFLAGS=-DDISABLE_SHA256_DIGEST.
- Для CVE-2024-12085: использовать флаг компиляции -ftrivial-auto-var-init=zero, чтобы заполнить содержимое стека нулями.