記憶體損毀漏洞仍然是系統軟體中最持久的漏洞類別之一,理解其背後的機制對於從事漏洞研究、安全編碼或利用漏洞防護的任何人都至關重要。「PUDA」是一個在某些安全社群中非正式使用的術語,用於描述懸宕存取的過早使用 — 一類漏洞,其中程式在記憶體(指標、控制代碼或物件參考)被釋放、重新配置或以其他方式無效化之後參考該記憶體。這與 use-after-free (UAF) 和懸宕指標問題密切相關,通常可互換使用。無論您在 CTF 寫作、研究論文或內部漏洞追蹤器中遇到 PUDA 術語,基礎概念都是相同的:過時的參考被當作仍然有效而使用。
什麼導致 PUDA 狀況
在核心,PUDA 漏洞源於物件實際生命週期與參考該物件的程式碼所假設的生命週期之間的不匹配。常見的根本原因包括:
- 釋放後缺少 null 設定:指標被釋放但未設定為
NULL,留下懸宕指標且容易被誤用。 - 競態條件:在多執行緒程式碼中,一個執行緒釋放物件,而另一個執行緒仍然持有並使用對該物件的參考(一個經典的 TOCTOU 相鄰情景)。
- 回呼與事件驅動邏輯:物件在回呼期間被銷毀,但呼叫程式碼在回呼返回後繼續對其進行操作。
- 參考計數錯誤:物件的參考計數被不正確地遞減,導致它在仍被使用時被釋放。