吞噬世界的软件越多,安全性就越关键……但这到底意味着什么?
软件工程师的安全性很差,因为软件工程师不习惯认为软件会造成伤害。在整个行业中,技术领导的风范已经传给了大约我这个年龄的人,也许是几岁。当计算机功能不那么强大,使用计算机是一种优化而非必要,计算机在玩具中首次取得商业成功时,我们就长大了。我们不认为安全是软件的重要问题,我们需要改变对此的看法。
但是,软件安全意味着什么?很容易概念化汽车的安全性。易于理解的医疗仪器可能是不安全的。但是代码?
我喜欢将软件安全视为三个关注点。了解构建的内容在这三个层次上的适合程度,将告诉您如何最好地将时间和精力集中在安全对话上。
多年来,软件开发人员唯一想到的“安全性”就是“内存安全性”。人们仍然会得出这个结论,将安全视为安全的代名词。
记忆与安全性之间的联系不只是术语的混用。安全最终是要防止系统达到危险状态。在软件中,状态更改的主要交换所是内存。因此,防止程序进入危险状态的第一道防线是控制可以访问其内存的内容以及如何访问该内存。
管理进程可以访问内存的哪些部分的需要可以将其根源追溯到大型机分时。资源管理和内存安全起初是直接的客户服务问题(如果您花时间花钱,而其他人正在运行的东西耗尽了所有内存,那将是一个问题)。计算机科学家认为,这些烦恼可以被武器化,它们几乎是从1988年的莫里斯蠕虫开始的,一直持续到今天。
但是随着软件的复杂性和复杂性的提高,状态不再那么依赖内存。程序可以通过传递状态而无需在事务中将其从一个系统存储到另一个系统中,从而实现“无状态”。这些设计越常见,并发性错误就越多,纯功能成为与软件工程师对话的一部分。不良状态可能是由错误顺序的交易(竞赛条件)触发的,也可能取决于其他状态的变化。
在此软件级别上,安全性与可预测性(或确定性)有关。围绕它发展的生态系统包括类型系统和形式验证。这些不是发明解决安全问题的技术,而是学术界的重新关注以及这种方法在开发人员工具中的渗透,直接导致人们越来越意识到危险的不可预测系统的直接结果。
我发现最有趣的软件安全领域也是其最新领域。当计算机成为其他更大的基于人的系统的参与者时,可能会出现不安全状态。像第2级中的问题一样,第3级中的问题和技术也不是新发现。现代技术(尤其是AI)使它们以前所未有的方式变得有意义。
软件一直存在于人类系统中,但是存在于系统中和成为系统参与者之间存在差异。当您使用数据库跟踪库存时,系统中存在软件。当您构建基于该数据库自动重新排序商品的软件时,该软件现在已成为参与者。
关键区别在于软件是在记录状态还是在更改状态,因为安全性最终与我们达到不良状态的可能性有关。随着软件自动化变得越来越普遍,软件启动的状态更改如何影响流程中其他人员的问题正逐渐转移到围绕技术的对话中。
许多人将此问题描述为软件伦理,但对我而言,这是一个安全问题。道德假设不安全状态是可以预见的。当设计决策导致飞机坠毁时,除非有人能够证明做出该决策的人掌握的信息表明可能发生结局,否则我们不会质疑道德。否则,这只是一个意外。
到目前为止,我们必须处理第3级的工具是以用户为中心的设计和问题设置流程。以用户为中心的设计有助于拓宽视野,因此我们可以在不同的潜在交互中看到更多潜在结果。问题解决迫使我们为技术设定界限。内存安全性限制程序可以访问的状态的方式相同,问题设置要求软件工程师将这些强大的技术视为手术刀,并限制其可以参与过程的哪些部分。
安全与风险一样,最终都将涉及规模。在每个级别上,始终存在的问题都具有新的意义,而总是可能出现的不良状态变得更加普遍。我们将注意力转移到新的安全工具和技术上,以适应这些不同的优先事项。
当程序在具有单个用户的单台计算机上运行时,最相关的安全问题是该程序如何影响计算机本身的状态。并发问题仍然存在。人体工程学问题仍然存在,但是这些问题中的任何一个都不那么重要。如果一台隔离的计算机具有并发性问题,则需要对其进行整理的所有数据并确定该单台计算机上的正确状态。如果单个用户使用该程序带来负面结果,除非共享该程序,否则不太可能传播给其他用户。
当一台计算机成长为网络时,第一安全级别仍然很重要,但是第二安全级别变得更加危险。状态从计算机移到计算机,不良状态变化的冲击波半径增加。
当数字系统仅停止支持流程而成为该流程的负载参与者时,第三级安全性将转移到生产线的前端。不良状态变化的爆炸半径再次增加,不仅损坏机器,还导致人们采取错误的行为并可能造成伤害。
制定安全规范的第一步是确定在不久的将来您要构建的规模将达到什么规模,并着重于围绕该安全级别制定最佳实践。然后,在扩展技术时,继续发展您的方法以反映更高层次的关注。