如何改进漏洞发现者 memset 警告的代码?

Posted

技术标签:

【中文标题】如何改进漏洞发现者 memset 警告的代码?【英文标题】:How to improve code around flawfinder memset warning? 【发布时间】:2021-12-03 12:15:21 【问题描述】:

在我的代码中,对memset 的所有调用都显示为带有flawfinder tool 的警告。

在最简单的情况下,它可以归结为等价于

    float f1;
    float f2;
    void* p1 = &f1;
    void* p2 = &f2;
    memcpy(p1, p2, sizeof(float));

消息是

./file.cpp:10:  [2] (buffer) memcpy:
  Does not check for buffer overflows when copying to destination (CWE-120).
  Make sure destination can always hold the source data.

我完全理解这可以用一个简单的副本来代替,这只是一个简化的例子。 我也了解使用 memcpy 和缓冲区溢出的潜在问题。

问题是faultfinder 到底要求我做什么?

也许像添加assert 之类的? (这并没有抑制警告)

    assert( sizeof(*p1) == sizeof(*p2) );
    memcpy(p1, p2, sizeof(float));

还是只是告诉我不要使用memset

我正在使用 C++ 编程,但我很确定问题和解决方案对于 C 和 C++ 语言都是通用的。

【问题讨论】:

如果您使用 C++ 编程,请不要添加无关的 C 语言标签。 C 和 C++ 是两种非常不同的语言。 这个 CWE 东西听起来不像是一个值得信赖的编码标准。你能告诉工具检查 CERT-C 或 MISRA-C 吗? 好像someone had a similar problem, but the community didn't find a solution。不过,那里有一些有用的 cmets。 @Someprogrammerdude,这个问题适用于两种语言,该工具也适用于两种语言。 memset 可以从两种语言中调用。我可以用memset 替换std::memset。标签的想法是人们可以找到问题的答案,无论他们是用 C 还是 C++ 编程。如果有答案,他们可能会有相同的答案。 @alfC:该工具可以用于两种语言,memset 可以从两种语言中调用,但这并不意味着两种语言的问题相同。由于有关转换的规则和其他问题,不同语言的解决方案(或缺乏解决方案)可能会有所不同。混合这两个标签会使寻求 C 解决方案的人更难在 C++ 讨论中找到它们,反之亦然。除非询问两种语言之间的差异或交互,否则不要同时标记 C 和 C++。 【参考方案1】:
errno_t  err = memcpy_s(dest, dsize, src, cnt);

这应该是“安全”版本,希望能满足漏洞发现者的需求

【讨论】:

我不知道memcpy_s,我正试图找出确切的区别。我猜memcpy(p1, p2, sizeof(float)); 的等价物将是memcpy_s(p1, sizeof(float), p2, sizeof(float)),或更对称的memcpy_s(f1, sizeof(*f1), f2, sizeof(*f2))。这是迄今为止我找到的最好的描述“这些函数 [ (w)memcpy_s] ] 验证它们的参数。如果 count 不为零并且 dest 或 src 是空指针,或者 destSize 小于 count,则这些函数调用无效参数处理程序,如参数验证中所述。”它们也会返回状态。 看来需要一些杂技才能使用memcpy_s***.com/questions/31278172/…。从 C++ 看来,这并不容易(正如@EricPostpischil 预测的那样)。在任何情况下,查看我的代码,memcpy_s 可能对我的情况没有用处,因为我正在处理堆栈变量(从不为空)并且具有编译时大小(我与 static_assert( sizeof(t1) == sizeof(t2) ); 单独检查. 总之,我认为这可以安抚漏洞发现者,但我还无法验证。 您是否有理由不能使用赋值运算符或其他“现代”概念? 好问题,我必须重新审视逻辑,但我认为我使用std::memcpy 而不是通过reinterpret_cast 分配以避免违反别名规则。 (在这里寻找“memset”en.cppreference.com/w/cpp/language/reinterpret_cast)

以上是关于如何改进漏洞发现者 memset 警告的代码?的主要内容,如果未能解决你的问题,请参考以下文章

DHS警告:Microsoft Exchange服务器漏洞正被APT黑客利用

使用 memset 时出现“类型参数”警告

memset()漏洞[关闭]

Firefox 开源 为啥安全

bash代码注入的安全漏洞

RPC漏洞挖掘案例研究(下)