只需要做两件事:
控制maven(或任何其他公共仓库)中的第三方依赖,并发布带有恶意软件的新版本(或替换现有的发布版本)。
希望客户的应用程序使用具有新的依赖版本的外部资源库(或具有$latest版本的完美案例)。
如果这些要求得到满足,受感染的依赖关系可以执行恶意软件代码。这给了黑客什么机会? 无数个!
在恶意软件内部,我们能够动态地执行几乎所有可以想到的应用程序。但在所有的问题中,我认为最昂贵的是被盗的源代码。
只要JVM能够访问包含类的文件夹,我们就可以预料到外部依赖性也有权利阅读它。在实践中,窃取源代码有两个步骤。
从用户目录/classpath复制*.class文件。
向黑客的服务器发送*.class的二进制数据(在我们的例子中,我们将只打印类的名称和它们的大小)。
在这个例子中,我们将通过将恶意软件注入SLF4J 日志组件 来重现攻击。我们假设黑客获得了对SLF4J仓库的访问权(作为一种选择,黑客可能会执行中间人攻击并替换来自外部仓库的jar文件传入请求)。
他有来自外部仓库(如maven central)的记录器依赖。
他使用最新版本或手动更新到最新版本(不是强制性条件,但在这种情况下,由于大多数用户使用的是固定版本,所以泄漏会被社区发现)。
黑客侧
受害者更新版本和启动应用程序时的结果
有没有什么终极方法来保护你的Java应用程序免受此类攻击?不幸的是,没有,有很多方法可以将恶意软件注入你的代码中。黑客可以在构建过程中注入恶意软件,也可以在JDK中注入恶意软件,还可以通过控制你的网络动态地替换依赖关系。然而,为了保护你的应用程序,以下是你应该实施的一些预防措施。
不要使用外部资源库,而是使用你的私人资源库(例如 https://oss.sonatype.org/)。
使用稳定的依赖版本,永远不要使用$LATEST的版本。
不要使用自定义的、非官方的依赖(不是来自官方来源)。
配置网络并关闭大多数端口/协议,以避免源代码传输。
在关键情况下--将你的应用程序部署在内部专用网络中(虽然,这对大多数应用程序来说不是一个选择,特别是对全球客户来说)。
还有很多方法可以入侵Java应用程序。在这篇文章中,描述了大多数黑客使用的最知名、最有效的方法。不要忽视提到的建议,做好你的应用程序的安全。
如有想了解更多软件设计与架构, 系统IT,企业信息化, 团队管理 资讯,请关注我的微信订阅号:
作者:Petter Liu
出处:http://www.cnblogs.com/wintersun/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
该文章也同时发布在我的独立博客中-Petter Liu Blog。