作者:知道創宇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實驗室的小伙伴在本篇報告完成中的無私幫助。謝謝。


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/326/