Корпоративные данные часто представляют собой коммерческую тайну. Их утечка может привести к удару по репутации, финансовым потерям или даже банкротству. Поэтому требования безопасности к B2B-продукту должны быть очень высокими. Создавая новый продукт мы уделяли вопросу его безопасности особое внимание. Корпоративная Почта Mail.ru — on-premises версия знакомой всем обычной Почты Mail.ru. По сравнению с ней она содержит ряд модификаций для работы в новых условиях — контуре клиента.
Мы решили пройти аудит в сторонней компании и исправить все найденные недостатки до того, как предлагать продукт рынку. Для этого обратились к одной из самых авторитетных компаний в сфере информационной безопасности — Digital Security.
Удаленное выполнение кода в uWSGI
У нас обнаружился uWSGI-сервер, доступ к которому был у всех внутренних компонентов продукта.
Эта уязвимость могла быть проэксплуатирована, только если злоумышленник:
- Уже находится во внутренней сети продукта.
- Имеет с возможностью отправки произвольных данных по TCP.
Обход CSRF-защиты
Сlient-side атаки в современном вебе постепенно начинают исчезать. Однако ошибки в настройке или некритичные уязвимости могут позволить провести CSRF-атаки. Такие ошибки были обнаружены в приложении календаря, входящего в наш продукт.
В API для обращения к объекту в URL-пути передается параметр UID, который отвечает за ID календаря или события:
example.com/api/calendar/{UID}/action?
example.com/api/event/{UID}/action?
По умолчанию UID генерируется случайным образом. Но в приложении было обнаружено два места, в которых пользователь сможет поменять UID.
Первое — импорт файлов в формате ICS. В них есть специальное поле UID, которое пользователь контролирует при импорте. После импорта событий их UID останутся такими же, как в файле. Фильтрации у этого параметра нет.
Второе — возможность перехватить запрос с редактированием календаря и изменить поле UID. Фильтрация отсутствовала и тут.
Другая важная особенность: в этом API реализована CSRF-защита. А передавать CSRF-токены в GET-параметрах — плохая практика, возможна утечка.
Соберем всё вместе. Злоумышленник может в приложении контролировать UID объектов и делиться с другими пользователями доступом к событиям и к календарям. Поэтому злоумышленник может сделать объект с UID вида:
../. ./. ./AnyPathTo?anyparam=value&
При выполнении действия над объектом сгенерируется запрос с CSRF-токеном:
example.com/api/event/. ./. ./. ./AnyPathTo?anyparam=value&/action&token=abcdef
А после нормализации в браузере запрос отправится к
example.com/AnyPathTo?anyparam=value&/action&token=abcdef
Можно заставить пользователя отправить запрос к приложению по произвольному пути с произвольными параметрами и с корректным CSRF-токеном. А когда пользователь редактирует объект, отправляется PUT-запрос с телом запроса. При редактировании календаря в теле запроса будет JSON со всеми параметрами текущего календаря. Если перенаправить запрос на редактирование со «зловредного» календаря на приватный календарь пользователя, то к нему применятся все свойства «зловредного».

У нас реализована интеграция с Active Directory для аутентификации через LDAP и сбора писем с сервера Exchange. В этом примере речь пойдет об ActiveSync. При соединении между продуктом и Active Directory передаются учетные записи и пароли пользователей.
Во внутренних решениях и на серверах компаний TLS часто отсутствует или используется неправильно, потому что внутренняя сеть компании считается более безопасной и сисадмины не тратят время на создание корректной PKI-инфраструктуры и выпуск сертификатов для всех серверов.
Самая частая атака внутри корпоративных сетей — MITM. Обычно злоумышленник попадает в пользовательский сегмент сети, в котором нет сервера Exchange или контроллера домена. Также в нашем случае продукт не использует широковещательные протоколы разрешения имен — NBNS, LLMNR, mDNS. А для успешной MITM нужен доступ в сеть с одним из этих компонентов. Достигнуть этой цели иногда можно через уязвимые маршрутизаторы или серверы.
Выяснилось, что наша интеграция с Active Directory уязвима к MITM-атакам.
Когда пользователь вводит логин и пароль, система отправляет два LDAP-запроса на контроллер домена. Первый запрос возвращает список почтовых адресов, и если в нём есть логин пользователя, то отправляется второй запрос — Simple LDAP Authentication. Данные передаются в открытом виде. Это позволяет получать учетные записи пользователей, которые в данный момент авторизуются в продукте.
Вторая проблема: при соединении с Exchange-сервером по протоколу ActiveSync для сбора входящих писем система не проверяла подлинность TLS-сертификата сервера.
Результат
Мы постоянно сталкиваемся с хакерскими атаками и накопили солидный опыт в защите. Считаем, что продукты в периметре заказчика должны быть максимально безопасными. Перед нами стояла трудоемкая задача: перенести большую кодовую базу со множеством микросервисов в инфраструктуру заказчика, чтобы почта большую часть времени работала самостоятельно.
Мы попросили аудиторов уделить наибольшее внимание измененной авторизации (в Корпоративной Почте используется AD заказчика) и основному почтовому API. Найденные недостатки в основном были связаны с измененной топологией сети и специфичными для on-premises модификациями. Для остальных компонентов (календарь, интерфейс администрирования Mail.ru для бизнеса) использовалась модель gray-box.
Мы нашли ряд недостатков в некоторых компонентах и оперативно исправили. Заодно убедились в высоком уровне защищенности большинства других компонентов. Планируем проводить такие аудиты регулярно.