我在评论中看到使用__func__
是一种安全风险。我需要了解这是怎么回事?
4 回答
Using__func__
揭示了二进制文件中的函数名称,这简化了可以访问二进制文件的攻击者的工作。
如果您的应用程序的安全性依赖于它的函数名称保持机密,那么使用 . 存在安全风险__func__
,因为编译器需要将函数名称存储在编译后的二进制文件中的某个位置。
__func__
是 C99 标准的预定义标识符,在函数内部使用时扩展为包含函数名称的字符数组变量。从 C99 6.4.2.2/1 开始描述:
标识符
__func__
由翻译器隐式声明,就好像紧跟在每个函数定义的左大括号之后,声明static const char
__func__
[] = "函数名"; 出现,其中 function-name 是词法封闭函数的名称。该名称是函数的朴素名称。
请注意,它不是宏,在预处理过程中没有特殊含义。
查看此链接以获取有关以下位置的更多信息__func__
:
http ://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1642.html
如果解决方案依赖于预定义的上下文相关常量所涉及的扩展 __func__
,则无法安全地在函数中实现并提供同样的便利。
__func__
在其调用点进行文本扩展,因此,它很容易通过评估 break、continue 或 return 语句或未能正确终止 if 语句来影响调用代码的控制流。调用它的效果可能令人惊讶并导致细微的缺陷。
更喜欢内联或静态函数,而不是类似函数的宏或__func__
.
但是,在无法避免定义 a 的情况下__func__
,定义应避免更改调用代码控制流的语句。理想情况下,它应该是单个表达式。
它使逆向工程更容易。因此,如果您想对应用程序的工作方式保密,那么它会使攻击者的生活更轻松。
这与 DRM 功能相关,或者如果您想让在竞争应用程序中模仿您的算法变得更加困难。
但这不会影响安全性,因为逆向显示漏洞的应用程序首先是不安全的。