Python 處理 ctypes 中未經驗證的小數時的漏洞

Python 程式語言3.7.10 和3.6.13 的修正版本現已推出,修復了一個漏洞(CVE-2021-3177),該漏洞可能導致在使用ctypes 機制呼叫C 函數的處理程序中處理未經驗證的浮點數時執行程式碼。 該問題也影響了 Python 3.8 和 3.9 分支,但它們的更新仍處於候選版本狀態(計劃於 1 月 XNUMX 日發布)。

這個問題是由 ctypes 函數 PyCArg_repr() 中的緩衝區溢位引起的,該溢位是由於 sprintf 的不安全使用而發生的。 特別是,處理轉換的結果 'sprintf(buffer, " ", self->tag, self->value.b)' 分配了 256 位元組的靜態緩衝區(“char buffer[256]”),而結果可能會超過該值。 要檢查應用程式是否存在該漏洞,可以嘗試傳遞值“1e300”,該值在由 c_double.from_param 方法處理時會導致崩潰,因為結果數字包含 308 個字符,無法容納在一個字串中。256 字節緩衝區。 有問題的程式碼範例: import ctypes; x = ctypes.c_double.from_param(1e300); 代表(x)

該問題在 Debian、Ubuntu 和 FreeBSD 中仍未解決,但在 Arch Linux、Fedora、SUSE 中已修復。 在 RHEL 中,由於 FORTIFY_SOURCE 模式下的程式包組裝不會出現該漏洞,該模式會阻止字串函數中的此類緩衝區溢位。

來源: opennet.ru

添加評論