我可以避免第三方代码使用自定义的SecurityManager创建新线程,启动新VM或泄漏数据吗?
答案 0 :(得分:3)
线程创建会调用securityManager.checkAccess(g)
,其中g
为ThreadGroup
。这又需要SecurityConstants.MODIFY_THREADGROUP_PERMISSION
。
创建新JVM实例的唯一方法是启动一个新进程。这将需要SecurityConstraints.FILE_EXECUTE_ACTION
。
因此,如果您的SecurityManager针对这两个权限引发了异常,则会覆盖前两个案例。
您需要确定构成“泄露数据”的内容。关注意外或故意泄漏?问题是不受信任的代码访问数据,或者不受信任的代码的数据是否可被其他线程,类等访问?
答案 1 :(得分:3)
没有什么是完整的安全解决方案(除非你问推销员)。
我说SecurityManager可以控制所有这些(正如你所说,你不一定需要一个自定义安全管理器,你可以简单地通过策略配置很多)。控制线程,处理执行,强制访问私有数据和网络连接(第三方应用程序向竞争对手发送私人数据等) - 这就是SecurityManager的用途。
但是,您需要权衡您需要多少安全性。考虑到每个Java安全更新,Sun修复了Java安全沙箱中的3-4个漏洞(Java 6u15 as an example)。这些更新每年发生3-4次(或者不知道Oracle收购将对此做些什么)。因此,这些〜12年度漏洞中的任何一个都可能导致您的数据被泄露。
如果我的秘密对其他人非常有价值,我个人不会相信SecurityManager可以控制在我的环境中运行的潜在恶意第三方代码。 (我没有宝贵的秘密,我已经不相信在我的浏览器下运行的SecurityManager下运行了。)
答案 2 :(得分:2)
你当然可以做前两件事。但是,我不确定“泄漏数据”是什么意思。
注意,您不需要自定义的SecurityManager,只需要一个自定义策略文件。