Ограничьте функциональность собственного кода в Java

У меня есть JAVA-приложение, которое использует JNI в некоторых частях, чтобы сделать некоторую работу. Это следует за обычной загрузкой DLL и затем вызовом собственных методов DLL. Есть ли какой-либо способ, которым мы можем ограничить то, что собственные методы могут сделать из JAVA-приложения? Например, мы можем ограничить DLLs, чтобы не открыть какие-либо файлы или не открыть какие-либо сокеты, даже если он имеет код, чтобы сделать это? Это может просто запретить DLLs, который это загружает для того, чтобы сделать определенные вещи, может быть путем входа чего-то или выдачи исключения.

7
задан Rais Alam 10 January 2013 в 08:58
поделиться

4 ответа

unsafe
{
    char c = 'c';
    char *ch = &c;
}

Ваш пример имеет Последовательности и ошибку компиляции от использования одной из Последовательности перегрузок конструктора, так что я думаю, что вам действительно нужен массив символов, он же Последовательностью и, может быть, не char * .

В таком случае:

char c = 'c';
string s = c.ToString(); // or...
string s1 = "" +c;

Также доступно:

unsafe
{
    char c = 'c';
    char* ch = &c;
    string s1 = new string(ch);
    string s2 = new string(c, 0);
}
-121--4534683-

Как насчет:

var test = 'c'.ToString()
-121--4534692-

Мне очень понравился Грегори Пакош ' ответить . Тем не менее, что вы могли бы сделать, это песочницу самого экземпляра Java. Запустите само приложение Java в ограниченном контексте.

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

Если вашей программе Java нужно делать привилегированные вещи, стороне Java придется поговорить с другой программой (Java или нет), чтобы сделать свои привилегированные вещи для нее.

Имейте в виду, что если вы не можете доверять DLL, вы также не можете доверять коду Java, так как DLL мог «взломать» машину Java. С другой стороны, никакие неприятные вещи не должны быть способны вырваться из пределов пользователя, как они работают. (Запрет неправильной конфигурации или ошибки в ОС.)

Изменить 2018: сегодня может быть более актуальным отметить, что песочница для запуска Java в скорее всего будет виртуальной машиной, в amazon-облаке, докере или что у вас, в заблокированной конфигурации.

7
ответ дан 6 December 2019 в 11:49
поделиться

Нет, вы не можете. DLL загружается в целом, и тогда сторона Java не контролирует то, что делает родной код.

Один раствор может быть любезным в среднем подходе. Это будет включать в себя кодирование DLL «Shell», которая имеет тот же интерфейс, что и исходная DLL. Вы говорите Java загрузить DLL «Shell», например, введев его в определенное место и используя свойство Java.library.Path . Тогда роль DLL «Shell» состоит в том, чтобы загрузить «True» DLL Sandboxing IT и перенаправляя стандартные функции. Это звучит как много боли, и это что-то, что произойдет на родной стороне на вещах, а не от Java.

8
ответ дан 6 December 2019 в 11:49
поделиться

Обычно вы запускаете ваше приложение под управлением Java Security Manager, но я не верю, что это какое-либо влияние на код, проходящий через JNI.

1
ответ дан 6 December 2019 в 11:49
поделиться

Вы можете реализовать некую настройку, которую может получить ваш код JNI. Например, на UNIX-системе вы можете создать группы для особых типов привилегий и проверить, имеет ли текущий пользователь требуемые привилегии, иначе просто верните 0 или что-то в этом роде.

1
ответ дан 6 December 2019 в 11:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: