【发布时间】:2018-02-03 12:20:02
【问题描述】:
我已经阅读了一些关于 C++ 中 printf() 安全性的内容。
可以找到示例,例如here。
这让我想知道来自 golang 的 fmt.Printf() 是否安全。
更具体地说,格式化字符串本身是否可以伪造是否安全。
inputString := "String from user"
x := "test"
fmt.Printf(inputString, x, 15)
当尝试从 C++ 复制漏洞利用时,golang 似乎并不容易受到攻击。
例如fmt.Printf("%s%s%s%s%s%s%s%s%s%s%s%s\n") 不会使 golang 中的程序崩溃。
这样的分析当然不能证明这在 golang 中是安全的。所以我想在这里问一下:go的开发者有没有把它的printf函数做到万无一失?
编辑:我所说的万无一失是指它没有任何意想不到的副作用。 当然,我希望生成的字符串会完全受到影响。 我不希望用户能够获得特权信息(例如未传递给 printf 的变量的内容),或者用户能够写入任何内存(例如,为 x 分配一个新值)。
【问题讨论】:
-
它和 Go 的其他部分一样是内存安全的。仍然可能是错误的来源,任何错误都可能在适当的情况下成为漏洞。
-
什么样的bug很难?排除结果字符串完全控制给出 inputString 和结果问题的字符串?
-
万无一失是什么意思?
-
Go 中的字符串并不是像 C 那样等待发生字符串的危险缓冲区溢出。与数组/切片相同。一切都经过检查且安全。
-
@user2089648:
Printf满足您在编辑中添加的期望,是的。