Анализатор обнаружил, что команда уровня операционной системы создаётся из непроверенных данных, которые были получены из внешнего источника. Это может стать причиной возникновения уязвимости command injection.
В классификации OWASP Top 10 данная уязвимость относится к категории A3:2021-Injection в списке 2021 года.
Рассмотрим пример:
public void doUsersCommand() throws IOException { Scanner sc = new Scanner(System.in); String command = sc.nextLine(); Runtime.getRuntime().exec(command); }
Строка command
приходит извне и передаётся методу exec
в качестве команды уровня ОС. Из-за того, что команда перед выполнением никак не проверяется, инструкция в ней может быть абсолютно любая, в том числе вредоносная.
Один из вариантов, как можно обезопаситься от данной уязвимости, это не использовать команды уровня ОС. Для большинства задач в Java существует соответствующий API.
Если всё же принято решение использовать команды уровня ОС, то один из вариантов защиты от command injection — создать перечень допустимых команд и проверять, находится ли пришедшая извне команда в нём.
Исправленный пример:
private final List<String> acceptableCommands = List.of( "dir", "dir *.txt", "dir *.logs" ); public void doUsersCommand() throws IOException { Scanner sc = new Scanner(System.in); String command = sc.nextLine(); if (acceptableCommands.contains(command)) { Runtime.getRuntime().exec(command); } }
Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки непроверенного использования чувствительных данных (ввода пользователя, файлов, сети и пр.). |
Данная диагностика классифицируется как: