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 中的默認行為。
修復:
看看 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
擴展閱讀:
- 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有品在做怎樣的布局?
※抓住了是興奮劑,抓不住是高科技
※再說月子 | 日誌 | 果殼網 科技有意思