以 PyPI(Python 包索引)等開(kāi)源包存儲(chǔ)庫(kù)為目標(biāo)的攻擊者設(shè)計(jì)了一種新技術(shù),可以將他們的惡意代碼隱藏在安全掃描器、人工審查和其他形式的安全分析中。
在一次事件中,研究人員發(fā)現(xiàn)惡意軟件代碼隱藏在 Python 字節(jié)碼 (PYC) 文件中,該文件可以直接執(zhí)行,而不是源代碼文件由 Python 運(yùn)行時(shí)解釋。
安全公司 ReversingLabs 的研究人員在一份報(bào)告中說(shuō):這可能是第一個(gè)利用 Python 字節(jié)碼文件可以直接執(zhí)行這一事實(shí)的供應(yīng)鏈攻擊,而且它是在惡意提交到 Python Package Index 的激增之際發(fā)生的。
如果是這樣,它會(huì)帶來(lái)另一個(gè)供應(yīng)鏈風(fēng)險(xiǎn),因?yàn)榇蠖鄶?shù)安全工具可能會(huì)錯(cuò)過(guò)這種類型的攻擊,這些工具只掃描 Python 源代碼 (PY) 文件。
編譯代碼與源代碼
在公共存儲(chǔ)庫(kù)(例如用于 JavaScript 的 npm、用于 Python 的 PyPI 和用于 Ruby 的 RubyGems)中發(fā)現(xiàn)的絕大多數(shù)包都包含打包到存檔中的開(kāi)源代碼文件。它們很容易解包和閱讀,因此已經(jīng)為這些存儲(chǔ)庫(kù)構(gòu)建了安全掃描器來(lái)處理這種類型的包裝。
攻擊者一直在與安全公司進(jìn)行斗爭(zhēng)以逃避檢測(cè),而對(duì)于明文代碼,最常見(jiàn)的逃避技術(shù)是混淆。這包括使用編程語(yǔ)言本身的特性,如編碼、解碼或評(píng)估,使代碼不可讀但功能正常。例如,用base64編碼惡意代碼是一種常用的技術(shù),但安全工具可以處理這種編碼。
在 PyPI 生態(tài)系統(tǒng)中,W4SP Stealer 惡意軟件背后的網(wǎng)絡(luò)犯罪分子以采用包括 base64 編碼、LZMA 壓縮和縮小在內(nèi)的技術(shù)而聞名,從代碼中刪除空格和注釋以使其更緊湊但也更難閱讀。
該小組使用一些第三方開(kāi)源工具來(lái)實(shí)現(xiàn)這一點(diǎn),例如 pyminifier、Kramer 或 Hyperion。在 W4SP 攻擊的一種變體中,文件中混淆的惡意代碼被移動(dòng)到默認(rèn)屏幕邊框的邊緣之外,這樣手動(dòng)查看源代碼文件的人就看不到它了。
但是,PYC 文件不同。它們不像純文本 PY 腳本那樣是人類可讀的。PYC 文件是在 Python 解釋器導(dǎo)入或執(zhí)行 Python 腳本時(shí)生成的。因?yàn)樗鼈円呀?jīng)是解釋(編譯)代碼,所以它們稍后可以由 Python 解釋器直接執(zhí)行,而無(wú)需重新解釋原始腳本。這有助于提高性能,因?yàn)樗哂懈斓膱?zhí)行時(shí)間,并且此類文件最常見(jiàn)的用途是分發(fā) Python 模塊。
在大多數(shù) PyPI 惡意軟件實(shí)例中,惡意混淆代碼旨在訪問(wèn)外部 URL 并下載惡意軟件,通常是信息竊取程序,這是安全工具檢測(cè)可疑行為的另一個(gè)機(jī)會(huì)。
在最近的這起事件中,一個(gè)名為 fshec2 的包被發(fā)現(xiàn)包含一個(gè)惡意 PYC 文件,完整的惡意負(fù)載可以隱藏在文件中,如果安全工具不是為反編譯它而設(shè)計(jì)的,就很難檢測(cè)到它。
在 fshec2 包中發(fā)現(xiàn)的加載程序腳本包含最少的 Python 代碼,并執(zhí)行一個(gè)簡(jiǎn)單的操作:加載已編譯的 Python 模塊,它恰好是一個(gè)惡意模塊。
檢查器是 PyPI 安全團(tuán)隊(duì)提供的用于分析 PyPI 包的默認(rèn)工具,目前不提供任何分析二進(jìn)制文件以發(fā)現(xiàn)惡意行為的方法。編譯代碼來(lái)自.PYC 文件需要反編譯才能分析其內(nèi)容。
發(fā)現(xiàn)的 fshec2 包表現(xiàn)出可能意在逃避檢測(cè)的額外行為。通常,使用 import 指令從 Python 腳本導(dǎo)入模塊。然而,在這種情況下,惡意 PYC 模塊是使用 importlib 加載的,importlib 是一個(gè)實(shí)現(xiàn)導(dǎo)入功能的單獨(dú)包,僅用于特定情況,例如在導(dǎo)入時(shí)動(dòng)態(tài)修改導(dǎo)入的庫(kù)。
在這種情況下,惡意 PYC 沒(méi)有被修改,因此除了避免使用常規(guī)導(dǎo)入指令之外,沒(méi)有技術(shù)理由使用 importlib,可能是為了逃避檢測(cè)。
憑證竊取似乎是主要目標(biāo)
一旦在機(jī)器上執(zhí)行,fshec2 惡意負(fù)載會(huì)收集有關(guān)系統(tǒng)的信息,例如用戶名、目錄列表和主機(jī)名,然后在 Linux 上設(shè)置 cron 作業(yè)或在 Windows 上設(shè)置計(jì)劃任務(wù)以執(zhí)行從遠(yuǎn)程服務(wù)器獲取的命令。
這些命令允許惡意軟件自我更新,攻擊者能夠提供新版本以及 Python 腳本形式的其他有效負(fù)載。
研究人員分析了命令和控制服務(wù)器,發(fā)現(xiàn)了允許他們?yōu)g覽某些信息的錯(cuò)誤配置。例如,他們發(fā)現(xiàn)受害者機(jī)器被賦予了一個(gè)遞增的 ID,并且能夠確認(rèn)該惡意軟件確實(shí)是由多個(gè)受害者執(zhí)行的。
這些錯(cuò)誤的數(shù)量之多可能會(huì)讓我們得出這樣的結(jié)論,即這次攻擊不是國(guó)家支持的行為者所為,也不是高級(jí)持續(xù)威脅 (APT)。雖然團(tuán)隊(duì)沒(méi)有收集到足夠的證據(jù)來(lái)以某種方式證明這一假設(shè),但通過(guò)增加文件 ID 來(lái)收集文件名讓我們確定在某些情況下攻擊是成功的。
我們的研究人員仍然無(wú)法說(shuō)出目標(biāo)是誰(shuí)或什么是。但是,我們可以確認(rèn)開(kāi)發(fā)人員確實(shí)安裝了惡意 PyPI 包,并且他們的機(jī)器名稱、用戶名和目錄列表因此被收集。
在服務(wù)器上發(fā)現(xiàn)的一些文件名表明攻擊者在一些機(jī)器上部署了鍵盤(pán)記錄功能。
從歷史上看,npm 一直是不幸的領(lǐng)導(dǎo)者,PyPI 也參加了比賽,看看哪個(gè)開(kāi)源平臺(tái)最受惡意軟件作者的關(guān)注。然而,在過(guò)去六個(gè)月中,我們和其他人觀察到發(fā)布到 PyPI 的惡意軟件數(shù)量顯著增加。事實(shí)上,在 5 月份,在 PyPI 上創(chuàng)建新用戶帳戶和項(xiàng)目被暫停了幾個(gè)小時(shí),因?yàn)榇罅康膼阂饣顒?dòng)。
我們向 PyPI 安全團(tuán)隊(duì)報(bào)告了新的攻擊媒介,他們刪除了軟件包并表示他們之前從未見(jiàn)過(guò)這種攻擊技術(shù)。這并不排除其他類似包進(jìn)入存儲(chǔ)庫(kù)的可能性。
為了應(yīng)對(duì)這些現(xiàn)代軟件供應(yīng)鏈威脅,組織需要的不僅僅是靜態(tài)代碼分析解決方案。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-471046.html
他們需要的工具還可以監(jiān)控敏感的開(kāi)發(fā)系統(tǒng),以發(fā)現(xiàn)可疑進(jìn)程創(chuàng)建、文件執(zhí)行、未經(jīng)授權(quán)的 URL 訪問(wèn)、信息收集命令以及使用 get_path 或 importlib 等易于濫用的功能。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-471046.html
到了這里,關(guān)于攻擊者使用 Python 編譯的字節(jié)碼來(lái)逃避檢測(cè)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!