基于 Maven POM 的自动化构建系统中依赖真实性验证

2024-01-01

我刚刚被指出一个非常有趣的article http://www.fortify.com/servlet/downloads/public/fortify_attacking_the_build.pdf (archived https://web.archive.org/web/20160310192751/https://www.fortify.com/downloads2/public/fortify_attacking_the_build.pdf)关于一个名为的安全问题 交叉构建注入 (XBI)。基本上,这是走私不良代码的一个奇特名称 通过自动构建系统(例如 ant、maven 或 ivy)在构建时将其集成到应用程序中。

这个问题可以通过引入依赖项的加密签名验证来缓解,因为它目前在许多操作系统中用于下载包。

需要明确的是:我是not谈论简单地为工件提供 md5 或 sha1 哈希值。这已经完成了,但这些哈希值存储在与工件相同的位置。因此,一旦恶意黑客破坏了存储库并可以替换工件,他们也可以替换哈希值。

因此,真正需要的是某种 PKI,它允许开发人员签署他们的工件,并允许 Maven 验证这些签名。由于签名是使用开发人员的私钥完成的,因此当仅存储库受到损害时,签名无法被篡改。

有谁知道maven 中的状态吗?


tl;dr:

Maven 中不存在的验证机制以及 POM DSL 中缺少的语言构造是严重的安全威胁。直到MNG-6026 https://issues.apache.org/jira/browse/MNG-6026已解决,请使用类似的东西摇篮见证人 https://github.com/WhisperSystems/gradle-witness.

介绍

到目前为止提供的答案似乎都没有解决问题。签署工件只是第一步进入正确的方向。但是用于签署工件的密钥被认为是可信/有效的条件非常不透明,有时甚至很弱。例如:如何pgpverify-maven-插件 https://stackoverflow.com/a/25319548/194894 or Nexus 专业版 https://stackoverflow.com/a/3309802/194894实际验证签名对于工件是否有效?仅从密钥服务器检索密钥并验证工件是不够的。

Sonatype 在他们的文章中简要提到了这一点博客文章 http://blog.sonatype.com/2012/03/the-first-line-of-defense-checksums-and-pgp-signatures-in-repositories/#.VpfdjK8rK00:

PGP 签名:另一个层面

在消费方面,您可以使用 Nexus Professional 中的采购 检查签名是否存在,以及在发布方面 使用 PGP 签名签署您的版本并进行 PGP 签名 在公钥服务器上可用将帮助人们仔细检查 工件和校验和是一致的。注:我觉得还有更多 创建鼓励使用 PGP 密钥的工具需要做的工作 更重要的是,给予存储库管理员一些控制权 哪些密钥值得信任。

(强调我的)

使用信任信息扩展项目对象模型 (POM)

我们需要的是能够对从您的项目或工件到声明的依赖项的信任关系进行建模。因此,如果所有相关方都声明这种关系,我们就能够创建一条从根(例如项目)到其依赖项直至最后一个传递依赖项的“信任链”。这项目对象模型 (POM) https://maven.apache.org/pom.html需要通过 元素来扩展依赖项。

现在的情况

现在我们有类似的东西

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.0</version>
</dependency>

硬依赖

对于硬依赖项, 可以包含工件的 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>

And now?

谢谢peter https://stackoverflow.com/questions/3307146/verification-of-dependency-authenticy-in-maven-pom-based-automated-build-systems/34795359?noredirect=1#comment62178671_34795359触发了我,我提出了 Apache Maven 的功能请求:MNG-6026 https://issues.apache.org/jira/browse/MNG-6026。让我们看看接下来会发生什么。

其他方法

摇篮见证人 https://github.com/WhisperSystems/gradle-witness对 gradle 做了类似的事情。但它有一些缺点:

  • 它构建在 gradle 之上(并构建在 POM 中)
  • 它只允许硬依赖,因为它使用哈希。

对于Maven 强制执行器插件 https://maven.apache.org/enforcer/maven-enforcer-plugin/.

pgpverify-maven-插件 http://www.simplify4u.org/pgpverify-maven-plugin/index.html显然也遵循这种方法。虽然缺少文档,但有一个测试所谓的keysMap财产 https://github.com/s4u/pgpverify-maven-plugin/blob/7dc1cb0f2c74352e7995c7cf1261dba040b7eb30/src/test/resources/keysMap1.properties,这也在配置文件中显示为keysMapLocation https://github.com/s4u/pgpverify-maven-plugin/blob/7dc1cb0f2c74352e7995c7cf1261dba040b7eb30/src/it/sigOkKeysMap/pom.xml#L46.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于 Maven POM 的自动化构建系统中依赖真实性验证 的相关文章

  • 限制对记录的访问。基于声明的权限是个好主意吗

    在 net 基于声明的身份框架中 如果我想限制用户对某个帐户 特定帐户 123456 执行操作 查看或编辑 我说的是商业实体 例如银行帐户 创建索赔是个好主意吗对于他们可以查看或编辑的每个帐户 一组中有很多索赔有什么缺点吗 系统管理员可能有
  • 手动编辑 Jar 以更改包名称

    我有一个来自外部源的 jar 文件 jar 中的所有类都位于 com xyz 包中 我想将所有类移动到 com xyzold 包中 这是否像解压缩 jar 将 xzy 文件夹重命名为 xyzold 并重新压缩它一样简单 或者我还需要修改每个
  • 使用 Netbeans(和 Maven)运行正确的上下文根

    当我从 Netbeans 7 2 运行项目时遇到了一些问题 我还使用 Glassfish 3 1 2 服务器 事实上 我正在将现有项目从 Ant 迁移到 Maven 我的 pom xml 已完成 并且我已经使用了上下文根的自定义 如下所述
  • 保护 ASP.NET 网站中 Elmah RSS 源的安全

    我遵循了这个问题的答案在 ASP NET 网站中保护 Elmah 的安全 https stackoverflow com questions 1245364 securing elmah in asp net website限制对 elma
  • 运行maven编译两次

    我正在将 ant 项目迁移到 Maven 这个项目非常不寻常 它使用两个编译步骤和这些编译步骤之间的代码生成步骤 整个构建过程可以描述如下 编译 src 目录中的所有内容 运行内部java工具 将java指向已编译的类和用于编译这些类的ja
  • 将多模块 Maven 项目导入 Eclipse 时出现问题 (STS 2.5.2)

    我刚刚花了最后一个小时查看 Stackoverflow com 上的线程 尝试将 Maven 项目导入到 Spring ToolSuite 2 5 2 中 Maven 项目有多个模块 当我使用 STS 中的 Import 向导导入项目时 所
  • Netbeans 8 不会重新加载静态 Thymeleaf 文件

    我通过 Maven 使用 Spring Boot 和 Thymeleaf 当我进行更改时 我似乎无法让 Netbeans 自动重新部署我的任何 Thymeleaf 模板文件 为了看到更改 我需要进行完整的清理 构建 运行 这需要太长的时间
  • 我可以在 PHP 会话变量中安全地存储用户名和密码吗?

    我想在 REST api 之上制作一个轻量级的 web 应用程序 用户只需进行一次身份验证 从那时起 所有针对 web api 的请求都希望通过以某种方式保持用户名和密码有效来完成 我已经做了一个工作原型我在哪里将用户名和密码存储在会话变量
  • FormsAuthentication:安全吗?

    Using 表单验证构建成asp net创建一个为经过身份验证的用户创建 cookie 的登录系统非常快速且简单 FormsAuthentication SetAuthCookie uniqueUsername false 与中的一些代码配
  • Maven + Resteasy JAXB 找不到内容类型 application/xml 的 writer

    我想创建一个将在其他项目中使用的 jar 其中包括使用 ReastEasy 库 jaxb jaxrs jaxrs clients 等 虽然我包含了所有库 并且在基于 Maven 的项目中一切正常 但显然有些库未包含在 jar 中 并且我在简
  • JSF Maven Mojarra 实施

    我尝试使用 JSF Eclipse 和 Maven 创建简单的项目 我用了
  • com.google.android:android:jar 的 dependency.dependency.version' 丢失

    我正在尝试使用 Eclipse 运行一个简单的虚拟 Android 项目 并且我正在尝试使用 Maven amd 我已按照已接受答案的教程进行操作this https stackoverflow com questions 6735562
  • md5() 是做什么用的?

    我正在阅读本教程简单的PHP登录系统 http www phpeasystep com workshopview php id 6 最后它建议你应该使用 md5 加密您的密码 http www phpeasystep com worksho
  • 如何从maven中的组中排除所有工件?

    我正在使用 Maven 3 并配置 Enforcer 插件来强制版本收敛 我正在使用 Spring 3 1 2 和 Spring Security 3 1 3 问题是 Spring 3 1 3 POM 声明了对 Spring 3 0 7 的
  • 我可以直接在 Maven 中使用 GitHub 项目吗?

    我有兴趣使用GitHub 上的项目 https github com toelen spymemcached jcache作为我的项目中的依赖项 GitHub 项目有一个pom文件 我可以修改我的pom文件来使用这个项目 如果是这样 怎么办
  • 同源政策目的可疑

    正如我所读到的 同源策略是防止源自 邪恶 域 A 的脚本向 良好 域 B 发出请求 换句话说 跨站点请求伪造 玩了一下我了解到的Access Control Allow Origin标头和CORS据我了解 它允许从好域 B 指定服务器 域
  • 何时从容器管理的安全性转向 Apache Shiro、Spring Security 等替代方案?

    我正在尝试保护使用 JSF2 0 构建的应用程序的安全 我很困惑人们什么时候会选择使用 Shiro Spring Security 或 owasp 的 esapi 等安全替代方案 而放弃容器管理的安全性 看过一些相关问题 https sta
  • 在根项目“bin”中找不到任务“bintrayUpload”

    我遵循了将 AAR 文件发布到 JCenter 所需的每个步骤 然后使用 Maven Central 将其同步https github com danielemaddaluno gradle jcenter publish https gi
  • php隐藏所有错误[重复]

    这个问题在这里已经有答案了 隐藏的最佳做法是什么allPHP 错误 因为我不想向用户显示错误 我尝试过使用 htacess通过输入代码php flag display errors off在那里 但它返回给我一个500 error 还有其他
  • HTTP 基本身份验证 + 访问令牌?

    我正在开发一个 REST API 计划将其与 Web 和 IOS 应用程序一起使用 我打算让这个 API 在一段时间内保持私有 私有意味着我只希望我的 Web 应用程序和 ios 应用程序访问该 API 我已经阅读了许多不同的身份验证方法

随机推荐

  • 如何在 UIButton 上制作原生“脉冲效果”动画 - iOS

    我希望在 UIButton 上有某种脉冲动画 无限循环 缩小 缩小 以便它立即引起用户的注意 我看到了这个链接如何使用 webkit animation 向外环创建脉冲效果 https stackoverflow com questions
  • Rails 4 + 引导程序设置资产

    我正在尝试设置引导程序 on Rails4 using bootstrap sass我收到了这个著名的错误 Sprockets FileNotFound couldn t find file bootstrap in app assets
  • 产品目录API失败

    需要帮忙 我尝试从https developers facebook com docs marketing api dynamic product ads ads management v2 3创建的帐户 批准者为phone 创建了企业帐户
  • SKShader 创建视差背景

    使用固定相机的视差背景很容易做到 但由于我正在制作一个自上而下的视图 2D 空间探索游戏 我认为有一个 SKSpriteNode 填充屏幕并作为我的 SKCameraNode 的子级并使用 SKShader 绘制一个视差星空会更容易 我继续
  • 为什么将带有尾随空格的行提交到源代码管理中是不好的?

    为什么将带有尾随空格的行签入到源代码管理中是不好的 这会导致什么类型的问题 基本上是错误的差异 如果差异仅显示 真实 更改 则会很有帮助 一些 diff 程序会忽略空格 但最好首先避免虚拟更改 当然 如果它在同事的机器上换行也无济于事
  • 第三方广告提供商的广告如何传送到网页?

    当网页加载到浏览器中时 第三方广告提供商如何决定向网页投放什么广告 这些数据以什么格式传送 假设我的网页不包含与广告相关或差异化的内容 但我确实了解我的用户的很多信息 人口统计资料 兴趣 浏览历史记录等 因此 我想要加载的广告必须依赖于用户
  • 如何使 iframe 适合整个屏幕而不指定尺寸?

    如果我不指定任何尺寸 iframe 就会显得很小 如果我确实按如下方式指定尺寸 则它无法针对不同的屏幕分辨率正确缩放 有没有办法自动让 iframe 拉伸到整个屏幕 Use
  • 如何在 SBT 构建中跳过测试?

    我有一个 SBT 0 7 5 项目 它的一些测试用例失败了 在修复所有测试用例之前 我想跳过测试来生成 JAR 是否有任何命令行参数告诉 SBT 跳过所有测试 例如 Maven 的 Dmaven test skip true flag 我遇
  • 在主线程之外创建 QDialog 的方法

    我正在尝试在 QT 中创建一个客户端应用程序 它需要两个线程进行处理和可变数量的窗口实例 但我很难弄清楚如何在处理线程之一内创建一个新窗口 我知道所有 ui 元素必须在与 QApplication 类相同的线程中创建 但我需要能够实例化 或
  • 如何使用 git fetch 覆盖本地标签?

    如何使用 git fetch 覆盖本地标签 我想用远程标签替换本地标签 从 Git 2 20 开始 您需要显式指定强制标志 git fetch origin tags force 在 Git 版本 2 20 之前 与使用 git push
  • 推送“未签出”分支

    我想推送一个分支 不是当前的 而不必先检查它 我怎样才能实现这一点 这就是我要做的 currently in master git checkout feature git push origin feature git checkout
  • seaborn boxplot:更改均值的颜色和形状

    我似乎找不到答案的简单问题 如何更改 Seaborn 箱线图中平均指标的颜色和形状 它默认为绿色三角形 通常很难看到 我试图在 seaborn 文档和 matplotlib 文档中找到答案 stackoverflow 上还有一个相关问题 有
  • Foundation 5、Simple Form 和 Rails - 如何让“提示”CSS 类正常工作

    我已经搜索了几天并进行了实验 但我无法获得要显示的简单表单 gem 提示 CSS 类 这只是一个类 当您将鼠标悬停在表单输入上时显示表单输入的提示 我正在使用 Rails 4 1 以及最新的 simple form gem 和 Founda
  • Java api 到 exiftool

    我对用 java api 或类似的东西解析 exiftool 结果很感兴趣 我一直在研究 但没有找到任何例子 例如 我如何在我的java项目中获得这些结果 Exif工具版本号 8 22 文件名 Exif工具 jpg 目录 t images
  • 使用 GCC 和 Egypt 生成综合调用图

    我正在尝试生成一个全面的调用图 包括对 Linux 运行时等的低级调用 我使用 fdump rtl expand 静态编译了我的源文件并创建了 RTL 文件 我将其传递给名为 Egypt 的 PERL 脚本 我认为是 Graphviz Do
  • 在数据网格中查找文本框

    我有一个包含四列的数据网格 因此 从 C 端的这个数据网格中 我想找到 name headBox 的特定文本框 我该怎么做呢 我的该列的 xaml 如下所示 此部分位于 Datagrid Columns 中 该列位于名称 dgrid 的 d
  • 如何阻止某些记录在 SQL 查询中多次显示

    这里是完整的 SQL Fiddle http rextester com MTIFT55374 如您所见 记录来自recommendations表显示多次 但是如果我删除这一行LEFT JOIN cast ON cast cast tmdb
  • 为参数“appIdName”提供了“无效值”?

    我已经在这个应用程序上工作了几个星期 一切都很棒 我一直在建造 归档并玩得很开心 所有证书 个人资料和 ID 看起来 都井然有序且运行良好 然后几天前 似乎没有任何我能看出的变化 Xcode 说我没有任何 具有有效签名身份的配置文件 当我告
  • 在 ruby​​ 中,如何使用映射方法调用方法链?

    我将如何调用要使用的块 id to s在红宝石中 category ids categories map id to s 我正在破解它并立即执行以下操作 category ids categories each do c category
  • 基于 Maven POM 的自动化构建系统中依赖真实性验证

    我刚刚被指出一个非常有趣的article http www fortify com servlet downloads public fortify attacking the build pdf archived https web ar