Python 中的 10 個常見安全漏洞,以及如何避免(下)

簡評:編寫安全代碼很困難,當你學習一個編程語言、模塊或框架時,你會學習其使用方法。 在考慮安全性時,你須要考慮如何避免被濫用,Python
也不例外,即便在標準庫中,也存在用於編寫應用的不良實踐。然而,許多 Python 開發人員卻根本不知道它們。

接上篇python

6. 解析 XML(Parsing XML)編程

若是你的應用程序要加載、解析 XML 文件,則你可能正在使用 XML 標準庫模塊。經過 XML 的攻擊大可能是 DoS 風格(旨在使系統崩潰而不是泄露數據),這些攻擊十分常見,特別是在解析外部(即不可信任的)XML 文件時。安全

其中有個「billion laughs」,由於他的 payload 一般包含不少(十億)「lols」。基本上,這個原理是能夠在 XML 中使用參照實體,因此當解析器將這個 XML 文件加載到內存中時,它會消耗數 G 大小的內存(RAM)。框架

試試看,若是你不相信個人話 :-)編程語言

<?xml version="1.0"?>
<!DOCTYPE lolz [
  <!ENTITY lol "lol">
  <!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
  <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
  <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
  <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
  <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
  <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
  <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
  <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
]>
<lolz>&lol9;</lolz>

須要考慮的另外一種狀況是依賴的第三方軟件包須要解碼 XML ,例如配置文件、遠程 API。你甚至可能不知道某個依賴關係會將這些類型的攻擊置之不理。學習

修復:測試

使用 defusedxml 替換標準庫模塊,它增長了針對這些類型攻擊的安全防禦。code

7. 受污染的 site-packages 或 import 路徑xml

Python 的 import 系統很是靈活,當你想要爲測試寫猴子補丁或重載核心功能時,這是很是棒的。進程

但這倒是 Python 中最大的安全漏洞之一。

安裝第三方軟件包,不管是在虛擬環境中仍是全局(一般不鼓勵)都會讓你看到這些軟件包中的安全漏洞。有一些發佈到 PyPi 的軟件包與流行的軟件包具備類似的名稱,可是卻執行了任意代碼。

須要考慮的另外一種狀況是依賴的依賴,他們可能包含漏洞,他們也能夠經過導入系統覆蓋Python 中的默認行爲。

修復:

看看 http://PyUp.io 及其安全服務,爲全部應用程序使用虛擬環境,並確保全局的 site-packages 儘量乾淨,檢查包簽名。

8. 序列化 Pickles

反序列化 pickle 數據和 YAML 同樣糟糕。Python 類能夠聲明一個 reduce 方法,該方法返回一個字符串,或一個可調用的元組以及使用 pickle 序列化時調用的參數。攻擊者可使用它來包含對其中一個子進程模塊的引用,以在主機上運行任意命令。

修復:

切勿使用 pickle 反序列化不受信任或未經身份驗證來源的數據。改用另外一種序列化模式(如JSON)。

9. 使用系統 Python 運行時而且不修復它

大多數 POSIX 系統都自帶有一個 Python 2 版本(一般是舊版本)。

有時候 Python(即 CPython 是用 C 語言編寫的) 解釋器自己存在漏洞, C 中的常見安全問題與內存分配有關,因此大可能是緩衝區溢出錯誤,CPython 多年來一直存在一些溢出漏洞,每一個漏洞都在後續版本中進行了修復。也就是說,若是及時升級 python 運行時,就很安全。

修復:

爲生產應用程序安裝最新版本的 Python,並及時安裝修復更新!

10. 不修復依賴關係

相似於不修補 python 運行時,還須要按期修補依賴關係。

在 PyPi 的軟件包中「釘住」 Python 軟件包版本的作法是很糟糕的,目的是「這些是能正常工做的版本」,因此每一個人都不升級它。

上面提到的代碼中的全部漏洞在第三方包中存在時一樣重要,這些軟件包的開發人員每時每刻都在修復安全問題。

修復

使用像 PyUp.io 這樣的服務來檢查更新,嚮應用程序提出 pr,並運行測試以保持軟件包是最新的。

原文: 10 common security gotchas in Python and how to avoid them
相關文章
相關標籤/搜索