作者:知道創宇404實驗室
一.概述
2017年6月2日,Paper 收錄了一篇 fate0 的《Package 釣魚》 文章,該文章講述了作者在 PyPI 上投放惡意的 Python 包釣魚的過程。當用戶由于種種原因安裝這些惡意包時,其主機名、Python 語言版本、安裝時間、用戶名等信息會被發送到攻擊者的服務器上。在釣魚的后期,作者已經將 Github上的相關項目 中獲取相應主機信息改成了提示用戶安裝惡意的 Python 包。
在收錄該文之后,知道創宇404安全實驗室對該文中所提到的攻擊方式進行跟進、整理分析原作者公布的釣魚數據。值得一提的是,在跟進的過程中,我們發現了新的釣魚行為。在文第四章有相應的介紹。
相比于傳統的釣魚方式,上傳惡意 Python 包,不通過郵件、網頁等方式傳播,用戶很難有相關的防護意識。與此同時,由于 Pypi 源的全球性和 Python 語言的跨平臺性,相關的惡意包可以在世界各國的任意操作系統上被執行。由于執行惡意包的多數是互聯網從業人員,通過惡意的 Python 包釣魚也具有一定的定向攻擊性,在原作者公布的釣魚數據中,疑似百度,滴滴,京東等相關互聯網公司均有中招。試想通過如此方式進行針對全球的APT攻擊,將無疑是一場災難。
本文,就讓我們聊一聊這個被隱藏的攻擊面—— Python package 釣魚。
二.Python package釣魚簡析
2.1 Python package釣魚方式
Python 有兩個著名的包管理工具 easy_install.py 和 pip 。這次我們的主角就是 pip 這個包管理工具。在 Python 語言中,需要安裝第三方庫時,通過命令 pip install package_name 就可以迅速安裝。我們將該安裝過程中的相關步驟簡化成如下流程圖:

可以看到,通過 pip 安裝惡意的 smb 包時,最終將運行 setup.py 文件。由于任意 Python 開發者可以將自己的開發包上傳至 Pypi 時,所以當上傳的包名字被攻擊者精心構造時,就可以達到釣魚的目的。
例如前段時間的 samba 遠程命令執行漏洞的 POC 中導入了如下包:
from smb.SMBConnection import SMBConnection
from smb import smb_structs
from smb.base import _PendingRequest
from smb.smb2_structs import *
from smb.base import *
經過查詢,可以知道我們需要安裝 pysmb 這個包就可以成功執行該 POC 。但是,很多安全研究人員會根據經驗直接執行 pip install smb ,然而 smb 這個包卻是原文作者上傳的惡意程序包。所以當我們執行 pip install smb 命令后,主機的相關信息就會發送至攻擊者的服務器。
2.2 Pypi 上傳限制繞過
原作者 fate0 還注意到一個細節,在平時使用過程中,一般通過命令 pip install –r requirements.txt 來安裝整個項目的依賴文件。但是往往會錯敲成 pip install requirements.txt 。
這就意味著,requirements.txt 也是一個好的惡意程序包名稱。原作者據此進行研究,發現了一個上傳限制繞過的方法。
在 https://github.com/pypa/pypi-legacy/blob/master/webui.py 中有如下代碼段

我們可以看到 PyPI 直接硬編碼這些文件名禁止用戶上傳同名文件。
而當用戶利用 pip 安裝 Python 包,PyPI 在查詢數據庫時會對文件名做以下正則處理 https://github.com/pypa/warehouse/blob/master/warehouse/migrations/versions/3af8d0006ba_normalize_runs_of_characters_to_a_.py

這意味者以下方式安裝的將會是同一個包

基于這點,我們可以繞過 requirements.txt 等一系列包被硬編碼而無法上傳的限制。
PyPI 官方已對該漏洞做出回應:https://github.com/pypa/pypi-legacy/issues/644

截止發文,官方尚未發布針對該漏洞的補丁。
三.釣魚數據分析
根據 fate0 公開的釣魚數據,我們根據 country, language, package, username 這幾個關鍵字來進行數據匯總,得到如下排名:
-
受影響國家 TOP 10:

-
Python版本分布排名:

-
惡意包命中排名:

-
以root權限安裝的惡意包排名

-
主機用戶排名:

由上述數據可以看到,美國、中國、印度等國家紛紛中招,美國受到的影響最為嚴重,其次是中國及印度等國家,這也從一定程度上,反映了各個國家的互聯網發展水平。
從 Python 的版本分布上我們可以看到絕大多數用戶都在使用 2.7、3.5、3.6 等版本,具體的來說, python2 占比 48%, python3 占比 52%。這也從側面反映出, python3 已經開始逐漸普及。
惡意包命中率最高的為 opencv、tkinter 等流行的軟件,可見很多用戶在安裝軟件包之前,沒有養成檢查的良好習慣,最終被釣魚。
同時絕大多數用戶是以最高權限 root 直接運行安裝命令,一旦遭受釣魚攻擊,用戶隱私和服務器安全將無法保障。
對這批數據的 hostname 字段進行深入分析,我們發現此次釣魚事件中,以下公司企業、學校、政府可能受到影響。(理論上 hostname 可修改,以下結果僅供參考)
-
公司、企業、組織等:

-
學校

-
政府單位

-
受影響的中國公司

-
值得一提的是,以下 2017 年全球 500 強企業在此次釣魚中可能也受到影響,如下:

根據 hostname 字段和 username 字段的信息對操作系統進行粗略估計,我們發現中招的系統包括:Linux、Mac、Windows、RaspberryPi 等,其中以 Mac、Linux 居多。顯然,Python 的跨平臺性決定了這種釣魚攻擊也是跨平臺的。
可識別的系統分布如下:

我們還發現以下IP多次中招:

經過進一步分析,我們發現部分重復中招IP的 hostname 都相同且均符合 docker hostname 特征,同時操作權限均為 root,我們懷疑這可能是安全研究人員在借助 docker 環境對釣魚后續行為進行跟蹤分析。
四.后續釣魚事件
在對 python package 釣魚進行持續跟進時,有人惡意的在 PyPI 上提交了 zoomeye-dev 的 Python 安裝包, 截圖如下:

根據前期的分析,輕車熟路地找到關鍵惡意代碼所在:

可以看到,當用戶誤安裝 zoomeye_dev 這個包時,會被收集操作系統名稱,主機名,用戶名,Python 語言版本等系統并發送至指定地址,同時返回一個 callback 地址,如果 callback 地址非空,將從這個地址下載文件并執行。在實際的測試過程中,該 callback 地址并未返回具體內容。如果釣魚者懷有惡意的目的,而同時我們還以最高權限 root 安裝了這個惡意的包,那惡意程序就已經在我們的電腦中暢行無阻了!
目前,該惡意程序包已經被刪除,從該惡意程序包被上傳至 Pypi 源到被發現被刪除,僅僅用時兩個小時。但我們無法想象,非互聯網安全公司發現自己公司的相關惡意程序包被上傳到 Pypi 源上會需要多久。也許,到最終被發現的時候,已經造成了巨大的損失。
五.小結
Package 釣魚巧妙利用了用戶誤操作的不可避免性以及開源倉庫的松散審查,并利用流行軟件名稱來擴大釣魚范圍,往往這種思路的攻擊比一般漏洞危害更大。就比如說這次釣魚事件中 Google、Amazon 等網絡巨頭也紛紛中招,它們的安全防護能力肯定是毋庸置疑的,但誰能想到問題出在開源倉庫,開源倉庫一旦被污染,那么后果將是可怕的,舉個例子,如果上述那個 callback 真的非空,那么滲透企業內網也并非什么難事。
僅僅是針對 Python 開源倉庫平臺進行釣魚的一次嘗試,影響就已經如此廣泛。試想再結合Ruby等也面臨著同樣問題的語言,將會再次擴大潛在的攻擊范圍。甚至于如果公開的鏡像源平臺被攻陷,正常的第三方庫被替換成惡意的程序包,那么通過該鏡像源安裝程序的主機都會受到影響。
我們可以想象如果利用其他攻擊面,比如說針對開源組件的開發者進行攻擊,從而控制相關開源組件代碼,并在開發者未察覺的情況下長期潛伏,最終發起全球 APT 攻擊,我們該如何防御?
當今世界,各種開源的軟件、工具無處不在,我們在享受著自由軟件所提供的便利時,是否考慮過它們的安全性?
開源本身極大的促進了信息時代的發展,但若是缺乏有效審查的開源,被不懷好意的人拿來作惡,那么殺傷力將是無法想象的。
為了世界更安全,我們一直在努力,但同時用戶的安全意識才是重中之重!
六.參考鏈接
[1] seebug收錄的《package釣魚》一文
http://www.bjnorthway.com/311/
[2] package釣魚原文
http://blog.fatezero.org/2017/06/01/package-fishing/
[3] fate0公開的釣魚數據
http://evilpackage.fatezero.org/
[4] Typosquatting in Programming Language Package Managers
http://incolumitas.com/data/thesis.pdf
[5] cookiecutter-evilpy-package
https://github.com/fate0/cookiecutter-evilpy-package
致謝:
感謝fate0在《package釣魚》一文中以“惡意者”視角為我們帶來的精彩嘗試以及在http://evilpackage.fatezero.org/上公開的釣魚數據,讓我們意識到隨意安裝Python包潛在的危害性。同時也感謝全體404實驗室的小伙伴在本篇報告完成中的無私幫助。謝謝。
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/326/