Security 如何实施严格的Maven依赖策略(依赖链攻击)

Security 如何实施严格的Maven依赖策略(依赖链攻击),security,maven,Security,Maven,我想强制执行一个严格的Maven依赖策略,它超越了基本的checksumPolicy=fail方法 这是一种尝试,旨在针对修改后的版本依赖项提供保护,该版本依赖项仍然具有有效的摘要值,也称为“依赖项链攻击” 这种情况可能由以下情况引起: 依赖项已更新,但作者尚未更新版本号,并成功覆盖早期版本(或其回购帐户已被泄露) 中间人攻击已经到位(即时重写/散列) 存储库本身已被破坏 在与其他开发人员的讨论中,解决上述问题的一种方法是在pom.xml中列出已知的MD5/SHA摘要,并让Maven验证下载

我想强制执行一个严格的Maven依赖策略,它超越了基本的
checksumPolicy=fail
方法

这是一种尝试,旨在针对修改后的版本依赖项提供保护,该版本依赖项仍然具有有效的摘要值,也称为“依赖项链攻击”

这种情况可能由以下情况引起:

  • 依赖项已更新,但作者尚未更新版本号,并成功覆盖早期版本(或其回购帐户已被泄露)
  • 中间人攻击已经到位(即时重写/散列)
  • 存储库本身已被破坏
在与其他开发人员的讨论中,解决上述问题的一种方法是在pom.xml中列出已知的MD5/SHA摘要,并让Maven验证下载的依赖项是否具有相同的摘要。这确保了只要源代码存储库保持安全,就会检测到任何已被破坏的包含的依赖项

因此,我的问题有两个:

  • 有没有其他更有效的方法
  • 是否有任何现有的实现/插件可以完成这项工作

  • 听起来对存储库本身来说是一项不错的工作。关于类似的问题,请查看另一个


    我不熟悉Nexus中的PGP签名场景,但这听起来像是一个好的开始吗?

    如果有人自己在努力解决这个问题,我已经创建了一个规则来处理它。您可以指定包含预期SHA1哈希值的工件URN列表,并让实施者验证这确实是构建中使用的内容

    它可以通过麻省理工学院许可的Maven Central获得,源代码在GitHub中:

    虽然该项目表明它是针对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>
    
    
    ...
    org.apache.maven.plugins
    maven enforcer插件
    1.2
    执行
    验证
    执行
    真的
    antlr:antlr:2.7.7:jar:null:compile:83cd2cd674a217ade95a4bb83a8a14f351f48bd0
    dom4j:dom4j:1.6.1:jar:null:compile:5D3CCC056B6F056DBF0DDDF43894B9065A8F94
    org.bouncycastle:bcprov-jdk15:1.46:jar:null:compile:d726ceb2dcc711ef066cc639c12d856128ea1ef1
    org.hibernate.common:hibernate commons注释:4.0.1.Final:jar:null:compile:78bcf608d997d0529be2f4f781fdc89e801c9e88
    持久性:hibernate-jpa-2.0-api:1.0.1.Final:jar:null:compile:3306a165afa81938fc3d8a0948e891de9f6b192b
    org.hibernate:hibernate核心:4.1.8.Final:jar:null:compile:82b420eaf9f34f94ed5295454b068e62a9a58320
    org.hibernate:hibernate entitymanager:4.1.8.Final:jar:null:compile:70a29cc959862b975647f9a03145274afb15fc3a
    org.javassist:javassist:3.15.0-GA:jar:null:compile:79907309ca4bb4e5e51d4086cc4179b2611358d7
    org.jboss.logging:jboss logging:3.1.0.GA:jar:null:compile:c71f2856e7b60efe485db39b37a31811e6c84365
    org.jboss.spec.javax.transaction:jboss-transaction-api_1.1_spec:1.0.0.Final:jar:null:compile:2ab6236535e085d86f37fd97ddfdd35c88c1a419
    enforcer:digest enforcer规则:0.0.1:jar:null:runtime:16a9e04f3fe4bb143c42782d07d5faf65b32106f
    uk.co.froot.maven.enforcer
    摘要执法者规则
    0.0.1
    ...
    
    您知道maven存储库中已经有校验和(md5、sha1)了吗?如果其中一个校验和不正确,只需更改settings.xml(checksumpolicy?)即可使生成失败。这不是因为校验和不正确,而是因为它们已更改。请仔细阅读问题。我已经阅读了问题。你是说Maven Central吗?任何任意的存储库。Maven Central很可能会提供保护,以避免覆盖发布的工件,但黑客确实会发生,而且我需要能够检测到它们。关于这一点的有用讨论我确实查看了该线程,似乎签名JAR是一种很好的方法。不幸的是,我不能保证作者会签署他们的JAR。此外,我更愿意使用像Maven Central这样的回购协议来检测变化,而不是依赖于我自己的内部回购协议,因为这是一个开源项目。