有人设置maven存储库和/或ip流的伪装以提供原始的伪装库副本但注入恶意或有害代码的风险和可能性或场景。
防止此类风险和可能性的步骤和做法是什么?
答案 0 :(得分:26)
我认为一个专门的,足智多谋的攻击者可以执行MITM攻击并拦截对公共Maven存储库的所有请求,小心地将恶意字节码注入JAR工件,然后重新计算并提供SHA1哈希值。
对于客户端,它看起来像一个合法的工件:二进制JAR和SHA1匹配,即使它们检查备用镜像也是一样的。
我认为唯一真正的解决方案是请求中央存储库支持HTTPS(并且相信TLS本身没有被破坏)。
或者,实际方法可能是设置通过HTTPS向内部客户端提供的Maven代理(Artifactory或Nexus)。这减少了攻击面,意味着您只需要保护从该服务器到外部世界的通信线路。我会定期仔细检查代理上的JAR和哈希是否与使用完全独立,可信赖的网络的公共镜像上的JAR和哈希相匹配。
如果您真的非常想要保证安全,那么您就不会信任二进制文件 - 而是在下载所有源代码并手动查看 之前自己编译 - 但这假设您有足够的合格资源和时间进行评论和信任您的整个构建工具链。
嗯,他们总是说层层安全。
答案 1 :(得分:7)
我可以想到几种情况,虽然第一种情况不是Maven特有的。
DNS缓存中毒
用于访问标准存储库的DNS数据可能会中毒,从而导致Maven从其他存储库下载工件。请参阅the wikipedia article on DNS cache poisoning。
非标准存储库
您添加到Maven配置的任何存储库都可能提供包含恶意代码的工件。通过仅使用您信任的第三方存储库来防止这种情况。
存储库中毒
基于Maven的Guide to uploading artifacts to the Central Repository,看起来中央Maven存储库从已批准的存储库主机发布工件,因此工件的安全性取决于主机。我不知道有关成为一个批准的存储库主机的过程的细节,但由于很少列出它可能是繁重的。
此外,中央仓库需要所有部署的PGP签名,因此除非恶意用户获得项目私钥的访问权限,否则我认为这是不可能的。
传输过程中的神器修改(中间的人)
Maven对所有工件进行自动校验和验证,因此攻击者必须修改工件和附带的校验和以注入恶意代码。我不知道你是否可以完全阻止它,但为了确保你注意校验和,请确保你的校验和策略不会被忽略。请参阅settings doc。
正如其他评论者所提到的,防止恶意代码进入生产部署的一个好方法是仅使用内部Maven存储库进行生产版本构建。通过限制对该存储库添加依赖项的访问权限,您可以确保它们都在您选择的任何级别进行验证,例如:校验和复核,源扫描。
答案 2 :(得分:4)
如果您使用众所周知的存储库(中央maven存储库,jboss存储库),则注入有害代码的可能性非常低。您的ISP的计算机病毒,您的ISP或ISP这样做,必须弄乱DNS服务器,或更改某些目的地的路由路径。我认为这不太可能 - 同样不仅仅是关于maven repos,而是关于所有互联网服务(电子邮件,http,voip等)。直接从项目站点下载JAR的风险更大。
无论如何,如果你想拥有一个完全控制,你可以设置自己的maven存储库(http://nexus.sonatype.org/)
存储库中的每个可用文件都应生成md5或sha校验和 - 这样您就可以验证下载的内容是否真正符合您的要求。但是 - 如果攻击者(病毒)足够智能拦截你的数据传输和混乱的JAR文件,他也会足够智能拦截md5 / sha校验和。针对它的防御是为校验和和工件提供PGP签名 - 上传到中央存储库的发布工件被强制执行(.asc文件)
好主意是使用Nexus Professional - 您可以配置采购套件,以便在每次下载工件时检查公钥服务器的PGP签名。有关maven PGP签名的更多信息,请访问:
https://docs.sonatype.org/display/Repository/How+To+Generate+PGP+Signatures+With+Maven