﻿# V5322\. OWASP\. Possible reflection injection\. Potentially tainted data is used to select class or method\.

Анализатор обнаружил загрузку класса через механизм рефлексии без его проверки\.

Уязвимости такого типа относятся к категории рисков OWASP Top 10 Application Security Risks 2021: 

* [A3:2021\-Injection\.](https://owasp.org/Top10/A03_2021-Injection/)

Рассмотрим пример:

```cpp
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`, он может использовать рефлексию для загрузки вредоносного кода\. 

Для защиты от подобных атак стоит производить валидацию входных данных\.

Пример корректного кода:

```cpp
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);
}
```

Также возможна ситуация, когда вместо некорректного класса могут вызывать некорректный метод:

```cpp
public void useMethodWithName(HttpServletRequest request) {
    String methodName = request.getParameter("methodName");
    Method method = this.getClass().getMethod(methodName); // <=
    method.invoke(this);
}
```

Защититься от некорректного выбора метода можно аналогичным образом:

```cpp
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);
    }
}
```