请注意,其中涉及一定数量的循环推理:安全问题经常与 C 和 C++ 相关联。但其中有多少是由于这些语言的固有弱点,又有多少是因为这些只是大多数计算机基础设施所用的语言?
C 旨在“比汇编程序更上一层楼”。除了您自己实现的之外,没有任何边界检查可以将最后一个时钟周期挤出您的系统。
C++ 确实提供了对 C 的各种改进,与安全性最相关的是它的容器类(例如<vector>
和<string>
),并且从 C++11 开始,智能指针允许您处理数据而无需手动处理内存。但是,由于它是 C 的演变,而不是一门全新的语言,它仍然提供了 C 的手动内存管理机制,所以如果你坚持自取其辱,C++ 不会阻止你。
那么为什么 SSL、bind 或 OS 内核之类的东西仍然用这些语言编写呢?
因为这些语言可以直接修改内存,这使得它们特别适合某种类型的高性能、低级应用程序(例如加密、DNS 表查找、硬件驱动程序......或 Java VMs ;-)) .
因此,如果与安全相关的软件遭到破坏,它以 C 或 C++ 编写的可能性很高,这仅仅是因为大多数与安全相关的软件都是用 C 或 C++ 编写的,通常是出于历史和/或性能原因。如果它是用 C/C++ 编写的,主要的攻击向量是缓冲区溢出。
如果它是一种不同的语言,那将是一个不同的攻击媒介,但我相信也会有安全漏洞。
利用 C/C++ 软件比利用 Java 软件更容易。与利用 Windows 系统比利用 Linux 系统更容易的方式相同:前者无处不在,很好理解(即众所周知的攻击向量,如何找到以及如何利用它们),并且很多人都在寻找漏洞利用奖励/努力比率高的地方。
这并不意味着后者本质上是安全的(也许更安全,但不安全)。这意味着——作为更难的目标和更低的收益——坏小子们并没有在这上面浪费太多时间。