Анализатор обнаружил загрузку класса через механизм рефлексии без его проверки.
Уязвимости такого типа относятся к категории рисков OWASP Top 10 Application Security Risks 2021:
Рассмотрим пример:
public void applyAction(HttpServletRequest request) { String action = request.getParameter("action"); String className = action + "Controller"; Class<?> actionClass = Class.forName(className); // <= Object actionClassObject = actionClass.newInstance(); Method applyMethod = actionClass.getMethod("apply"); applyMethod.invoke(actionClassObject); }
В данном примере сервер принимает запрос о выполнении некоторого действия, описанного строкой в параметре запроса. Действие реализовано в виде определенного класса с методом apply
. Однако проверки того, какой конкретно класс будет использован, нигде нет. В таком случае злоумышленник сможет подстроить запрос так, что будет выбран неправильный класс и выполнено недопустимое действие. Это может привести к нарушению логики выполнения программы или проблемам с безопасностью.
В худшем случае, если злоумышленник изменит classpath
, он может использовать рефлексию для загрузки вредоносного кода.
Для защиты от подобных атак стоит производить валидацию входных данных.
Пример корректного кода:
private List<String> ALLOWED_TYPES = new ArrayList<>(); public void validateAndApplyAction(HttpServletRequest request) { String action = request.getParameter("action"); String className = action + "Controller"; if (!ALLOWED_TYPES.contains(className)) { // <= return; } Class<?> actionClass = Class.forName(className); Object actionClassObject = actionClass.newInstance(); Method applyMethod = actionClass.getMethod("apply"); applyMethod.invoke(actionClassObject); }
Также возможна ситуация, когда вместо некорректного класса могут вызывать некорректный метод:
public void useMethodWithName(HttpServletRequest request) { String methodName = request.getParameter("methodName"); Method method = this.getClass().getMethod(methodName); // <= method.invoke(this); }
Защититься от некорректного выбора метода можно аналогичным образом:
private List<String> ALLOWED_METHODS = new ArrayList<>(); public void useSafeMethodWithName(HttpServletRequest request) { String methodName = request.getParameter("methodName"); if (ALLOWED_METHODS.contains(methodName)) { // <= Method method = this.getClass().getMethod(methodName); method.invoke(this); } }
Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки непроверенного использования чувствительных данных (ввода пользователя, файлов, сети и пр.). |
Данная диагностика классифицируется как: