如何分析、查找和修复C++功能中的安全漏洞?



作为一个工作示例,我们可以处理以下代码:

#include <sys/socket.h>
#define size_t   SOCKET
int receive_socket_data(SOCKET sock,//socket representing remote connection
unsigned long& version_number,//validPtr->version #
unsigned long& message_size,//validPtr->sizeof packet
char*& buf // where to copy data from packet
)
{
int nlen = 0;
buf = NULL;
// Receive version_number from the packet
nlen = recv(sock, (char*) &version_number, sizeof(version_number), 0);
if (nlen == 0 || nlen == -1) return ERROR_RECEIVING;
version_number = ntohl(version_number);
// Receive message_size from the entire packet 
// (ulong + ulong + sizeof data)
nlen = recv(sock, (char*) &message_size, sizeof(message_size), 0);
if (nlen == 0 || nlen == -1) return ERROR_RECEIVING;
message_size = ntohl(message_size);
// Allocate a buffer to copy the data part of the packet
buf = new char[message_size + 1 - 2 * sizeof(unsigned long)];
buf[message_size - 2 * sizeof(unsigned long)] = '';
// Copy the data part from the packet to the buffer
if (recv(sock, (char*) buf, message_size-2*sizeof(unsigned long), 0) == -1)
return ERROR_RECEIVING;
return SUCCESS_RECEIVING;
}

例如,我想到的是运算符new可能抛出错误
我不确定数组的索引计算是否也会导致问题。

一种可以帮助确定函数是否安全的方法是通过验证、测试、防御编码、审查和经验。

防御性编码,因为任意代码不值得分析。使代码更易于分析和更安全,然后分析问题。您不能分析任意程序。即使是那些理论上可以分析的,难度也会有很大的变化。

证明,如在形式上证明你的函数是正确的。这需要充分理解并形式化代码与之交互的所有内容。请注意,防御性编码和简化代码使这在一定程度上成为可能。

测试,因为只有当你知道代码在做什么时,证明才会起作用。您的代码模型可能不完整——见鬼,我甚至会说它肯定是不完整的。你没有一个目前未知的物理如何导致代码运行的每个硬件中的比特翻转的模型,例如你的模型是不完整的。几乎可以肯定的是,你的代码模型是不完整的,会有一些不那么荒谬的方式。

回顾一下,因为会有一些事情是你没有想到的,通过让更有能力的人说服自己你的代码是正确的,可以增加你没有集体错过的机会。

经验,因为知道把注意力集中在哪里很重要。经验是记住你过去是怎么搞砸的,或者亲眼目睹别人这么做的

安全必须有多安全?一般来说,编写安全代码并不容易。这就是为什么编写密码系统的第一条规则是"不要"。

  1. 取消所有手动缓冲区管理
  2. 在静态断言、动态断言和注释中包括形式证明缓冲区大小算法没有缺陷
  3. 包括正式描述每个所谓的函数的作用,并包括证据为什么你的正式描述是准确的。包括的单元测试每个被调用的函数都在验证它们做了你声称的事情,并以预期的方式失败
  4. 从不取消引用指针或在没有检查和形式证明的情况下对缓冲区进行索引成型良好
  5. 不要做任何像预处理器或宏这样愚蠢的事情。找到一种方法来确保您正在编写的代码就是代码编译:必须在你正在写的令牌不是读到的,这是毫无意义的困难
  6. 验证函数可能返回的每一个值。Ie,recv--您检查了0或-1。如果它返回-2或-(2^31),会发生什么?保证不发生了什么?然后证明它
  7. 找一位真正的专家,让他们告诉你想做什么,或者付钱(我不是这方面的专家)

完成所有这些之后,你会想攻击你的代码并试图破坏它。

你会希望其他人也做同样的事情。

最新更新