Maven Central 并没有它看起来的那么自由
Posted on 2022-07-22 by
F-Droid 始终致力于分发自由开源 Android 应用程序。从源代码为 Android 构建自由软件面临与 Debian 等 GNU/Linux 发行版不同的一系列挑战。 Android 应用是交叉编译的:它们与运行的操作系统不同。最重要的是,Android 只提供了一组内置的准系统库。与 Java 生态系统一样,应用通常从 Maven 存储库中获取库二进制文件并使用它们构建应用。为了确保应用只使用自由开源依赖构建,我们在 fdroidserver 中开发了一个扫描系统来限制依赖源并找出有问题的依赖项。
自 2015 年起,F-Droid 禁止使用未知的 Maven 存储库并仅信任一些知名的 Maven 存储库。之后,更多存储库被添加到了列表中。目前有 8 个我们信任的 Maven 存储库:
- Maven Central
- 谷歌 Maven 存储库
- JCenter
- OSS Sonatype
- OSS JFrog
- JitPack.io
- Clojars
- CommonsWare
- Gradle 插件存储库
2020 年,源代码中包含的 JAR 和 AAR 文件被禁止,这些受信任的存储库成为最后的弱点。我们依赖它们只提供 FOSS 库。但是,它们中的任何一个都不能保证这样做,并且它们一直是潜入 APK 的非自由库的重要来源。
Maven Central 存储库是 “Java 和其他开源组件的最大集合” 以及 Maven 和 Gradle 的默认存储库,“自 2002 年以来提供开源组件”。 Android 应用中使用的绝大多数库,除了 Google 自己的,都是从 Maven Central 获取的。它是最成熟和最知名的 Maven 存储库之一。 Maven Central 对源代码有严格的要求,并要求提供源代码控制系统信息且声明许可证。它还要求组 ID 应与所有者的域名匹配,并且文件应签名。此外,Maven Central 对可重复构建提供一等的支持,这对确保应用是 100% 自由软件帮助很大。
似乎一切都好得令人难以置信。不幸的是,它不是真的。尽管他们声明 Maven Central 是 “OSS Repository Hosting”,但他们并不要求托管在那里的库是自由开源软件。有时我们会发现从 Mavrn Central 拉取了一个非自由库,不得不下架许多受影响应用的已发布版本。
托管在 Maven Central 上的那些开源库是否值得信赖?并非如此。一些库标记为自由开源许可证,但源代码 JAR 文件是空的。更糟糕的是,他们甚至鼓励上传源代码的假的 JAR 文件以通过检查,这使得他们的要求完全没有意义。声明的许可信息可能就是错误并且源代码控制系统信息只是随意指向一个链接或仅包含二进制 jar 文件的存储库。另一个常见的情况是库本身是“开源的”,但它依赖于其他专有库。
其他受信任的 Maven 存储库也有问题。毫不奇怪,Google 托管了许多专有库,而开源库可能依赖那些专有库。OSS Sonatype 和 JCenter 存储库与 Maven Central 同步,并包含一些额外的库。JitPack.io 托管从 GitHub 构建的任何内容,而不检查许可证或者存储库中是否有任何二进制文件,更不用说依赖项了。Clojars 和 Gradle 插件仓库也没有许可证要求。来自 Debian 和 CommonsWare 存储库的 java 包非常好,但很少被使用。
鉴于我们有限的资源和当前情况,这可能是一场没有终点的战斗。但是我们得到了更多的武器。多亏了我们的二进制扫描器,我们在这些 Maven 存储库中找到了大量依赖于非自由依赖的库,其中大部分来自 Maven Central。将来我们可能会在构建之前扫描依赖关系图以找到它们。但是,这无助于找到具有非自由许可证的库。我们阻止列表中的那些非自由库大多是偶然和依靠经验发现的。我们现在正在为以后研究更可靠的方法。