避免这种常见的开源扫描错误

为什么源代码扫描器有时会报告不正确的许可证信息?
55 位读者喜欢这篇文章。
image of a target

Internet Archive Book Images。由 Opensource.com 修改。CC BY-SA 4.0

Pete Townshend,英国摇滚乐队 The Who 的传奇吉他手,以演奏挂留和弦而闻名。挂留和弦为歌曲增添了音乐张力。对于像我一样喜欢 C 调的钢琴演奏者来说,只需弹奏 C 大调和弦(音符 C、E 和 G),并将 E 音符替换为 F 或 D。您现在正走在成为英国摇滚明星的道路上!1

音乐通常充满了和弦的组合,例如挂留和弦,它们提供张力,然后释放。虽然在音乐作品中增加张力是可取的,但在使用开源工具的扫描软件中增加张力当然是不受欢迎的。

Red Hat 中一个涉及扫描软件的问题促使我写了这篇文章。

最近,一位重要的客户在扫描了我们一些软件的源代码后提出了一个担忧。如您所知,Red Hat 提供了其软件的源代码。客户的扫描工具报告说,某个软件文件是在 GPLv3 许可下授权的,这出乎意料。事实上,该软件文件被明确且唯一地标记为在 Apache 2.0 许可下授权。客户要求我们调查这个问题,我们很乐意这样做。

经过我们深入的研究,我们得出结论,他们的扫描软件显然是不正确的。我们提出了一个解释这种异常现象的假设,我现在将解释。

一种流行的开源软件扫描工具将正在扫描的软件与预先存在的开源软件的大型存储库进行比较,并报告任何匹配项。例如,假设有一个名为 MIT.c 的开源文件,它返回一个比传递给它的整数高一个的整数。换句话说,它是一个简单的加法器。它可能看起来像这样

Copyright 2021 Jeffrey R. Kaufman

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

int foo(int x) {
	x+=1;
	return x;
}

对于这个假设的例子,假设 MIT.c 被放置在名为 The Simple Maths Project 的 GitHub 存储库中,作为一个基于开源社区的项目,用于解决简单的算术问题。该项目包含许多其他类似的 C 语言文件,所有文件都使用相同的 MIT 许可证。

由于这个假设的示例函数非常有用(当然它不是,但请继续看下去),因此它被包含在内,以便在 GitHub 上的许多其他开源项目中提供简单的算术实用程序。另外,假设另一个名为 The Sustained Chord Calculator 的项目使用了来自 The Simple Maths Project 的 MIT.c 源文件来帮助计算挂留和弦的音乐公式。

假设的 Suspended Chord Calculator 项目,除了使用 MIT.c 之外,还包括几个在 GPLv2 许可下授权的源文件。当编译 Suspended Chord Calculator 项目时,您可以假设生成的exe文件将包含 GPLv2 许可的软件和 MIT 许可的 MIT.c,作为一个组合作品,在这种情况下,MIT.c 不能被合理地视为独立的和单独的作品。生成的exe文件将被正确地视为在 GPLv2 下授权,并且必须遵守 GPLv2 的义务。合规性意味着提供(或在三年内提供)用于创建二进制文件或exe文件的所有源代码,包括所有在 GPLv2 和 MIT.c 许可下的软件文件。

回到我们的问题……

假设您的一个软件产品使用了 MIT.c,以及您自己编写的软件。由于 MIT.c 完全在 MIT 许可证下,这将使您有义务仅遵守 MIT 许可证条款,这很容易做到。通常,人们通过在软件分发时提供 MIT 许可证的副本以及版权声明来遵守。或者,如果您像 Red Hat 这样的公司,提供包含许可证文本的源代码也是一种合规方法——也是我推荐的方法。(请参阅 开源软件许可证合规性的经济高效模型。)

如果您决定使用一种引用开源项目存储库的源代码扫描器来扫描您的软件产品的源代码,您的扫描器很可能会报告 MIT.c 是在 GPLv2 许可下授权的!为什么?因为它会看到 MIT.c,以源代码形式,与在 GPLv2 许可下授权的 The Suspended Chord Calculator 项目相关联,并天真地假设 MIT.c 也必须受 GPLv2 条款的约束。尽管如此,MIT.c 源文件已明确标记为 MIT 许可证,并且您仅从原始 MIT 许可的 The Simple Maths Project 中复制了它。

这是使用这些类型的扫描系统的一个不幸的后果。在本例中,此类系统通常会错误地报告其存储库中每个使用 MIT.c 的开源项目。可能有数十个、数百个甚至数千个程序使用 MIT.c,所有程序都在不同的许可证下,您将收到大量项目供您审查,这些项目表明 MIT.c 可能是 MIT 许可、BSD 许可、GPLv2 许可,或者,坦率地说,可以从恰好使用 MIT.c 的项目中获得任何其他开源许可证。最终,您会发现该文件仅在 MIT.c 下获得许可。根据我的经验,在极少数情况下,这种类型的扫描是必要的,即使是合理的,文件许可证结果也与您预期的不同。这种情况会发生,但很少见。

还有另一种类型的软件扫描系统,它通过仅查找项目源文件中已知许可证文本的匹配项来报告许可证信息。这种类型的扫描器将检测源代码中的 MIT 许可证文本,并正确报告该软件受 MIT 许可证条款的约束,尽管 MIT.c 可能在许多其他开源项目中在不同的许可证条款下使用。虽然这种类型的源代码扫描器也可能出现误报,但在我的经验中,对于前面讨论的原因,引用开源项目存储库的源代码扫描器具有明显更高的误报率。

坦率地说,引用开源软件存储库以确定许可证数据的源代码扫描器在某些情况下可能很有用,例如,当您可能非常担心工程师在没有同时复制适用许可证文本的情况下,无意中从不可接受的许可证中复制粘贴了源代码。在这种情况下,仅查找许可证文本匹配项的源代码扫描器将无法检测到该包含项。但是,正如我之前所说,这种情况非常罕见,这使得存储库匹配的源代码扫描器容易出错,并且浪费资源来追踪真相。这些时间和资源可以用于解决更多实质性问题。您还可以通过培训您的开发人员永远不要从其他来源复制软件,而不同时复制任何适用的许可证来解决这种情况。

一个报告不正确许可证的扫描器,通过要求您解决误报,对您的组织造成了巨大的损害。无数小时的资源浪费在这些徒劳的追逐上……正如我们的客户所经历的那样。

我们不会再被愚弄了!


我要感谢我的同事 Richard Fontana 建议了本文的标题。请在 Opensource.com 的 法律版块 阅读他的一些精彩文章。

1. 如果您想了解更多关于音乐理论和挂留和弦的信息,请查看 Rick Beato 对 The Who 的另一首优秀曲目的分析,网址为 What Makes This Song Great? Ep. 96 The Who

标签
Picture of Jeffrey Robert Kaufman
Jeffrey R. Kaufman 是 Red Hat, Inc.(世界领先的开源软件解决方案提供商)的高级商务顾问(开源法律团队)。Jeffrey 还在北卡罗来纳大学担任法律学兼职教授。

评论已关闭。

Creative Commons 许可协议本作品根据 Creative Commons 署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.