我将分发一个独立的Java应用程序,它将安装在公共/共享计算机上。我希望从可能的恶意/好奇用户那里获得应用程序。这意味着我希望应用程序在具有自定义策略文件的SecurityManager的上下文中运行。
我知道使用安全管理器运行Java应用程序的两种方法。
-Djava.security.manager
和-Djava.security.policy=someUrl
。这种方法似乎有以下缺点:
someUrl
是指攻击者可以修改的本地计算机上的位置
策略文件并有效地绕过安全沙箱。someUrl
是指远程计算机上的位置和远程计算机
应用程序启动后无法访问应用程序
将(可能)无法启动。 System.setProperty("java.security.policy", "path/to/policy/file");
System.setSecurityManager(new SecurityManager());
无论哪种方式,在我看来,无法保证独立应用程序将在公共/共享计算机上的安全管理器环境中运行。
我的分析错了吗?当应用程序在公共/共享计算机上运行时,应用程序开发人员是否可以保证应用程序在安全管理器中运行,并保证策略文件未被篡改?
答案 0 :(得分:3)
你的分析是正确的,你不能有这样的保证。
您的程序由Java虚拟机执行。无论你想要什么属性的JVM,你都要问它“这个属性是否成立?”。所以你要问JVM“你是否保护我的应用程序免受那些正在运行你的人的攻击?”,并且运行该JVM的人可以将其配置为谎言 - 只要说“是”,即使答案是否定的。最多你需要一个JVM的小补丁,甚至可能不是因为想要看你的应用程序运行的人可以启动一个调试器。
安全管理器控制应用程序之间的分离。它保护您的应用程序免受其他Java应用程序它不能保护您免受JVM本身的侵害:通过在其上运行应用程序,您相信它。
我有时会为那些认为自己是虔诚的人的亵渎而感到震惊 - 例如,那些从不洗澡而不穿浴袍的修女们。当被问到为什么,因为没有人能看到他们,他们回答:'哦,但你忘记了善良的上帝。'显然他们认为神是一个偷窥的汤姆,他的无所不能使他能透过浴室的墙壁看到,但是谁被浴袍挫败了。这种观点让我很好奇。 (Bertrand Russell)
答案 1 :(得分:2)
我希望尽可能保护应用程序免受可能的恶意/好奇用户的攻击。
我想说安全管理器的目的是保护用户免受恶意应用程序的攻击,这意味着用户有权定义运行特定应用程序的策略。
当然,应用程序可以检查是否已设置SecurityManager,并且可以在没有安全管理器的情况下拒绝工作或以编程方式安装SecurityManager。
如果您需要保护您的应用程序不被修改,那么安全管理器/访问控制器不是正确的机制。您的第一站是寻求签署您的应用程序并将其作为applet或更通用的Web启动应用程序运行。
如果您需要阻止特定用户(或一组用户)做某事,那么您需要某种身份验证和授权方案。安全策略类型具有每用户策略的概念,并且在单个特定计算机上手动配置应用程序部署的上下文中有用,但在通用情况下很难使用。