
Пример кода эксплойта для CVE-2021-33831
Приложение используется для отслеживания людей в соответствии с немецким законом об инфекциях, чтобы можно было прослеживать цепочки заражения Covid-19. Оно было создано студенческим проектом под названием iCampus и используется не только в университете Вильдау, но и в Котбус-Зенфтенберге. Затронуто около 10 000 человек. Гости университетов обязаны использовать это приложение.
Приложение состоит из фронтенда на Vue и бэкенда на Laravel.
Бэкенд предоставляет конечную точку регистрации гостевых пользователей /corona-app-backend/api/account/register
которая позволяет регистрировать гостей университета. Сотрудники и студенты университета могут войти, используя комбинацию имени пользователя и пароля для единого входа.
Эта конечная точка регистрации не защищена от автоматического создания пользователей (например, с помощью капчи). Как только программа получает csrf-куки через /corona-app-backend/sanctum/csrf-cookie и токен сессии через /corona-app-backend/account, она может создавать пользователей. Сколько угодно. Как угодно долго. Слишком большое количество фейковых пользователей делает практически невозможным для органа здравоохранения отслеживание цепочек заражения, что делает это атакой типа «отказ в обслуживании».
Регистрация пользователя представляет собой POST-запрос к конечной точке регистрации, содержащий csrf-куки и токен сессии, со следующим JSON-нагрузкой:
{"first_name":"John","last_name":"Doe","telephone":"099182","email":null,"accept":true}
Должно быть заполнено либо поле email, либо поле telephone. Оба не проверяются (помимо проверки синтаксиса).
При наличии действительной пользовательской сессии посещения (отметки о входе в комнаты) могут быть созданы через конечную точку /corona-app-backend/api/visit
Посещение — это POST-запрос к конечной точке посещений, содержащий csrf-куки и токен сессии, со следующим JSON-нагрузкой:
{"room":"15-K01","visited_on":"2021-05-09T22:01:00.000Z","exited_on":"2021-05-10T21:59:00.000Z"}')
Значение поля room можно получить из списка, который доступен через конечную точку комнат /corona-app-backend/api/rooms и возвращает JSON со всеми комнатами университета. Для успешного вызова нужны только csrf-куки и токен сессии.
Проблему можно сравнить с CVE-2021-33840, но она идёт гораздо дальше.
Кроме того, приложение не содержит какого-либо шифрования во фронтенде и бэкенде (помимо шифрования при передаче через https). Бэкенд получает незашифрованные JSON-данные и отдаёт незашифрованные JSON-данные.
Полностью автоматизированный эксплойт-код на языке Perl создаёт 500 пользователей (из баз случайных имён) со случайными, но правдоподобными номерами телефонов, и все пользователи отмечаются как посетившие одну комнату. Полностью автоматизированно. Была добавлена задержка в 5 секунд на запрос, чтобы не перегружать сервер и не активировать защиту, которая могла бы существовать. Эксплойт успешно отработал в полностью автоматическом режиме, и в тот же день я сообщил о проблеме, включая созданных фейковых пользователей, в университет.
Прежде чем выбрать комнату, я убедился, что в тот день в ней никто не был. Это возможно, поскольку приложение содержит счётчик того, со сколькими людьми человек контактировал в конкретной комнате. Так что если посетить комнату и счётчик равен 0, значит, в этом промежутке времени в комнате никого не было.
Приложение также было подвержено RCE из CVE-2021-3129, о чём я сообщил в университет 12.04.2021.
О текущей проблеме я сообщил 31.05.2021.
По обоим сообщениям я получил письмо с подтверждением получения на следующий день после отправки. Больше я ничего не получал.
Запрос на исходный код приложения находится в процессе рассмотрения.