据我所知,此代码段应该存在缓冲区溢出漏洞问题:
dd
但是,我并不完全明白为什么它被认为是有风险的。有人能够对此有所了解吗?
答案 0 :(得分:3)
以下代码将my_file_name
的内容输出到标准输出:
printf("File %s", my_file_name);
如果从恶意来源收到my_file_name
并且程序输出到终端,恶意来源可能会在my_file_name
中放置转义序列,告诉终端执行非常重要的任务例如通过标准输入发回终端内容。很难但可以想象,攻击者可以从这种攻击中获取有用的信息,甚至可以通过执行命令来破坏数据,就像用户输入的那样。
当然,第二个调用会调用未定义的行为,因为您没有将有效的字符串指针作为第二个参数传递给printf
。
上述情况可能不是您所指的缓冲区溢出漏洞。它本身的printf
代码中没有这样的漏洞,但是代码中的其他地方存在缓冲区溢出漏洞,实际的格式字符串可以通过此溢出修补,攻击者可以利用{{1 }}的功能,特别是printf
格式,可以将任何值戳到程序存储器中的几乎任何位置。这是删除Microsoft安全文件中公开的%n
中%n
的基本原理。
答案 1 :(得分:2)
第一个电话很好。 (当您使用用户提供的格式字符串时存在问题,如printf(s)
中,其中s受用户的影响。这里使用硬编码格式字符串"File %s"
,它不容易受到攻击。字符串my_file_name
的内容将被视为常规C字符串,只是被复制到标准输出。当然它必须为空终止,如果输出被重定向到其他东西,那么可能会有副作用,但这不是printf问题。)
第二个调用只是未定义的行为,因为格式字符串(0)之后的参数数量与格式字符串要求的数量(1)不匹配。