格式化函数参数不足¶
ID: cpp/wrong-number-format-arguments
Kind: problem
Security severity: 5.0
Severity: error
Precision: high
Tags:
- reliability
- correctness
- security
- external/cwe/cwe-234
- external/cwe/cwe-685
Query suites:
- cpp-code-scanning.qls
- cpp-security-extended.qls
- cpp-security-and-quality.qls
对 printf
函数或相关函数的每次调用都应包含格式定义的参数数量。向函数传递比所需参数更多的参数是无害的(虽然这可能表明存在其他缺陷)。但是,向函数传递少于格式定义的参数数量可能会成为安全漏洞,因为函数将处理栈上的下一个项目作为缺少的参数。
这可能导致信息泄露,如果栈上的敏感值被打印出来。如果栈上的值被解释为指针并导致访问未映射的内存,则可能导致崩溃。最后,如果攻击者可以利用此问题导致输出字符串过长或内容意外,则可能导致后续漏洞。
建议¶
查看突出显示的函数调用所需的格式和参数。更新格式或参数,以便向函数传递预期数量的参数。
示例¶
int main() {
printf("%d, %s\n", 42); // Will crash or print garbage
return 0;
}
参考文献¶
CERT C 编码标准:FIO47-C. 使用有效的格式字符串。
Microsoft C 运行时库参考:printf, wprintf。
常见漏洞枚举:CWE-234。
常见漏洞枚举:CWE-685。