前一陣子與人討論關於是否需要經常更新 library 或程式語言版本. 對於程式語言版本更新, 個人是認為有必要積極的更新版本. 但是, 對方的看法則是沒有必要, 因為如果程式語言有漏洞需要更新並修改程式源碼是無法想像的事情, 就像是 OS 漏洞只需要更新 OS 底層, 並不會導致任何執行在 OS 的程式需要做出任何修改, 並詢問是否任何例子.
最近剛好更新 Gitea 版本至最新版, 同時發現舊版本有個漏洞是基於 Go 的安全漏洞 CVE-2019-6486 Detail.
…term to prevent long busy loop
If beta8 is unusually large, the addition loop might take a very long time to bring x3-beta8 back positive.
This would lead to a DoS vulnerability in the implementation of the P-521 and P-384 elliptic curves that may let an attacker craft inputs to ScalarMult that consume excessive amounts of CPU.
This fixes CVE-2019-6486.
go
x3 := new(big.Int).Mul(alpha, alpha)
beta8 := new(big.Int).Lsh(beta, 3)
beta8.Mod(beta8, curve.P) // 新增加
x3.Sub(x3, beta8)
for x3.Sign() == -1 { // 移除
if x3.Sign() == -1 { // 增加
x3.Add(x3, curve.P)
}
x3.Mod(x3, curve.P)雖然沒有因為這個漏洞導致應用程式需要修改內部的源碼, 但是需要重新建構程式才能夠修正因為程式語言漏洞導致的問題.
這裡紀錄這個例子, 同時提醒自己不要迷失在錯誤的觀念, 要經常更新資訊提昇個人的經驗.