我有一个C \ C ++代码,通过网络接收结构:
struct DataStruct
{
int DataLen;
BYTE* Data;
}
我在Data
次循环中运行DataLen
代码并处理数据。
......问题:
在代码来到安全专家进行渗透测试后,他们准备了一个假应用程序,该应用程序发送的结构DataLen
大于Data
的实际长度。当然,这会导致访问冲突异常。
所以,问题是 - 如何验证收到的Data
的实际长度?是否有可能不改变结构?
提前致谢。
答案 0 :(得分:4)
尼斯安全专家!我希望我的公司有这样的部门。
无论何时从网络接收数据,网络IO都会报告实际写入缓冲区的字节数,无论您使用read(2)
,recv(2)
还是boost::asio::async_read
还是其他任何我'见过。当数据结构的标题中存在“要遵循的字节数”字段时的典型用例是重复调用read / recv / etc,直到收到许多字节(或直到发生错误),然后才应构造它并返回您的DataStruct(或报告错误)。
答案 1 :(得分:2)
您知道收到了多少字节,因此只需将其与DataLen
进行比较。
答案 2 :(得分:1)
不改变结构是不可能的。从TCP / IP套接字接收的数据是普通流。从逻辑上讲,它不分为数据包。物理分组可以包含一个或多个DataStruct实例,一个DataStruct实例可以分成两个或更多个物理分组。仅当没有通信错误或无效数据包时,才能使用当前信息结构。
答案 3 :(得分:0)
如果您没有任何内在限制,腐败很容易。
一些保护机制将是:
realloc()
缓冲区,在可接受的大小范围内(如果Data
是动态的)SIGSEGV
,signal(2)
和signal(7)
中使用setjmp(2)
做一些有用的 try / catch 代码结构。有关此主题的快速介绍,请参阅Combining setjmp()/longjmp() and Signal Handling。使用sigaction(2)
更深入(通过获取错误的地址;)。