V5310. Possible command injection. Potentially tainted data is used to create OS command.
Анализатор обнаружил, что команда уровня операционной системы создаётся из непроверенных данных, которые были получены из внешнего источника. Это может стать причиной возникновения уязвимости 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);
}
}