如何验证接收到的字节数组的长度,该数组不是以 null 结尾的?
-
25-09-2019 - |
题
我有一个 C\C++ 代码,它通过网络接收以下形式的结构:
struct DataStruct
{
int DataLen;
BYTE* Data;
}
我运行过的代码 Data
在一个循环中 DataLen
时间并处理数据。
...问题:
在代码交给安全专家进行渗透测试后,他们准备了一个伪造的应用程序,该应用程序发送此结构 DataLen
比实际长度大 Data
. 。当然,这会导致访问冲突异常。
所以,问题是 - 我如何验证收到的真实长度 Data
?不改变结构可以吗?
提前致谢。
解决方案
尼斯安全专家!我希望我的公司有这样一个部门。
当数据从网络接收,网络IO报告的字节数实际写入缓冲区,不管你使用read(2)
,recv(2)
,或boost::asio::async_read
或其他任何我见过。当有一个“字节数遵循”字段中的数据结构的首部典型的用例,是重复调用read / recv的/等,直到收到很多字节(或直到发生了错误),才把它应该构建并返回您DataStruct(或报告错误)。
其他提示
您知道你有多少字节接收,所以只用DataLen
进行比较。
有不改变结构是不可能的。从TCP / IP套接字接收到的数据是普通数据流。从逻辑上讲,它不分成包。物理包可包含一个或多个DataStruct情况下,一个实例DataStruct可以被划分到两个或多个物理分组。当前信息结构仅当没有通信错误或无效的数据包一起使用。
如果没有任何内在限制,腐败就很容易。
一些保护机制是:
- 尝试
realloc()
缓冲区,在一些可接受的大小内(如果Data
是动态的) - 例外情况 是 朋友们:使用
SIGSEGV
在signal(2)
,signal(7)
和setjmp(2)
做一些有用的事 试着抓 代码结构。看 组合 setjmp()/longjmp() 和信号处理 有关此主题的快速介绍。使用sigaction(2)
更深入(通过获取错误的地址;)。
不隶属于 StackOverflow