如何分析、查找和修复C++功能中的安全漏洞?
How to analyze, find & fix security flaws in a C++ function?
作为一个工作示例,我们可以处理以下代码:
#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可能抛出错误
我不确定数组的索引计算是否也会导致问题。
一种可以帮助确定函数是否安全的方法是通过验证、测试、防御编码、审查和经验。
防御性编码,因为任意代码不值得分析。使代码更易于分析和更安全,然后分析问题。您不能分析任意程序。即使是那些理论上可以分析的,难度也会有很大的变化。
证明,如在形式上证明你的函数是正确的。这需要充分理解并形式化代码与之交互的所有内容。请注意,防御性编码和简化代码使这在一定程度上成为可能。
测试,因为只有当你知道代码在做什么时,证明才会起作用。您的代码模型可能不完整——见鬼,我甚至会说它肯定是不完整的。你没有一个目前未知的物理如何导致代码运行的每个硬件中的比特翻转的模型,例如你的模型是不完整的。几乎可以肯定的是,你的代码模型是不完整的,会有一些不那么荒谬的方式。
回顾一下,因为会有一些事情是你没有想到的,通过让更有能力的人说服自己你的代码是正确的,可以增加你没有集体错过的机会。
经验,因为知道把注意力集中在哪里很重要。经验是记住你过去是怎么搞砸的,或者亲眼目睹别人这么做的
安全必须有多安全?一般来说,编写安全代码并不容易。这就是为什么编写密码系统的第一条规则是"不要"。
- 取消所有手动缓冲区管理
- 在静态断言、动态断言和注释中包括形式证明缓冲区大小算法没有缺陷
- 包括正式描述每个所谓的函数的作用,并包括证据为什么你的正式描述是准确的。包括的单元测试每个被调用的函数都在验证它们做了你声称的事情,并以预期的方式失败
- 从不取消引用指针或在没有检查和形式证明的情况下对缓冲区进行索引成型良好
- 不要做任何像预处理器或宏这样愚蠢的事情。找到一种方法来确保您正在编写的代码就是代码编译:必须在你正在写的令牌不是读到的,这是毫无意义的困难
- 验证函数可能返回的每一个值。Ie,
recv
--您检查了0或-1。如果它返回-2或-(2^31),会发生什么?保证不发生了什么?然后证明它 - 找一位真正的专家,让他们告诉你想做什么,或者付钱(我不是这方面的专家)
完成所有这些之后,你会想攻击你的代码并试图破坏它。
你会希望其他人也做同样的事情。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 带内存和隔离功能的SQLite
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 类模板的成员功能的定义在单独的TU中完全专业化
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++中获得"静态纯虚拟"功能?
- 两个文件使用彼此的功能-如何解决
- 我应该实现右值推送功能吗?我应该使用std::move吗
- QML按钮点击功能执行顺序
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 有没有可能有一个只有ADL才能找到的非好友功能
- 功能样式转换从 'int' 到 'ItemType' 的匹配转换
- 文件系统:复制功能的速度秘诀是什么
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 如何在Directwrite中获得给定字体的可用OpenType功能
- 对可变参数使用声明.如何选择正确的功能
- 询问在设计我的手臂模拟器功能表示格式1
- 功能原型的目的
- 这里在 Linux 中具有"CreatePipe"和"CreateProcessW"功能吗?