软件安全VS硬件安全

信息安全 已知漏洞 硬件 软件
2021-08-18 19:31:15

理论上,完美的软件应用程序是可能的,但在现实生活中,它们并不存在。当攻击者知道该软件时,他们可以发送有效载荷以利用漏洞并远程运行他们想要的任何任意代码。另一方面,我们有 HSM(硬件安全模块),例如我们对智能卡进行编程以执行基本代码(例如加密算法),这些代码无需物理访问芯片即可免于攻击。问题:

  • 是否可以使用基于芯片的系统(与 raspberrypi 一样便宜并使其运行复杂的代码(可能是基本的浏览器)来检查电子邮件而不用担心恶意代码?
  • 是否有可能创建一个编译器来随机化代码 - 可能是 netbsd 上的浏览​​器 - 为每个用户以多种不同的方式执行功能,因此当攻击者发现公共代码的漏洞时,他们无法利用具有随机编译版本的用户?
2个回答

硬件安全模块

在受物理保护的芯片(如 HSM 或智能卡)中运行代码并不是为了防止软件错误。如果 HSM 中存在软件错误,它可以像任何网络服务器、笔记本电脑、智能手机等一样被利用。HSM 和 PC 之间的区别在于,通过物理访问 PC,您可以从 USB 记忆棒启动或更换磁盘。通过物理访问 HSM 的外部,您仍然必须闯入,并且 HSM 被设计为在您认真尝试打开它们时自毁。

在 Raspberry Pi 上运行浏览器

PC 与 Raspberry Pi 一样是“基于芯片的系统”。它们之间没有根本区别:Raspberry Pi 并不比 PC“更安全”。

越来越多的人使用 PC,因此 PC 是更有价值的攻击目标,因此越来越多的人尝试利用 PC。PC 还具有沉重的历史兼容性负担和种类繁多的软件,这使它们面临更大的风险。但是如果人们经常在 Pis 而不是 Pentiums 上运行浏览器,那么 Pis 就会有更多的漏洞利用。

将浏览器移动到另一台机器上会隔离它。但是你有什么收获?许多漏洞利用是通过浏览器传递的。通常浏览器本身就是目标。它可以访问网络,因此将感染传播到其他机器是一个有价值的目标。这是用户与很多事物交互的方式,因此它是小偷和诈骗者的主要目标。不管你把浏览器放在哪里,如果它被感染了,你就输了。

随机化代码

以某种方式随机化代码是一种防御技术,但它只会使漏洞利用变得更加困难,并不会使它们变得不可能。

例如,一些现代操作系统实践地址空间布局随机化:每次程序启动时,它都会加载到不同的随机地址。这意味着有些事情你不能在利用中做,例如直接引用原始程序中一段代码的地址。它不会使漏洞利用成为不可能:程序必须有一种方法可以找到它自己的片段(例如,一个短的相对跳转将继续正常工作),如果某个片段很难找到,漏洞利用可以搜索它(即使没有 ASLR,这也是一个常见问题,因为漏洞利用代码本身通常会加载到不可预测的地址)。

在编译器中随机化代码不会给你带来太多好处,而且很昂贵。所有这些形式的随机化使调试变得更加困难。如果在分发程序之前进行随机化,则必须管理所有这些不同版本的分发和维护(更新)。并且在安全方面它的好处是最小的,因为最终程序仍然必须做同样的事情。

硬件如何帮助提高安全性

对于普通系统(不是 HSM 等),硬件的作用是强制组件之间的隔离。它是一个硬件组件MMU,它使程序无法直接访问另一个程序的内存。CPU的设计也使得普通程序无法直接访问硬件外设,必须通过操作系统接口。必须正确使用硬件:由操作系统正确设置 MMU 表等等。

你不能在硬件中投入太多的智能。你做的越多,设计中出现错误的风险就越大。硬件错误很难修复。所以硬件提供了一些基本的能力,复杂性尽量用软件来处理。

@vulner,我认为您是在间接地试图询问哈佛架构是否在本质上比冯诺依曼架构更安全。(哈佛架构为指令和数据提供单独的内存,而冯诺依曼机器为这两个目的使用共享内存。)

哈佛机器可能更安全的一种攻击是缓冲区溢出。即使应用程序出错并由于缓冲区溢出而覆盖应用程序内存,应用程序指针也可能无法物理访问堆栈内存,因此无法执行经典的堆栈粉碎攻击。

但这并不是您在网络上发现的唯一安全问题。浏览器的安全问题不仅仅在于机器架构。问题在于浏览应用程序处理的不可信信息既被解释为数据又被解释为指令,并且浏览器能够保持状态

考虑一个我可能会在stackexchange中发布的脚本(不可靠的来源),它将看起来像是您银行的虚假广告放在右侧栏中。您的浏览器不知道这是否是合法数据,但如果您在其中输入您的银行用户名和密码,您很快就会发现。

或者考虑一个窃取 cookie 信息的 javascript(解释指令)。如果我正在运行一个恶意 WiFi 接入点,我可以在 www.google.com 主页的底部注入一个 javascript,它将你发布的每一个数据和你收到的每一个 cookie 都发送给我。我可以将缓存时间修改为“将此页面和脚本在缓存中保留一年”。(存储状态)并且脚本可以将自己添加到您通过该缓存的谷歌页面访问的每个新页面的底部。只有清除浏览器的缓存才能摆脱它。

您的基于芯片的浏览器可以阻止一种特定类型的攻击,但由于存在所有其他攻击,您会提供一种错误的安全感。