我只是指出了一个很有趣的文章关于称为交叉编译注射(XBI)中的安全问题。 Bascially它是走私坏码到通过自动构建系统,如蚂蚁,行家或常春藤在构建时的应用程序的奇特的名字。
这一问题可以通过引入加密签名验证献给依赖关系,因为它是目前到位有许多操作系统下载的软件包来缓解。
需要明确的是:我说的不是简单地提供MD5或SHA-1散列的文物。 这已经完成,但这些哈希存储在相同的位置的工件。 因此,一旦一个恶意的黑客危及库可替代的神器,他们可以代替哈希为好。
那么,什么是实际上可以需要的是某种PKI的,它允许开发人员签上自己的文物和Maven来验证这些签名。 由于签名是使用开发商的私钥做不能在只有库被损害与被篡改。
有谁知道这在行家的状态?
更新:下面提到的校验确实只针对完整性检查,确实是存储与文物,使他们不回答这个问题。
实际上,一个需要登录使用PGP将它们上载到要同步与中央存储库工件(在Maven的GPG插件可以帮助这一步)。 为了验证在下载时的签名,你被邀请使用一个仓库管理器支持此功能。 从如何生成与Maven PGP签名 :
如果您使用的工具,下载从中央Maven仓库的文物,你需要确保你正在努力,以验证这些文物具有可以对公共密钥服务器来验证有效的PGP签名。 如果你不验证签名,那么你就不能保证你正在下载的是原来的神器。 以核实有关文物签名的一种方法是使用一个仓库管理器,如Nexus专业。 在专业的Nexus可以配置采购套件检查每个下载神器一个有效的PGP签名和对公共密钥服务器验证签名。
如果您正在使用Maven的开发软件,您应该为您的版本一个PGP签名。 释放具有有效签名的软件,意味着你的客户可以验证是由原作者生成的软件制品,它没有被在传输过程中任何人修改。 多数大型OSS伪造像Apache软件基金会要求所有项目,通过其主要是由该组织的其他成员签署了发布经理被释放,如果你想同步您的软件构件到Maven中央您需要提供PGP签名 。
也可以看看
- 如何生成PGP签名与Maven
- 上传文物中央Maven仓库:DIY
Maven的安装插件可以被配置为创建完整性校验 (MD5,SHA-1),你可以配置每个库的校验和政策(见checksumPolicy
)。
Maven仓库管理人员可以/也应该能够对付他们。 例如见:
TL;博士 :
Maven中不存在的核查机制,并在POM的DSL缺少语言结构是一个严重的安全威胁。 直到MNG-6026是针对使用成才像摇篮见证 。
介绍
到目前为止提供的答案似乎都不解决问题。 签名工件是只是第一步到正确的方向。 但是,当用于签署神器的关键被认为是可信的条件/有效期是非常不透明。 例如:如何pgpverify - Maven的插件或的Nexus专业实际验证签名是有效的神器? 刚刚从获取的密钥服务器密钥和验证神器是没有足够的。
Sonatype的提到了这短暂在他们的博客文章 :
PGP签名:另一个层面
在消费方面,可以利用采购中的Nexus专业检查签名的存在,并在发布侧用PGP签名来签署发布,使PGP签名可在公共密钥服务器将帮助人们仔细检查文物和校验和是一致的。 注:我认为有更多的工作要做,以创建一个鼓励使用PGP密钥和,更重要的是,给仓库管理员提供了哪些键是值得信任一些控制工具。
(重点煤矿)
扩大与信任信息的项目对象模型(POM)
我们需要的是从你的项目或工件信任关系模型的声明依赖性的可能性。 所以说,如果有关各方声明这样的关系,我们能够创建在其依赖关系的从根“信任链”(例如项目)下降到最后的传递依赖。 的项目对象模型(POM)需要通过对依赖关系的<验证/>元素进行扩展。
现在的情况
现在,我们有这样的事情
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
</dependency>
硬依赖
对于硬的依赖关系,<verfication />可能包括伪像的sha256sum及其POM文件:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<verification>
<checksum hash='sha-256'>
<pom>[sha256 of junit pom file]</pom>
<artifact>[sha256sum of artifact (junit.jar)]</artifact>
</checksum>
</verification>
</dependency>
软依赖
如果使用软或远程依赖关系,那么我们就可以指定用于签署文物密钥对的公共密钥(或多个)
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>[4.0,4.5)</version>
<verification>
<openpgp>[secure fingerprint of OpenPGP key]</openpgp>
<!-- possible further 'openpgp' elements in case the artifacts in the
specified version range where signed by multiple keys -->
</verification>
</dependency>
现在?
由于彼得触发了我,我已经提出了对Apache Maven的功能请求: MNG-6026 。 让我们看看接下来会发生什么。
其他方法
摇篮证人确实为gradle这个类似的东西。 但它也有一些缺点:
- 它是建立在gradle这个之上(并内置POM)
- 它仅允许硬相关性,因为它使用哈希值。
同样的似乎是真实的Maven插件强制实施 。
pgpverify - Maven的插件 appearently也遵循这一做法。 尽管文档中缺少有一个用于所谓的测试keysMap
财产 ,这也出现在配置文件中keysMapLocation
。
“这个问题可以通过引入加密签名验证献给依赖有所缓解,因为它是目前实行的许多操作系统下载包。”
你要找签署您的jar文件。 http://download-llnw.oracle.com/javase/1.3/docs/tooldocs/win32/jarsigner.html
你需要保护你的私钥与适当的措施。 但是,如果你是偏执这样的冷静,你可能需要看看有关PKI,公共密钥基础设施。
现在可以通过使用这个插件来验证Maven的PGP签名: http://www.simplify4u.org/pgpverify-maven-plugin/index.html
下面是如何在父配置它pom.xml
:
<build>
<plugins>
<plugin>
<groupId>com.github.s4u.plugins</groupId>
<artifactId>pgpverify-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<pgpKeyServer>https://pgp.mit.edu</pgpKeyServer>
</configuration>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
<phase>install</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
此配置结合的PGP检查到install
阶段。
如果你不想运行检查所有的时间,除去<executions />
元素和手动运行它像这样:
mvn com.github.s4u.plugins:pgpverify-maven-plugin:check
文章来源: Verification of dependency authenticy in Maven POM based automated build systems