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

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

來自專欄極光日報17 人贊了文章

簡評:編寫安全代碼很困難,當你學習一個編程語言、模塊或框架時,你會學習其使用方法。 在考慮安全性時,你需要考慮如何避免被濫用,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 支持從外部 URL 引用實體,XML解析器通常會毫無疑問地獲取並載入該資源。「攻擊者可以規避防火牆並訪問受限制的資源,因為所有請求都是由內部可信的 IP 地址創建的,而不是來自外部。」

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

修復:

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

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

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

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

安裝第三方軟體包,無論是在虛擬環境中還是全局(通常不鼓勵)都會讓你看到這些軟體包中的安全漏洞。有一些發布到 PyPi 的軟體包與流行的軟體包具有相似的名稱,但是卻執行了任意代碼。

需要考慮的另一種情況是依賴的依賴,他們可能包含漏洞,他們也可以通過導入系統覆蓋Python 中的默認行為。

修復:

看看 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

擴展閱讀:

  • Python 3.7 將引入 dataclass 裝飾器
  • 簡析 Python 的 `NotImplemented`
  • Python 的 For/Else 語句
  • 使用 Python 和 Click 編寫命令行應用程序
  • Python:range 對象並不是迭代器
  • PyPI 終於支持 Markdown 了
  • 8102 年資深程序員一定要 follow 的 Python 博客/網站 Top 10
  • Python 中的 10 個常見安全漏洞,以及如何避免(上)

極光日報,極光開發者旗下媒體。

每天導讀三篇英文技術文章。

推薦閱讀:

微軟收購Github給業界帶來一個「開關」
一起來寫一個簡單的解釋器(2)
知名體脂秤品牌發布手機無線充,PICOOC有品在做怎樣的布局?
抓住了是興奮劑,抓不住是高科技
再說月子 | 日誌 | 果殼網 科技有意思

TAG:Python | 科技 | 計算機科學 |