Анализатор обнаружил, что для формирования параметров команды уровня операционной системы используются непроверенные данные извне. Это может стать причиной уязвимости argument injection.
В классификации OWASP Top 10 данная уязвимость относится к категории A3:2021-Injection в списке 2021 года.
Рассмотрим пример:
public void deleteFileInAcceptableFolder() throws IOException {
Scanner sc = new Scanner(System.in);
String filename = sc.nextLine();
Runtime.getRuntime().exec("rm " + filename);
}
В рамках этого примера строковый параметр для команды rm
приходит из внешнего контекста. Ожидается, что пользователь передаст имя файла, который можно удалить в рамках предоставленной ему директории. Однако возможна ситуация, при которой извне придёт следующая строка:
../../filename
Подобная манипуляция параметром команды уровня ОС способна оказать вредоносное действие — файл будет удалён не из предоставленной пользователю директории.
Один из вариантов, как можно обезопаситься от данной уязвимости, это не использовать команды уровня ОС. Для большинства задач в Java существует соответствующий API.
Если всё же принято решение использовать команды уровня ОС, то один из вариантов защиты от argument injection — проверять приходящий извне параметр на наличие нежелательных символов.
Исправленная версия примера:
public void deleteFileInAcceptableFolder() throws IOException {
Scanner sc = new Scanner(System.in);
String filename = sc.nextLine();
if (filename.matches("^(?!.*\\.\\.)(?!.*/).+$")) {
Runtime.getRuntime().exec("rm " + filename);
}
}
Здесь команда выполняется только в том случае, если параметр не содержит ..
и /
символов.