造出异常条件使程序重复释放channel,则会触发运行时panic,从而造成DoS攻击。
小结:
1)
使用defer延迟关闭channel
secguide/Go安全指南.md at main · Tencent/secguide · GitHub https://github.com/Tencent/secguide/blob/main/Go%E5%AE%89%E5%85%A8%E6%8C%87%E5%8D%97.md#116%E5%BF%85%E9%A1%BB%E7%A6%81%E6%AD%A2%E9%87%8D%E5%A4%8D%E9%87%8A%E6%94%BEchannel
1.1.6【必须】禁止重复释放channel
- 重复释放一般存在于异常流程判断中,如果恶意攻击者构造出异常条件使程序重复释放channel,则会触发运行时panic,从而造成DoS攻击。
// bad
func foo(c chan int) {
defer close(c)
err := processBusiness()
if err != nil {
c <- 0
close(c) // 重复释放channel
return
}
c <- 1
}
// good
func foo(c chan int) {
defer close(c) // 使用defer延迟关闭channel
err := processBusiness()
if err != nil {
c <- 0
return
}
c <- 1
}