# 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.

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

    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 как критические и относятся к типу: Ошибки непроверенного использования чувствительных данных (ввода пользователя, файлов, сети и пр.).

Данная диагностика классифицируется как:

CWE-470