Укрепить проблему - Внедрение команды - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь выполнить сканирование безопасности HP Fortify для моего Java-приложения. У меня мало проблем, и я их исправил. Но я не могу найти решение для следующей проблемы.

  1. Командный впрыск

    String hostname = execReadToString("hostname").split("\\.")[0];
    public static String execReadToString(String execCommand) throws IOException {
     try (Scanner s = new Scanner(Runtime.getRuntime().exec(execCommand).getInputStream()).useDelimiter("\\A")) {
        return s.hasNext() ? s.next() : "";
    }
    

    Метод execReadToString () вызывает exec () для выполнения команды. Этот вызов может позволить злоумышленнику ввести вредоносные команды.

Так что я тоже попробовал с компоновщиком процессов.

private static void gethostname(String cmd1) throws IOException {
        if(Pattern.matches("[A-Za-z]+", cmd1)) {
        ProcessBuilder pb = new ProcessBuilder(cmd1);
        Process p = pb.start();
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    p.getInputStream()));
            String readline;
            while ((readline = reader.readLine()) != null) {
                System.out.println(readline);
            }
        }
    }

Даже из-за этого возникает проблема безопасности Этот вызов start () может позволить злоумышленнику вводить вредоносные команды.

Что будет идеальным решением для этой проблемы?

Заранее спасибо

1 Ответ

0 голосов
/ 03 мая 2018

Обычно это происходит потому, что вы используете пользовательский ввод для формирования командной строки, в которой пользователь может внедрить вредоносный код для манипулирования тем, какая команда выполняется в конечном итоге (даже если вы добавите проверку, будут способы обойти это).

В вашем случае кажется, что вы жестко программируете команду, поэтому это не должно быть проблемой, однако, смотрите страницу OWASP на жестко закодированном вызове команды (выделено мной):

В отличие от предыдущих примеров, команда в этом примере жестко закодирован, поэтому злоумышленник не может контролировать аргумент, переданный Система (). Однако, поскольку программа не указывает абсолютный путь для make и не очищает переменные среды до вызывая команду, злоумышленник может изменить свою переменную $ PATH на указать на вредоносный двоичный файл с именем make и выполнить сценарий CGI из подсказка оболочки. И так как в программе был установлен setuid root, версия make атакующего теперь работает с привилегиями root.

Среда играет важную роль в исполнении системы Команды в программах. Такие функции, как system () и exec (), используют среда программы, которая вызывает их, и, следовательно, злоумышленников иметь потенциальную возможность влиять на поведение этих вызовов .

Разрешение:

  1. Используйте собственные API-интерфейсы / библиотеки Java для достижения того, чего вы хотите, вместо выполнения команды - это, вероятно, лучший вариант. Используйте команды только когда это неизбежно, например: сторонние инструменты, которые не имеют клиентской библиотеки Java. Этот подход имеет дополнительное преимущество, заключающееся в том, что он более портативен и в большинстве случаев более эффективен. Эта библиотека может помочь вашему сценарию.
  2. Если у вас есть для запуска команды, убедитесь, что вы не используете предоставленные пользователем или внешние данные даже косвенно для ее создания.
  3. Или, если вы жестко программируете команду для запуска из кода, используйте абсолютный путь к команде и не используйте переменные окружения как ее часть. Для hostname (при условии, что вы используете встроенную команду) это обычно /usr/bin/hostname, но вы можете найти путь к команде для вашей среды, используя which hostname.
...