Можно ли избежать безопасности jvm с помощью JNI? - PullRequest
4 голосов
/ 12 апреля 2020

Я думал о том, как работает безопасность jvm. Принцип заключается в том, что jvm всегда доверяет и выполняет любой собственный код. Таким образом, концептуально, если ваш код не вызывает checkpermission(permission) явно или неявно, это означает, что он никогда не потерпит никакой проверки безопасности. Конечно, все эти вызовы проверки обычно выполняются в Java API-классах, поэтому нам не нужно самим вызывать их для встроенных разрешений.

Теперь, пока вы используете встроенные классы как и FileOutputStream, ваш код всегда подлежит проверке прав доступа. Но, подумав некоторое время, я задаюсь вопросом: можно ли избежать проверок безопасности с помощью Java Native Interface для запуска кода на языке c ++.

Представьте, что вы импортируете несколько jar-файлов вместо использования FileOutputStream для записи в В файле используется какой-то созданный вручную JNI, который связывается с программой для написания файлов C ++ (которая явно не вызывает checkpermission()). Основываясь на вопросе " Как связать нативную библиотеку и библиотеку JNI внутри JAR? ", я понял, что можно собрать все в хороший вредоносный файл. Таким образом, любой код, использующий этот jar, больше не является безопасным, так как при выполнении кода из jar не происходит проверки безопасности. Это подразумевает, что эта программа на С ++ может эффективно перезаписывать все файлы, для которых процесс, выполняющий jvm, имеет разрешения на запись.

Это правильный способ мышления и это что-то задуманное, или я что-то упустил?

1 Ответ

5 голосов
/ 13 апреля 2020

Вы правы, что нативный код находится вне контроля JVM. Если Java менеджер безопасности позволяет загружать библиотеку JNI, обрабатывайте ее так, как если бы вообще не было менеджера безопасности.

Поэтому при использовании SecurityManager важно , а не для предоставления loadLibrary.* разрешение .

...