Безопасность Class.forName в Java - PullRequest
0 голосов
/ 28 февраля 2019

Предположим, у меня есть следующее:

public class ForNameTest {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException {
        final String s = "java.lang.Integer";
        Object test = Class.forName(s).getConstructors()[0].newInstance(222);
        System.err.println(test);
    }
}

В этом коде я создаю объект из String, значение которого известно во время компиляции, поэтому я считаю, что этот код гарантированно свободен от эксплойтов.Есть ли какое-либо значение, которое может принять "s", чтобы выполнить произвольный код?«s» может содержать желаемый код, если это необходимо.

1 Ответ

0 голосов
/ 01 марта 2019

Вероятно, можно изменить файл .class, чтобы заменить строку "java.lang.Integer" в пуле строк на "com.something.MaliciousClass".Этот класс будет загружен, и его статический инициализатор будет выполнен.Даже если параметры конструктора не совпадают .

Но если можно изменить файл .class, то в него можно поместить любой вредоносный код, заменять только один нет смысла.String.

Если ваша строка назначена во время компиляции, вы, вероятно, в безопасности, если вы читаете ее откуда-то, убедитесь, что она содержит то, что вы ожидаете, то есть имена белых списков классов, которые могут быть созданы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...