【问题标题】:How are build / code coverage badges generated by 3rd-party sites?3rd 方站点如何生成构建/代码覆盖率徽章?
【发布时间】:2020-05-09 22:12:28
【问题描述】:

我的工作设置包括公司托管的 Github Enterprise Server 和 Azure Devops 管道。使用shields.io 之类的网站,我可以为构建成功或代码覆盖率生成徽章,似乎从未使用 DevOps 验证自己。然后徽章托管在 shields.io 上,这意味着这个第 3 方网站必须以某种方式访问​​我的构建过程。它们看起来像这样:

由于 github 以及所有构建管道显然都是公司内部的,我可以看到三个选项如何工作:

  1. 尽管管道和所有内容都是私有的,但构建成功状态是为整个 Web 公开托管的。这是设计使然,因为它并不真正被视为安全风险。知道我的内部项目的 Organization/ProjectName/DefinitionID 就没有别的办法了。

  2. 这不应该发生,并且配置有误。我的设置中可能存在漏洞。

  3. 正在进行某种我不知道的身份验证形式,例如只要我的浏览器登录到 Azure,我就只能看到徽章(不太可能,它似乎也可以在私有模式下工作)

我在网上或 stackoverflow 上找不到任何关于此的内容。我会很高兴看到任何解释这一点的资源,因为我不确定我是否可以安全地使用它们。使用 shields.io 是否存在安全风险?

【问题讨论】:

  • 如果您访问 shields.io 上的 azure devops build badge 页面,它会要求提供项目 ID。大概这是私有的,并且提供此 id 可以验证您从 azure 接收构建状态。
  • 项目ID似乎只是一个向上计数的计数器,我无法更改。由于这在现在是安全的,我无法想象它可以用作任何形式的身份验证。
  • 在示例中我看到here(点击/azure-devops/build/:organization/:projectId/:definitionId),它是一个长字符串。但我只是猜测,所以我无法回答。 Travis CI 对私有存储库使用类似的策略。
  • shields.io 中的示例是错误的/过时的:只需传递项目名称而不是项目 ID 字样。

标签: github azure-devops devops shields.io


【解决方案1】:

您提到的徽章通常只是没有信息的空白 SVG 图像(您可以查看templates here)。

因此,对于创建 SVG(或 PNG)的服务:

  • 该服务通过某种 CI 系统从您那里获取更新数据
  • 该服务生成一个对应的图像(SVG 或 PNG),该图像附加到某个 GET 端点

Service 有两种实现方式:

  • 将 shields.io 用作服务,将带有如何生成图像的信息的 JSON 发送到他们的JSON endpoint
  • 使用 shields.io 作为库或通过任何自定义方式在内部实现图像生成。

因此,无论哪种方式,具有徽章的 SaaS 应用程序通常都会为它们自己服务(即使它们在内部调用 shields.io)。这意味着每个服务都可以自己实施任何安全措施。

传递给 shields.io 的数据通常包括两个单词和一些颜色。因此,不会为了生成徽章而暴露太多信息(参见下面的示例)。此外,服务和 shields.io 之间的通信是加密的并通过 HTTPS 发送。

就隐私而言,一个例子是大公司通常拥有只能在内部访问的托管解决方案,因此徽章也只能在内部访问。

您的问题中特别包含的徽章仅包含来自应用商店的公共数据或 GitHub 项目的明星等。只要项目本身是公开的,这些数据通常是公开的。这些徽章经常使用 shields.io API 使用公共数据自动生成它们。

但是,如果您查看诸如工作服或 Travis 之类的徽章,您会发现它们拥有自己的徽章:

  • <img src="https://travis-ci.org/Kibibit/achievibit.svg?branch=master">

  • <img src="https://coveralls.io/repos/github/Kibibit/achievibit/badge.svg?branch=master">

这是一个关于如何使用 shields.io 作为库创建徽章并提供服务的小打字稿示例:

首先,安装gh-badges

npm i gh-badges --save

这就是你使用它的方式:

import { BadgeFactory } from 'gh-badges';

(async () => {
  const bf = new BadgeFactory();

  const format = {
    format: 'svg',
    text: [ 'coverage', '90%' ],
    labelColor: '#894597',
    color: '#5d5d5d',
    template: 'for-the-badge',
    logo: [
      'data:image/png;base64,iVBORw0KGgoAAAA',
      'NSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJL',
      'R0QA/wD/AP+gvaeTAAAA/0lEQVRYhe3WMU7DM',
      'BjFcadqh0qdWWBl7QU4Ss/AjsREF8RdOhYO0E',
      'qoN2DhFIgBOvBjIIMVxSFyUiEhP8lD7C/v/T9',
      '7sEMoKkoIe+Npn8qpOgCM2VBVVa1ZkzFDcjQd',
      'apDqLIR+u/jnO1AACkABKABdAO9DjHEWfb7lA',
      'LwOAQghXPXx6gJ4zE3GJIRwE0095Zhc4PO3iz',
      '7x7zoq+cB5bifr9tg0AK7xFZXcZYXXZjNs+wB',
      'giofG8hazbIDaeI5dFwAu8dxY2mE+KDyCWGCT',
      'YLj3c86xNliMEh5BVLjFseNEjnVN8pU0BsgSh',
      '5bwA5YnC25AVFjhpR6rk3Zd9K/1Dcae2pUn6m',
      'qiAAAAAElFTkSuQmCC'
    ].join('')
  };

  return bf.create(format);
})();

这与上面提到的作为服务端点发送到 shields.io 的数据基本相同。

您可以在控制器上下文 herehere 中查看完整示例。

关于它的风险,主要是考虑这里实际暴露了哪些数据。这几乎没有。如果您担心数据隐私,您可以自己生成徽章并提供服务或根据需要私下嵌入它们;-)

【讨论】:

  • 感谢您的广泛回答。我的收获是,我们管道的构建状态似乎确实是面向公众的,并且可能被 shields.io 或第三方记录/滥用,他们真的不会获得很多,因为这不是真正有用/可误用的信息。
  • @Thomas 是的。听起来是对的 :-) 只要没有身份验证并且服务器公开公开,徽章的图像也会公开公开。但是攻击者需要知道确切的端点来获取图像以获取一些信息,即使那样,他们也知之甚少。我认为在大多数情况下,公司愿意承担的风险很小,如果他们不这样做,他们可以在内部安全地创建徽章。
  • 一个有效的安全解决方案示例:自托管 GitLab 将徽章作为一项功能嵌入。因此,由于 GitLab 仅由连接到公司内部网络的计算机托管和访问,GitLab 为项目或特定分支\buids 生成的徽章也只能在内部访问
  • 安全解决方案的另一个示例是在构建发生时在 CI\CD 中运行一个小脚本,用于收集构建信息和覆盖信息;在脚本中生成图像(无需调用任何 API 并暴露数据);并将图像嵌入\上传到任何您想要的安全位置。不依赖 CI\CD 最终创建的徽章。但是再次......这可能是一个矫枉过正:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-02
  • 2015-05-31
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多