現存的網站中的兩階段驗證(2FA)驗證碼產生器建議
From Joomla! Documentation
這個頁面包含了伴隨 Joomla! 3.9.25 發佈的安全修補,關於 2FA 設定。以下有影響分析以及在現存網站上建議的作法。
回報的錯誤
The JSST has been contacted by the security researcher Hanno Böck and has been made aware of two issues within the code that have been fixed by this update.
受影響的版本
這會影響 Joomla! 版本:: 3.2.0 - 3.9.24
什麼造成的
從 Joomla 3.2.0 開始,Joomla 核心加入了 2FA / TOTP 支援。 而到 3.9.25 之前這這個機制有兩項輕度安全風險:
- 在產生 2FA secret 過程中,使用了不安全的 rand() function
- 使用了長度不足的 2FA secret,根據 RFC 4226 應該要有20 byte,而不僅是 10 byte
問題如何修改
從 Joomla 3.9.25 起, Joomla 核心被更新為:
- 使用安全的 random function (random_int; backported to older PHP version by the library paragonie/random_compat)
- 相較於之前的 10 byte 舊版,使用 20 bytes 來產生 2FA secret
這個議題也協同 Akeeba Ltd ,因為他們是原始 FOF codebase to the core貢獻者。
這會影響我的網站嗎
猶如開頭所提及的 Hanno Böck 表示這和使用不安全的 rand function 有關:
[...] 我認為這在實務上的風險是低的,為了要實現這個攻擊,攻擊者必須要知道某人建立它TOTP secret 大約的時間。PHP internally mixes in microseconds twice, so one could maybe reduce the possible options for the key to a few million,,這在攻擊實務上的可能性非常低。 [...]
並且關於10 byte 或是 20 byte的使用,他表示:
[...] 程式碼預設使用了10 bytes 來產生 secret。也就是 80 bits。這樣的風險是低的。80 bits 已經超出實務攻擊能實施的範圍了。儘管如此,我認為RFC 提出的安全需求(或者說建議)必須要遵守,所以我建議修改為 20 bytes (亦即 160 bits) [...]
基於這些資訊,JSST 決議實現上述的更改,但這絕對不代表說,在以前產生的2FA驗證是有問題的,它門仍然會如期待運作,並且從實務觀點來說,它們也是安全的。
另外顯然的是,這次版本做出的更動,只會影響之後產生的secret。