__func__标识符如何成为安全风险?

时间:2012-10-14 12:41:05

标签: c security macros

我在评论中看到使用__func__存在安全风险。我需要了解这是怎么回事?

4 个答案:

答案 0 :(得分:4)

使用__func__显示二进制文件中的函数名称,这样可以简化可以访问二进制文件的攻击者的工作。

答案 1 :(得分:0)

它使逆向工程更容易。因此,如果您希望保持应用程序保密的方式,那么攻击者的生活就会变得更容易。

这与DRM功能相关,或者如果您希望在竞争应用程序中模仿您的算法更加困难。

但它不会影响安全性,因为反向显示漏洞的应用程序首先是不安全的。

答案 2 :(得分:0)

如果您的应用程序的安全性依赖于其保留的秘密功能名称,则使用__func__会带来安全风险,因为编译器需要将函数名称存储在已编译的二进制文件中的某处。

答案 3 :(得分:0)

__func__是C99标准的预定义标识符,当在函数内部使用时,它扩展为包含函数名的字符数组变量。从C99 6.4.2.2/1描述:

  

标识符__func__由翻译者隐式声明为   如果,紧跟每个功能的开口支撑   定义,声明

     

static const char __func__ [] =“function-name”;出现了,在哪里   function-name是词法封闭函数的名称。这个   name是函数的简单名称。

请注意,它不是宏,在预处理过程中没有特殊含义。

请查看此链接,了解有关__func__的更多信息:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1642.html

如果解决方案依赖于预定义的上下文相关常量__func__中涉及的扩展,则无法在函数中安全地实现它并提供相同的便利性。

__func__在其调用时进行文本扩展,因此,它可以通过评估break,continue或return语句或无法正确终止if语句来轻松影响调用代码的控制流。调用它的效果可能会令人惊讶并导致细微的缺陷。

将内联或静态函数添加到类似函数的宏或__func__

但是,在定义__func__是不可避免的情况下,定义应避免使用更改调用代码控制流的语句。理想情况下,它应该是单个表达式。

更多想法和示例代码:
https://www.securecoding.cert.org/confluence/display/seccode/PRE13-C.+Avoid+changing+control+flow+in+macro+definitions