走向可复制的最小源代码tarball?在*-src.tar.gz上

在工作期间分析xz后门目前,已经提出了一些改进软件供应链生态系统的想法。其中一些想法是好的,一些想法充其量是无关紧要和无害的,而一些建议显然是坏的。我想尝试将之前讨论过的两个想法形式化,但它们可以被欣赏的背景并不像今天那么清楚。

  1. 可复制的柏油球。其想法是,发布的源tarball应该能够以某种方式独立复制,并且应该不断测试和验证,最好是作为上游项目持续集成系统的一部分(例如GitHub操作或GitLab管道)。虽然名义上这看起来很容易实现,但其中有一些复杂的问题,例如:tarball中的文件使用什么时间戳?我已经提出了这个方面之前。
  2. 在没有生成供应商文件的情况下,最小化源tarball。大多数基于GNU Autoconf/Automake的tarball预先生成文件,这些文件对于在没有所需依赖关系的外来系统上进行引导很重要。要使引导故事成功,必须支持这种方法。然而,很明显,这种做法会带来巨大的成本和风险。大多数现代GNU/Linux发行版都具有所有必需的依赖性,实际上更喜欢从源代码重新构建所有内容。这些预先生成的额外文件给该过程带来了不确定性。

我提出的改进建议是定义新的tarball格式*-src.tar.gz公司至少具有以下属性:

  1. tarball应该允许用户构建项目,这就是所有这些的全部目的。这意味着至少必须包含项目的所有源代码。
  2. tarball应该签名,例如使用PGP或minisign。
  3. tarball应该可以由第三方使用上游的版本控制源和使用修订的指针(例如git标记或git提交)逐位复制。
  4. tarball不需要互联网连接就可以下载东西。
    • 推论:每个外部依赖项要么必须明确记录下来(例如,gcc和GnuTLS),要么包含在tarball中。
    • 观察:这意味着包括所有*.po型 获取文本通常从版本控制源构建时下载的翻译。
  5. tarball应该包含使用尽可能多的外部发布版本化工具从源代码构建项目所需的所有内容。这是目前所缺乏的“最小”财产。
    • 推论:这意味着包括OpenSSL或libz的供应商副本是不可接受的:作为外部项目链接到它们。
    • 开放性问题:非发布的外部工具如何,例如格努利布autoconf存档宏? 这有点微妙:大多数发行版要么只打包一个当前版本的gnulib,要么打包autoconf存档,而不是打包以前的版本。虽然这可能会发生变化,但发行版可以打包gnulib git存储库(直到某些当前版本)和autoconf存档git存储库可提取所需的版本(格努利布的/引导程序已经通过支持此–gnulib-refdir参数),这通常不到位。
    • 建议的推论:tarball应该包含git子模块的内容,例如gnulib和项目所需的必要Autoconf存档M4宏。
  6. 类似于GNU项目指定的方式/配置界面我们需要一个文档化的接口来指导如何引导项目。我建议使用已经很成熟的跑步习惯用法./引导设置包以便以后可以通过./配置。当然,有些项目没有使用autotool./配置接口,也不会遵循这一点,但与autotools竞争的大多数构建系统都有关于如何构建项目的说明,它们应该记录类似的接口,以便引导源tarball进行构建。

如果实现上述目标的tarball可以从流行的上游项目中获得,那么发行版可以更容易地使用它们,而不是当前包含预生成内容的tarball。优点是构建过程不会被“不必要的”文件污染。我们需要为维护人员开发工具来创建这些tarball,类似于制造距离产生今天的foo-1.2.3.tar.gz(目标.gz)文件夹。

我认为反对这种方法的一个常见论点是:为什么要费心这么做,而只是使用git存档输出?或者避免整个tarball方法,直接转向版本控制的签出,并将上游版本称为git URL和commit标记或idSHA-1断裂,因此信任SHA-1标识符是不安全的。另一个反驳意见是,这以上游维护者为代价优化了打包者的利益:大多数上游维护者不想存储gettext*.po型源代码存储库中的翻译。在维护者和包装者的需求之间进行折衷是有用的,因此*-src.tar.gz公司tarball方法是我们需要解决的间接方法。更新:在我的实验中仅为Libntlm提供源代码tarball我实际上使用了git-archive输出。

你怎么认为?

9回复“走向可复制的最小源代码tarballs?On*-src.tar.gz”

  1. 自从我遇到了一个崩溃(不记得是不是安全漏洞),它是通过不匹配格式字符串的翻译引入的,尽管有一些防范措施,我认为作为维护者的最佳实践是至少最低限度地检查.po文件并提交它们,而不是仅仅自动将它们拉入。

    当然还有更多的工作要做。我想说的是,我在大约10%的提交材料中发现了错误,这比你可能预期的要高,但即使你不阅读目标语言,也经常有可能注意到技术材料翻译差异中可能出现的结构性错误。

    • 事实上,出于这个原因,我曾经将所有*.po文件存储在git中,并通过查看更改手动更新它们。我还担心恶意制作的*.po文件可能会导致开发人员机器受损——有人分析过吗?翻译下载时没有任何散列或签名验证,因此有很好的机会在那里设置后门,甚至触发后门。

      从那以后,我开始使用gnulib/相反,我已经放弃了这种做法。也许这应该重新考虑。

      /西蒙

  2. c/c++最终会通过展台下载/离线功能获得良好的库管理吗?甚至作为标准的一部分?

    • 我怀疑这种情况会发生,因为关于如何实现它,几乎没有什么共同点。GNU autotools是一种方法,cmake另一种方法是自制的*.sh构建脚本,我相信还有许多更广泛使用的方法。这种灵活性可能是C语言的优点之一,但通常也是一个缺点。

      /西蒙

  3. 我从来没有听到过关于在上游存储.po文件的投诉,如果替代方案是在发布时从互联网上下载随机内容,那么这个建议似乎很奇怪。翻译应该是上游存储库的一部分。与Colin一样,我也倾向于审查、查找和修复翻译人员提交的.po文件中的问题(与通常的错误报告一样)。

    虽然我过去考虑过从存储库中删除.pot文件,因为我的策略是不在其中存储任何自动生成的文件,但这几乎是我对该规则的唯一例外,因为这意味着翻译人员不需要任何本地工具就可以进行翻译,只需下载.po和或.pot文件即可。

    我也不喜欢gnulib和autoconf-archive嵌入工作流。前者应该被IMO切换到共享库,这当然会给gnulib上游带来更多开销。就我个人而言,对于任何我需要的东西,如果有必要的话,我都倾向于自己从头开始实现它们,以避免这些工作流。

    对于存档,我还一直在考虑是生成原始的tarball,还是生成原始的和可移植的tarballs。如果我选择第二种,我想我默认将原始的命名为name-version.tar.xz,将可移植的命名为其他名称,因为我认为这是我希望人们使用的常见情况,而在没有所需工具的系统上的人们可以下载可移植的完全自动识别的。但我还没有决定。

    例如,我现在还为dpkg准备了一个新的.dist-vcs-id来跟踪tarball中的提交id,以便增加可跟踪性,因为在此之前,如果当前提交不是签名标记的一部分,那么提交id只存在于包版本中。

  4. 以下是我个人可以通过您的“最小源代码tarball”建议想到的问题:
    1.对于软件包维护者来说,他们可能不想在一个软件版本中创建两个tarball。这增加了发布过程的负载,并为少数人提供了好处。我知道有像你这样的构建者,包括发行版,他们想要重新生成所有预生成的构建文件。下载发布tarball并自己删除文件怎么样?为了安全起见,您可以不信任预生成的makefile并运行“autoreconf&&./configure&&makemaintaier-clean”
    有可能简化基于autotools的包的过程。
    2.格努利布。与人们的想法相反,Gnulib没有共享库。Gnulib支持环绕现有libc实现的例程,并打算静态链接。需要Gnulib中的哪些例程是由包决定的。也许我们能做的最好的事情是实现一种更新机制,以便如果发行版提供Gnulib,那么“./configure”可以用发行版中的模块替换(或更新)源代码中的Gnulib模块。

  5. 对我来说,可复制源tarball是一个没有头脑的东西。我多年来一直在分发可复制源Tarball,GNU Mes、Dezyne和Gash都是这样做的,仅举几个例子。

    当然,遗憾的是,Autotools和Gettext仍然(严重)阻碍了这一点,但它们并不是唯一的;“让我们添加一个时间戳”的拜物教像病毒一样传播,也确实没有帮助。

    就在昨天,我向GNU Guix提交了“[PATCH v2 00/12]Reproductible `make dist'tarball,藐视Autotools和Gettext”,以使其源tarball可复制。

    请参见https://issues.guix.gnu.org/70169/#21

  6. Pingback:可复制且仅限最小来源的tarball–Simon Josefsson的博客

留下回复

您的电子邮件地址将不会被发布。 已标记必填字段*

*