使用Maven有多安全?

有人设置maven仓库和/或ipstream的伪装以提供伪装的原始库副本,但注入恶意或有害代码的风险和可能性或情景是什么。

有什么步骤和做法来防止这种风险和可能性?

我认为一个专门的,资源丰富的攻击者可以执行MITM攻击,并拦截所有对公共Maven仓库的请求,仔细地将恶意的字节码注入到JAR构件中,然后重新计算并提供SHA1哈希值。

对于客户端来说,它将显示为合法的工件:二进制JAR和SHA1匹配,即使它们检查备用镜像也是如此。

我想唯一真正的解决scheme是要求中央回购支持HTTPS(并相信TLS本身并没有被破坏)。

另外,一个实用的方法可能是通过HTTPS为内部客户端设置一个Maven代理(Artifactory或Nexus)。 这减less了攻击面,意味着你只需要保证从服务器到外部世界的通信线路。 我会定期再次检查代理上的JAR和哈希值是否与使用完全独立的可信networking的公共镜像匹配。

如果你确实想保持安全,那么你就不会相信二进制文件 – 相反,你将会下载所有的源代码,并在自己编译之前亲自检查它们但是假设你有足够的资源和时间来执行审查信任您的整个构build工具链开始。

那么,他们总是说,层层安全。

我可以想到几个场景,但第一个不是Maven特有的。

  1. DNScaching中毒

    您用来访问标准存储库的DNS数据可能会中毒,从而导致Maven从另一个存储库下载工件。 请参阅维基百科关于DNScaching中毒的文章 。

  2. 非标准的存储库

    您添加到Mavenconfiguration的任何存储库都可能提供包含恶意代码的工件。 通过只使用您信任的第三方存储库来防止这种情况。

  3. 版本库中毒

    根据Maven的指导将工件上传到Central Repository ,看起来中央的Maven仓库从批准的仓库主机发布工件,所以工件的安全性取决于主机。 我不知道成为一个批准的存储库主机的具体过程,但是列出的这么less,可能很麻烦。

    此外,中央仓库还需要所有部署的PGP签名,所以除非恶意用户能够访问项目的私钥,否则我认为这是不可能的。

  4. 传播过程中的神器修改(中间人)

    Maven会为所有工件自动执行校验和validation,因此攻击者必须修改工件和伴随的校验和以注入恶意代码。 我不知道是否可以完全防止它,但要确保你注意到校验和,请确保您的校验和策略不被设置为忽略。 请参阅设置文档 。

正如其他评论者所提到的,阻止恶意代码进入生产部署的一个好方法就是只使用一个内部Maven仓库来进行生产版本的构build。 通过限制对该存储库的依赖关系的访问,您可以确保它们都在您select的任何级别进行validation,例如校验和双重检查,源扫描。

如果你使用着名的仓库(中央maven仓库,jboss仓库)注入有害代码的可能性很小。 计算机病毒,您的ISP或您的ISP的ISP要这样做,必须在DNS服务器中混乱,或者更改某些目标集的路由path。 我认为这是不太可能的 – 这不仅是关于maven回购协议,而且所有的互联网服务(电子邮件,http,voip等)。 从项目站点直接下载JAR的风险更大。
无论如何,如果你想有一个完全控制,你可以build立你自己的Maven仓库(http://nexus.sonatype.org/);

存储库中的每个文件都应该有md5或者sha校验和 – 这样你就可以validation你下载的内容是否真的是你想要的。 但是 – 如果攻击者(病毒)足够聪明,可以拦截你的数据传输并且在JAR文件中乱七八糟,那么他也将足够聪明地截获md5 / sha校验和。 防御是为了提供校验和和工件的PGP签名 – 上传到中央仓库的发布工件被迫这样做(.asc文件)

最好的办法是使用Nexus Professional – 每次下载工件时,您都可以configuration采购套件以检查公钥服务器的PGP签名。 有关使用maven的PGP签名的更多信息可以在这里find:

https://docs.sonatype.org/display/Repository/How+To+Generate+PGP+Signatures+With+Maven

http://www.sonatype.com/people/2012/03/the-first-line-of-defense-checksums-and-pgp-signatures-in-repositories/