可以传递非字符串文字的c函数strftime创建一个不受控制的格式字符串漏洞

Can passing a non string literal the c function strftime create a uncontrolled format string vulnerability

我正在为一个项目使用 strftime 函数,我将用户提供的字符串而不是字符串文字传递给它。由于过于谨慎,我通过将每个警告标志传递给 gcc 进行编译,并且因为我没有将字符串文字传递给 strftime,所以我收到一条警告,告诉我我正在使用非字符串文字。

我假设这是为了防止 printf() 函数易受攻击的不受控制的格式字符串漏洞。然而,经过一番调查,我了解到该漏洞源于 printf() 是一个可变参数函数。但是 strftime() 不是可变参数函数。

传递用户提供的字符串是否会使我的程序面临漏洞,或者 gcc 警告过于谨慎?

正确答案是限制用户输入。也就是说,不要让他们指定格式字符串。相反,给他们一组选择,他们可能 select 作为他们用户偏好的一部分。

如果您愿意,可以将选项硬编码到常量数组中。这将阻止编译器抱怨。 (它还会防止精明的用户通过手动向配置文件中的可能选项添加错误值来绕过您的保护。)