maven - 我们怎么知道我们可以信任 Maven 中央存储库?

标签 maven

对不起,如果这个问题不适合 StackOverflow,它不是一个编码问题。

我是 Maven 的新手,我很好奇如何可以免费访问 Maven 中央存储库。据我所知,它是由一家名为 SonaType 的公司维护的。他们在资助它吗?为什么?它是否充当其其余业务的潜在客户生成工具?我想如果我了解他们的原因,我就会知道是否或如何/何时信任它。

最佳答案

很好的问题,特别是因为使用不安全的第三方库现在在 OWASP 前 10 名中。不幸的是,大多数人认为 Maven Central 是理所当然的。我认为他们过于乐观了。

很多人认为,因为你必须对提交给 Maven 的文件进行签名,所以该软件是可以信任的。不幸的是,他们忽略的是 如果您不能确定对库进行签名的 key 属于提供给 Maven 的原始来源,则签名是没有意义的 . Maven 似乎就是这种情况。

解释变得简单

为了简化说明,请考虑以下类比。当您去机场飞往某个地方时,您需要提供身份证件以证明您就是您所说的人。对于本地旅行,驾照就足够了。检查您身份证件的人有几件事要检查:

  • 同一来源:驾照上的姓名与车票上的姓名一致吗?这阻止了奥萨马·本·拉登以巴拉克·奥巴马的名义预订机票。
  • 来源真实性:驾照上的图片看起来像登记的人。这可以防止奥萨马·本·拉登窃取巴拉克·奥巴马的驾驶执照并用它以他的名义登记。
  • 文件的真实性:驾照是真实的。这可以防止奥萨马·本·拉登获得带有他的照片但上面有巴拉克·奥巴马的名字的伪造驾驶执照。

  • 现在进行相同的类比来验证来自 Maven 的对象。 Maven 文档声称上传到那里的库需要 PGP 签名(引用: Guide to uploading artifacts to the Central repository )(尽管 Sonatype claims many older packages do not have the signatures )。将驾照类比为 key ,将票类类比为 Maven Artifact ,并提出相同的问题:
  • 相同来源:签署库的 key 是否与签署库的同一原始来源的某个人相关联?
  • 来源的真实性:我们能否验证该 key 确实属于签署它的同一原始来源?
  • 文档的真实性: Artifact (库)上的 PGP 签名是否经验证为有效签名?

  • 要检查同一来源,只需从 key 服务器下载与 Artifact 相关联的公钥,并验证它是否来自与原始来源相关联的电子邮件地址。例如,这可以通过 MIT PGP keyserver 来完成。 .有关如何完成此操作的具体详细信息,请参阅 Verify Dependencies using PGP .

    其中第三个实际上是最容易做到的,因为它可以完全自动化(参见 GPG quickstart guide, section on verifying detached signatures)。这部分不需要人工干预。

    第二部分是差距所在。即使签名检查出来并且 MIT key 服务器声称 key 与原始来源相关联,我们怎么知道它真的是由原始来源而不是其他人创建的?事实上,只是为了演示目的,我为 Mickey Mouse 创建了一个 key 。在 MIT key 服务器上。我可以轻松创建一个似乎与 oracle.com 或 spring.io 或 whitehouse.gov 相关联的 key 。

    那么真正的威胁是什么?

    在人们发送包含可执行恶意软件的电子邮件并且 NSA 正在破坏 SSL 的世界中,认为这些相同的黑帽子不针对捆绑到世界各地众多应用程序中的软件存储库是幼稚的。其实还有at least three serious examples that were caught .

    所以要清楚,如果我是一个黑帽子,这正是我会做的(为了记录:我不是一个黑帽子!!!)。我会采用一个广泛使用的开源包。然后我会将我的后门潜入包的源代码并在本地构建它。下一步是创建与原始来源的电子邮件地址相关联的 key 对。我将该 key 上传到 MIT key 服务器(它接受电子邮件地址而无需任何验证),然后对我的恶意包进行签名。最后,我将我的恶意包连同签名上传到 Maven 并窃笑,因为我的恶意软件逐渐被世界各地的产品采用。我声称这次攻击不太可能很快被发现。

    如何信任从 Maven 下载的软件?

    不幸的是,对此没有简单的答案。你越是信任你正在使用的软件,你的工作效率就越低。您需要做出现实的权衡,以平衡安全性和生产力。

    简而言之(因为我已经气喘吁吁了),我将仅引用两个来源,它们可以帮助指导您更好地选择第三方库。首先是遵循 Fortify Attacking the Build 第 5 节中的建议。纸,特别是包括安全审查过程。

    第二个推荐是Sonatype有一款产品叫CLM这可以帮助您的公司分析您正在使用的软件,包括提供有关已知缺陷的信息以及有多少其他组织正在使用相同的产品。

    Sonatype 里面有什么?

    除了可以卖的Sonatype的Nexus和CLM产品,还有值得一读的this article . Sonatype 正在引领软件开发效率和开源解决方案信任之间的平衡。他们还没有完全解决所有问题(不会透露我与他们交换的私有(private)电子邮件),但他们正朝着正确的方向前进。

    关于maven - 我们怎么知道我们可以信任 Maven 中央存储库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24967270/

    相关文章:

    java - gradle maven-publish plugin 添加时间戳,如何避免放入后缀

    maven - 快照 jar 的 maven-metadata.xml 中的时间戳比实际 jar 的时间戳多一秒?

    java - 由于 "maven-metadata-bintray-central.xml"文件中的错误,Maven 构建失败

    java - 包含依赖项的 ClassNotFoundException

    java - Lucene-6.4.2 : No class found DefaultSimilarity, 尝试添加查询。

    java - Grails 2.3.8可搜索的插件和Maven

    jira-rest-java-client-0.2-m1.jar 的 Maven 依赖项

    java - 是否可以使用 Activejdbc 和 Maven 进行仪器模块项目?

    git - '.gitignore' 文件中应该忽略哪些项目文件? ( Spring 启动)

    java - Maven bundle 插件生成带有错误或缺失版本的 list