Mik*_*ike 3 c security printf format-string
我的问题是从安全角度来看.我正在清理一些代码,我发现当前的代码有一个不受控制的格式字符串漏洞; 它传递一个字符串,printf()如:
void print_it(char * str)
{
printf(str);
Run Code Online (Sandbox Code Playgroud)
这显然被认为是不安全的编程,即使gcc通常会至少给你一些警告:
警告:格式不是字符串文字,也不是格式参数
现在要"修复"这个问题,我们可以确保你得到的东西被视为一个字符串
printf("%s", str);
Run Code Online (Sandbox Code Playgroud)
但是我想知道在使用长度特定器时是否有任何额外的安全性.就像是:
printf("%.*s", (int)sizeof(str), str);
Run Code Online (Sandbox Code Playgroud)
我想不出有什么理由会更加安全,但如果我遗漏了一些明显的东西,我也不会感到惊讶.
但是现代C商店安全地保护他们的印刷品声明的程度,但不是这样.当您处理非空终止字符串时使用它,这在与Fortran代码交互时非常常见.
严格来说,为了防止失控读取,这将是一种安全性收益,也许你是在违反空字符后打印敏感数据.
但
printf("%.*s", (int)sizeof(str), str);
Run Code Online (Sandbox Code Playgroud)
更糟糕的是; 你只是说"忽略空字符并打印完整内容." 或者更确切地说,除非你将空格填充的字符串一直处理到它们的内存末端,否则情况会更糟,如果字符串来自Fortran,情况可能就是这样.
然而,这非常重要:
printf("%s", str);
Run Code Online (Sandbox Code Playgroud)
这printf(str)是一个重大的安全漏洞.使用写入的说明符阅读有关printf攻击的%n内容.