flawopen.com/Incidents/citrix-bleed-session-token-leak-october-2023
Citrix Bleed: утечка токенов и обход MFA
CVE-2023-4966 раскрывала память NetScaler с токенами сессий, позволяя захватить сессию в обход MFA. Эксплуатация началась в конце августа 2023 года.[1], [2]
Вы просите помощника переписать сообщение на маленькую карточку и сказать, какой оно длины. На карточку помещается только 50 символов, и он пишет 50, но на вопрос о длине честно отвечает «800 символов», ведь столько было в оригинале. Вы отдаёте карточку кому-то и просите прочитать с неё 800 символов. Тот читает ваши 50 и продолжает читать всё, что написано на остальной части листа.[2]
Ключевые понятия и термины
snprintf- Функция C, форматирующая текст в буфер фиксированного размера. Если текст не помещается, она его обрезает, но возвращает длину, которую имел бы полный текст.[3]
NetScaler ADC / Gateway- Устройства Citrix для удалённого доступа и балансировки нагрузки на границе сети. Уязвимы были только те, что настроены как Gateway или виртуальный сервер AAA.[1]
Чтение за границей буфера (CWE-125)- Чтение за концом буфера. Ничего не перезаписывается, но раскрывается всё, что лежит в соседней памяти. Это описание конкретного механизма чтения за границей буфера (
CWE-125); Citrix относитCVE-2023-4966к общей категорииCWE-119.[1], [3] Токен сессии- Значение, подтверждающее, что пользователь уже вошёл в систему. Предъявивший его считается этим пользователем без запроса пароля или MFA.[2]
Связи со стандартами
- Ссылка CWE для слабого места, описанного в этом руководстве: CWE-119
- CISA KEV — добавлено 2023-10-18 — CVE-2023-4966
Хронология инцидента
Начинается эксплуатация уязвимости как zero-day, согласно более поздним отчётам о реагировании на инциденты.[2]
Citrix публикует бюллетень CTX579459 с исправленными сборками 14.1-8.50, 13.1-49.15 и 13.0-92.19.[1]
CISA вносит CVE-2023-4966 в каталог Known Exploited Vulnerabilities.[4]
Пошаговый сценарий атаки
Отправляется память за буфером
Ответ отправляется с этой большей длиной, поэтому устройство вместе с обрезанным JSON возвращает соседнюю память.[2]
Исходный код: Уязвимый vs Защищённый вариант
Иллюстративный код на C, а не исходный код NetScaler. Исправление проверяет возвращаемое значение snprintf — длину, которую имел бы полный результат. Если значение отрицательное или не меньше размера буфера, форматирование завершилось ошибкой либо результат был усечён, поэтому функция ничего не отправляет. Следовательно, длина передаётся в send_response только тогда, когда полный ответ помещается в buf.[3], [2]
#include <stdio.h>
int send_response(const char *data, int len);
int send_oidc_config(const char *host)
{
char buf[256];
/* n — это число байтов, которые были бы записаны; оно может превышать sizeof(buf) */
int n = snprintf(buf, sizeof(buf), "{\"issuer\":\"https://%s\"}", host);
return send_response(buf, n); /* отправляет n байтов, читая за пределами buf */
}
#include <stdio.h>
int send_response(const char *data, int len);
int send_oidc_config(const char *host)
{
char buf[256];
int n = snprintf(buf, sizeof(buf), "{\"issuer\":\"https://%s\"}", host);
if (n < 0 || (size_t)n >= sizeof(buf))
return -1; /* отклонить усечённый результат; не отправлять данные за границами буфера */
return send_response(buf, n);
}
Чек-лист по защите системы для инженеров
- ✓Всегда проверяйте обрезку в snprintf: if (n < 0 || (size_t)n >= sizeof(buf)) — это ветка ошибки. Считать возвращаемое значение числом записанных байтов — частая и серьёзная ошибка в C.[3]
- ✓Никогда не позволяйте управляемому злоумышленником вводу задавать длину вывода. Перед использованием ограничивайте любой размер, полученный из недоверенных данных, реальными границами буфера.[3]
- ✓Рекомендация FlawOpen по реагированию: при подозрении на утечку токенов сессии отзовите или аннулируйте затронутые сессии, если платформа это поддерживает. Патч закрывает уязвимость, но не отзывает уже раскрытые токены.
- ✓Рекомендация FlawOpen по эксплуатации: ограничивайте срок действия сессий, если это допускают требования сервиса, и расследуйте использование токенов из неожиданных сетей или с устройств. Mandiant рассматривает подозрительные шаблоны входа как повод для поиска и предупреждает, что их нужно оценивать с учётом контекста организации.[2]
- ✓Применяйте к пограничным устройствам ту же дисциплину обновлений и мониторинга, что и к своим серверам: они смотрят в интернет и хранят доступ всех, кто за ними.[1], [2]