
CSRF-уязвимость в Eclipse Che, приводящая к RCE
Эта ошибка позволяет удалённому веб-сайту создавать и запускать произвольный docker-контейнер на машинах с версиями Che до 7.3.0 и 7.4.1, когда пользователь посещает веб-страницу.
Это CSRF-ошибка, которая позволяет удалённому веб-сайту создавать и запускать docker-контейнер на машине любого, кто запускает Eclipse Che в автономном режиме. Многие параметры, находящиеся под контролем атакующего, обеспечивают точную степень управления. Некоторые разработчики используют Che в автономном режиме как удобный способ управления своими локальными docker-контейнерами.
Это стало возможным потому, что в Che по умолчанию был включён CORS. Проблемы с этим вполне очевидны для тех, кто понимает, что это означает: по сути, Che отвечал на запросы из любого источника. Хотя браузеры делают всё возможное, чтобы затруднить CORS-атаки, когда сервер разрешает CORS, с удалённого сайта можно успешно отправлять POST-запросы к локально запущенному сервису Che.
По сути, это означает, что любой неаутентифицированный метод API можно вызвать, когда компьютер с запущенным в автономном режиме Che посещает чужой веб-сайт. Это включает создание и запуск новых Docker/OpenShift-контейнеров.
Простой POC включён в этот readme, однако просмотр JSON, отправляемого локальному сервису Che, раскрывает ряд довольно интересных управляемых параметров, включая выбор образа, команды, выполняемые при запуске, серверы, запускаемые в контейнере, и другие довольно любопытные характеристики.
Чтобы эксплуатировать эту уязвимость, нужно нацелиться на того, кто запускает Eclipse Che на своём компьютере. Необходимо заставить цель посетить страницу, которой вы управляете, по HTTP. Дальше XMLHttpRequest сделает своё дело, и вы сможете действовать по полной. Чтобы полностью понять, как эксплуатировать эту уязвимость, стоит изучить исходный код Che и документацию по API или просто поиграть с POC, который я разместил в этом репозитории. По сути, вы хотите создать либо контейнер, либо команду в вашем недавно запущенном контейнере, которая даст вам желаемую точку опоры. Можно поднять собственный сервер или просто сделать так, чтобы команда при запуске загружала ваш payload и начинала действовать оттуда. Эта атака подходит как для оппортунистических, так и для целевых атак.
Более подробное обсуждение — в отчёте об ошибке, отслеживаемом здесь. В основном там просто повторяется этот пост.
Чтобы успешно выполнить эту атаку, страница должна отдаваться с HTTP-сервера (не HTTPS). Это необходимо, потому что локальный сервер Che работает по HTTP, а популярные браузеры не любят смешивать HTTP- и HTTPS-контент.
Чтобы исправить эту проблему, команда Che просто отключила CORS по умолчанию. Это должно как минимум сделать подобные атаки значительно более сложными в будущем. Если вы запускаете Che локально для управления своими docker-образами, рассмотрите возможность обновления.