我想强制执行一个严格的Maven依赖策略,它超出了基本的checksumPolicy=fail
方法。
这是一个尝试提供保护,以防止修改后的版本依赖仍然有一个有效的摘要值,也被称为"依赖链攻击"。
这种情况可能发生在以下情况:
- 依赖项已更新,但作者没有更新版本号,并设法覆盖较早的版本(或他们的回购帐户已被泄露)
- 中间人攻击已就位(动态重写/哈希)
- 存储库本身已被破坏
在与其他开发人员的讨论中,解决上述问题的一种方法是在pom.xml中列出已知MD5/SHA摘要,并让Maven验证下载的依赖项是否具有相同的摘要。这确保了只要源代码存储库保持安全,任何已被破坏的包含的依赖项都将被检测到。
所以我的问题是双重的:
- 是否有更有效的替代方法?
- 是否有任何现有的实现/插件做这项工作?
如果有人正在努力解决这个问题,我已经创建了一个Maven执行者插件规则来处理它。您可以指定一个包含预期SHA1哈希值的工件urn列表,并让执行者验证这确实是构建中使用的内容。
它可以在MIT许可下通过Maven Central获得,源代码在GitHub: https://github.com/gary-rowe/BitcoinjEnforcerRules
虽然该项目表明它是针对Bitcoinj库的,但它实际上是一个通用的解决方案,可以包含在任何具有安全意识的构建过程中。它还将扫描您现有的项目并识别任何问题区域,同时它会自动为您构建白名单。
下面是一个配置的例子,你需要在你的项目中使用它。
<build>
<plugins>
...
<!-- Use the Enforcer to verify build integrity -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.2</version>
<executions>
<execution>
<id>enforce</id>
<phase>verify</phase>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<digestRule implementation="uk.co.froot.maven.enforcer.DigestRule">
<!-- Create a snapshot to build the list of URNs below -->
<buildSnapshot>true</buildSnapshot>
<!-- List of required hashes -->
<!-- Format is URN of groupId:artifactId:version:type:classifier:scope:hash -->
<!-- classifier is "null" if not present -->
<urns>
<urn>antlr:antlr:2.7.7:jar:null:compile:83cd2cd674a217ade95a4bb83a8a14f351f48bd0</urn>
<urn>dom4j:dom4j:1.6.1:jar:null:compile:5d3ccc056b6f056dbf0dddfdf43894b9065a8f94</urn>
<urn>org.bouncycastle:bcprov-jdk15:1.46:jar:null:compile:d726ceb2dcc711ef066cc639c12d856128ea1ef1</urn>
<urn>org.hibernate.common:hibernate-commons-annotations:4.0.1.Final:jar:null:compile:78bcf608d997d0529be2f4f781fdc89e801c9e88</urn>
<urn>org.hibernate.javax.persistence:hibernate-jpa-2.0-api:1.0.1.Final:jar:null:compile:3306a165afa81938fc3d8a0948e891de9f6b192b</urn>
<urn>org.hibernate:hibernate-core:4.1.8.Final:jar:null:compile:82b420eaf9f34f94ed5295454b068e62a9a58320</urn>
<urn>org.hibernate:hibernate-entitymanager:4.1.8.Final:jar:null:compile:70a29cc959862b975647f9a03145274afb15fc3a</urn>
<urn>org.javassist:javassist:3.15.0-GA:jar:null:compile:79907309ca4bb4e5e51d4086cc4179b2611358d7</urn>
<urn>org.jboss.logging:jboss-logging:3.1.0.GA:jar:null:compile:c71f2856e7b60efe485db39b37a31811e6c84365</urn>
<urn>org.jboss.spec.javax.transaction:jboss-transaction-api_1.1_spec:1.0.0.Final:jar:null:compile:2ab6236535e085d86f37fd97ddfdd35c88c1a419</urn>
<!-- A check for the rules themselves -->
<urn>uk.co.froot.maven.enforcer:digest-enforcer-rules:0.0.1:jar:null:runtime:16a9e04f3fe4bb143c42782d07d5faf65b32106f</urn>
</urns>
</digestRule>
</rules>
</configuration>
</execution>
</executions>
<!-- Ensure we download the enforcer rules -->
<dependencies>
<dependency>
<groupId>uk.co.froot.maven.enforcer</groupId>
<artifactId>digest-enforcer-rules</artifactId>
<version>0.0.1</version>
</dependency>
</dependencies>
</plugin>
...
</plugins>
</build>
听起来对存储库本身来说是一件好事。看看另一个关于类似问题的帖子。
我不熟悉Nexus中的PGP签名场景,但这听起来像一个好的开始吗?