我是安全領域的新手。我對以下場景思考了很多,但還是想不出好的解決方案。

- 假設我進入 Instagram 的「忘記密碼」頁面,輸入了我想要破解其帳號的人的手機號碼。
- 它會向該人發送 6 位數的代碼。
- 我想強行破解它——大約一百萬種組合。
- 我取得了 5000 個 IP,每個 IP 發送 200 個請求,然後進行暴力破解,也就是同時從所有 IP 發送請求。這裡面存在著競爭條件,對吧?這樣我是不是就無法攻破了?
- 這可能是因為操作/請求缺乏速率限制。正如你所說,因此可以透過暴力破解。
Instagram 現在已經修復了這個問題。我還沒有看到任何關於緩解措施的官方公告,但快速訪問
Instagram 的密碼重置頁面,就會發現目標用戶現在會收到一個連結。
以及如何緩解?
你可以對操作/請求進行速率限制——不僅透過 IP 位址,還可以透過操作本身。然而,這可能會構成潛在的 DOS(拒絕服務)攻擊——這就是為什麼 Instagram 一開始可能沒有這樣做的原因。首先,考慮到它是一個提供給使用者的 6 位數代碼,你可以大幅降低每個 IP 位址的速率限制閾值(即從 200 降至 20),從而顯著增加攻擊成本。
但簡而言之,這 6 位元程式碼本身有缺陷。雖然 DOS 攻擊的可能性可能“不大”,但考慮到攻擊者的潛在收益/動機,其成本相對較小,因此應該採取相應的措施。因此,正如 Instagram 所做的那樣,最簡單的解決方案是透過更安全的方式驗證用戶身份,例如:
向使用者發送一個連結(透過外部、先前建立的通訊管道),然後讓他們在這個唯一的連結上輸入代碼。
將代碼設為 10 位字母數字,並設定 30 分鐘的有效期,並限制可重複發出的代碼數量。