为printf调用添加长度说明符更安全吗?

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)

我想不出有什么理由会更加安全,但如果我遗漏了一些明显的东西,我也不会感到惊讶.

dje*_*lin 5

但是现代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内容.