V5322. OWASP. Possible reflection injection. Potentially tainted data is used to select class or method.
Анализатор обнаружил загрузку класса через механизм рефлексии без его проверки.
Уязвимости такого типа относятся к категории рисков 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 как критические и относятся к типу: Ошибки непроверенного использования чувствительных данных (ввода пользователя, файлов, сети и пр.). |
Данная диагностика классифицируется как: