Firefox、VLC、Linux……我们对一些自由软件(其代码公开且可重复使用)已经非常熟悉。然而,这些仅仅是其生态系统中的冰山一角。就像在建造类游戏中一样,一个简单的移动应用程序可以组合数百个由不同开发者编写的自由组件。软件工程研究员斯蒂芬诺·扎基罗利(Stefano Zacchiroli)指出:“根据开展审计的公司的数据,市场上95%至99%的软件产品至少包含一部分开源软件。”
换句话说,自由软件无处不在。然而,要了解源代码的演变过程,仅凭其当前版本有时是不够的,还需要能够追溯其历史。由斯蒂芬诺·扎基罗利於2016年联合创立的软件遗产(Software Heritage)是一个非营利性的全球档案库,用于收集、保存和分享公共软件的代码。因此,它为研究人员提供了一个观察这一生态系统及其漏洞的窗口。
软件供应链的薄弱环节
这份公开记忆尤其有助于研究代码重用带来的风险。共享组件虽然可以避免重复发明已有的东西,但也会产生依赖性:单个组件中的一个漏洞可能会危及所有使用它的软件,甚至超出其最初的项目范围。专家们称之为“软件供应链”,其链条中的每一个环节都可能成为网络犯罪分子的首选目标。
在工业界,恶意人士不一定需要强行闯入工厂才能损害一家企业,他们可以攻击其供应商。在数字世界中也是如此。网络攻击者可以瞄准小型自由软件组件,在其中植入恶意代码,然后等待其被整合到更广泛分发的最终产品中。研究人员强调:“攻击一个在业余时间工作的志愿者,要比攻击一家最终将真正目标产品推向市场的企业容易得多。”在供应链的另一端也是如此:攻击者可以在分发时(例如通过在线商店)篡改应用程序,而无需触碰原始代码。
在过去的十多年里,这些故意利用软件供应链漏洞的攻击已经加剧,甚至成为网络安全领域的一个重要议题。如今,社会亟需解决方案来更好地检测和抵御这些攻击。
历史记录的记忆
通常,开发者会保留其代码的演变记录。像Git这样的版本控制软件会保存不同版本并允许回溯。但这些历史记录也可能被改写。相比之下,软件遗产是一个保存历史记录本身的历史记忆的档案库,斯蒂芬诺·扎基罗利补充道。
通过比较软件的连续版本,研究人员及其团队在约1%的归档项目中检测到了历史记录的重写。这绝非微不足道,因为软件遗产目前保存着超过4.2亿个项目。这些重写并不能证明攻击确实发生过,然而,它们的检测为用户提供了一种在信任软件之前验证其变化的方法。研究人员解释道:“借助软件遗产,我们可以建立一种类似审计的机制,记录在某一时刻存在于软件中的版本。”这样,我们就可以检查可疑的修改,而不是任由它们悄无声息地消失。
继承的缺陷
另一种现象是被遗忘的副本。研究人员详细解释道:“在自由软件的世界里,每个人都可以复制一份软件,并使其朝着自己的方向发展。我们称之为分叉,即一种衍生形式。”但如果原始项目修复了一个漏洞,而副本没有集成该修复,那么该副本就会继承漏洞,却缺乏解决方案。
公共数据库已经指出了哪个版本的软件引入了漏洞,以及哪个版本修复了它。通过将这些信息与完整的归档代码历史记录进行交叉比对,团队能够追踪到漏洞在哪个版本以及哪些副本中仍然存在。这种情况曾影响过商业软件,例如市场上某些电子阅读器的软件,并且仍然很常见。在与安全专家一起手动审查的300个案例中,该团队确认了衍生软件中存在十几个高危漏洞。原因在于:这些副本的开发者根本不知道补丁的存在。
这些工作的目的并不是自动修复这些软件。该研究人员补充道:“我们的目标更多是展示,通过像软件遗产这样的代码全局观察平台,我们可以向用户通报这些问题,以便他们如果愿意的话进行修复。”
当人工智能进入代码
这个存档不仅用于追踪漏洞,还能够观察代码是如何编写的,以及由谁编写。就像在许多行业一样,人工智能在编写代码方面正日益占据主导地位。能够提供或修改代码的人工智能代理正与开发人员并肩工作。
为了衡量这种转变的规模,来自波尔多、雷恩和巴西的斯蒂芬诺·扎基罗利及其同事在项目中寻找了人工智能留下的痕迹,例如软件的参数和修改历史记录。该研究人员指出:“我们发现,在GitHub上大约72%的近期和活跃项目中,人工智能被用于辅助编码,而较早的项目则只有近26%。”这些数据甚至可能被低估了:某些人工智能的使用根本不会留下任何可检测的痕迹。
自由软件建立在由志愿者、员工、企业和公共机构参与组成的社区之上。人工智能代理的出现带来了什么变化?一些项目已经接受了人工智能提出的修改,前提是必须由人类进行验证并承担责任。另一些项目则完全拒绝,以保留自由软件的社区特性。开发者会越来越少看代码,转而专注于测试或产品管理吗?随着贡献变得越来越容易,社区会吸引更多人加入,还是有一天会完全由机器接管,由代理之间互相协作?如果因为缺乏维护人员,人工智能会从被遗弃的软件中提取数字灵魂呢?


