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