Как обнаружить агенты Java, JVMTI и т. д.

Как защитить среду Java при работе на машине, которую вы не контролируете? Что может помешать кому-то создать агент java или собственный агент JVMTI и сбросить байт-код или переписать классы, чтобы обойти лицензирование и/или другие проверки безопасности? Есть ли способ определить, работают ли какие-либо агенты из кода Java? Из JNI? От агента JVMTI?


person Andrew Westberg - BCSH    schedule 05.05.2010    source источник
comment
@ Эндрю Вестберг: если вы не хотите, чтобы люди проверяли ваш код, сделайте свой код серверным. Заставьте вычисления выполняться на стороне сервера: никто не реконструирует код GMail на стороне сервера, потому что это происходит на стороне сервера. Для вас это может быть непрактично, но для моей компании точно ;)   -  person SyntaxT3rr0r    schedule 05.05.2010
comment
Итог: если вы не контролируете машину, у вас нет реального контроля. Там просто нет никакого способа обойти это. Вы можете бросить некоторые препятствия парням, пытающимся это сделать... но я не уверен, что это будет стоить ваших усилий.   -  person Sami Koivu    schedule 05.05.2010


Ответы (7)


Если вы не контролируете окружающую среду, извините, вы действительно застряли. Да, вы можете искать тривиальные агенты JVMTI с помощью какого-то обнюхивания командной строки, но это меньше всего вас беспокоит. Подумайте о прямой компрометации java/lang/Classloader.defineClass(). Это легко сделать, если у вас есть коробка — просто замените файл .class в rt.jar. На самом деле, пока не появился JVMTI, это был типичный способ инструментирования Java-кода профилировщиками и инструментами мониторинга.

Возвращаясь к JVMTI — функция «Позднее подключение» также позволяет загружать агенты JVMTI «на лету». Этого могло не случиться, когда вы сканировали в первый раз.

Итог — если кто-то может изменить байты JRE на диске, он может делать все, что захочет. Это этично, нет? Могут ли их поймать? Возможно, но вы никогда не выиграете войну.

person Trent Gray-Donald    schedule 06.05.2010
comment
Я не использую ClassLoader.defineClass(), поэтому я не уязвим. Я ввожу байт-код непосредственно в нативную java.dll через JNI. - person Andrew Westberg - BCSH; 06.05.2010
comment
Я не понимаю, почему. Как вы думаете, какое волшебство творит ваш переход через java.dll? Я бы предположил, что java.dll развернется и перезвонит через java, чтобы сделать это, поэтому я сомневаюсь, что ваш путь к jvm.dll (где на самом деле находится JVM) так чист, как вы думаете. Но проблема в том, что нельзя доверять, остается: сама java.dll может быть скомпрометирована, поскольку она вам не принадлежит. Или jvm.dll. Любой из них может быть заменен человеком в середине DLL, который отслеживает/управляет всеми вызовами через них. - person Trent Gray-Donald; 06.05.2010

Похоже, я могу пойти с комбинацией проверок внутри некоторого пользовательского собственного кода JNI.

1.) Перехват строки cmd для поиска агентов. 2.) Убедитесь, что параметр командной строки -XX:+DisableAttachMechanism существует. (это предотвратит подключение людей к моей работающей виртуальной машине)

person Andrew Westberg - BCSH    schedule 06.05.2010

Помнится, я когда-то делал почти бесшумный Java-агент. Я думаю, вам лучше поискать сканеры портов или что-то в этом роде.

person medopal    schedule 05.05.2010

Безопасность Java 2, подписание jar-файлов и т. д. дают некоторый уровень контроля над тем, что загружается в ваше приложение.

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

Включите этот раунд, на любом языке, что вы можете сделать для обнаружения троянов?

Тщательный контроль доступа к машинам, которые вам небезразличны, нетривиален, но необходим, если вы серьезно относитесь к таким проблемам. Специалисты по безопасности могут показаться параноиками, но зачастую это означает, что они действительно понимают риски.

person djna    schedule 05.05.2010

Если вы не можете контролировать платформу, вы не можете контролировать программное обеспечение на ней.

Даже если бы вы могли закрыть все перечисленные вами способы проверки, исходный код Java остается открытым. Они могли просто взять исходный код и перекомпилировать его с необходимыми встроенными изменениями.

Кроме того, постарайтесь помнить, что хотя это и ваш код, это их машина. Они имеют право проверить ваш код, чтобы убедиться, что его запуск на их машине делает то, что они ожидают, и не выполняет «дополнительных» действий, которые они могут счесть нежелательными. Менее заслуживающие доверия компании в прошлом сканировали ненужные файлы, копировали конфиденциальную информацию обратно на свои домашние серверы и т. д.

person Edwin Buck    schedule 05.05.2010
comment
Я не покупаю все, что нужно. По крайней мере, не в соответствии с действующим законодательством США об авторском праве. Если я выдаю им лицензию на использование моего программного обеспечения, мне нужно некоторое утешение, что они не могут просто обойти мое лицензирование на платформе Java. - person Andrew Westberg - BCSH; 05.05.2010
comment
Авторское право означает, что они не могут делать несанкционированные копии, а не проверять оригинал. Лицензия может содержать условия использования программного обеспечения и, вероятно, должна включать пункты, ограничивающие обратный инжиниринг, обход лицензионного кода и т. д. Однако вы лицензируете использование своего программного обеспечения, а не использование их аппаратного обеспечения или JVM. Тем не менее, это юридическое решение, а не техническое. Технически это невозможно сделать, если вы не предоставите закрытое аппаратное решение с подписанным BIOS и зашифрованными жесткими дисками, и даже в этом случае (XBOX) небольшая ошибка с вашей стороны может открыть код. - person Edwin Buck; 06.05.2010

Я бы посмотрел на командную строку и посмотрел, есть ли какие-либо параметры «-agent». Все профилировщики, отладчики и другие модификаторы кода используют это для самоанализа. Вы также можете проверить наличие необычных jar-файлов в пути загрузочного класса, поскольку они также могут представлять угрозу (но имейте в виду, что затем вы также должны установить пользовательскую JVM, поскольку некоторые программы, такие как Quicktime, добавляют себя в путь загрузки ВСЕХ запущенных приложений Java... (Я не мог поверить своим глазам, когда увидел это...))

person Daniel    schedule 05.05.2010
comment
Мне нравится идея сканировать строку cmd и искать -agent. Как насчет динамического подключения агентов? Есть ли способ обнаружить их из собственного кода? - person Andrew Westberg - BCSH; 06.05.2010
comment
Посмотрите, как visualvm подключается к работающей JVM и позволяет выполнять профилирование «на лету». Анализ командной строки никогда этого не поймает. - person Thorbjørn Ravn Andersen; 06.05.2010
comment
Чтобы визуальная виртуальная машина могла подключиться, JMX должен быть включен. Он мог бы проверить и это. - person Daniel; 06.05.2010
comment
Какая командная строка? В Java у вас нет доступа к аргументам, переданным виртуальной машине. - person maaartinus; 01.02.2011
comment
@Daniel Нет, visualvm может подключаться к любой нормально запущенной JVM Hotspot. - person Thorbjørn Ravn Andersen; 30.06.2018
comment
@ ThorbjørnRavnAndersen: Это может иметь место сегодня. Моему посту 8 лет ;) - person Daniel; 30.06.2018
comment
@Daniel Насколько я понимаю, visualvm всегда поддерживал API Java 6+ Attach. В том числе 8 лет назад. - person Thorbjørn Ravn Andersen; 01.07.2018
comment
@ ThorbjørnRavnAndersen: Хорошо, может быть, я просто не знал, что есть способ несколько лет назад. Допустим, вы правы. - person Daniel; 01.07.2018

По сути, это проигрышная битва.

Посмотрите, как работает visualvm в Sun JDK и как он может подключаться к работающему процессу и переопределять все, что ему заблагорассудится. Чрезвычайно сложно обнаружить это портативным способом, и если вы не можете этого сделать, вы можете отказаться от этого подхода.

Вопрос в том, чего вы хотите избежать?

person Thorbjørn Ravn Andersen    schedule 06.05.2010
comment
-XX:+DisableAttachMechanism выглядит так, как будто он может предотвратить динамическое присоединение. - person Andrew Westberg - BCSH; 06.05.2010
comment
@AndrewWestberg Есть ли способ программно отключить механизм присоединения из самого приложения Java после его запуска? Может через jmx? - person opeongo; 29.06.2018
comment
@opeongo Этому вопросу 8 лет, поэтому я некоторое время не работал в этой среде. Я не знаю никакого способа отключить присоединение, кроме командной строки. - person Andrew Westberg - BCSH; 04.07.2018