供應鏈攻擊、數據竊取、NPM
ReversingLabs的研究人員近來發現了一些廣泛傳播的供應鏈攻擊的相關證據。這些供應鏈攻擊通過NPM包管理來傳播惡意的JavaScript包。ReversingLabs的研究人員發現了20多個六個月之前發布的NPM包,包含着經過混淆的惡意JavaScript代碼,這些惡意代碼能夠從調用這些包的網站和移動應用中竊取個人的表單數據。
經過進一步調研,發現了IconBurst聯合供應鏈攻擊的證據:其中大量的NPM包有惡意的jQuery代碼,這些代碼能夠在惡意包被部署的應用中竊取表單數據。儘管尚不清楚這次攻擊的全部範圍,但發現的惡意軟件包很可能被數百種或數千種的下游手機和桌面端應用程序以及網站使用。在其中一個案例中,一個惡意包已經被下載了超過17,000次。
同近來對德國組織的依賴混淆攻擊一樣,這些惡意攻擊依賴於故意的錯誤拼寫(typo-squatting),這種方法中攻擊者使用與合法NPM包相似的名稱,或者使用合法NPM包的常見錯誤拼寫來命名惡意的NPM包,並偽裝成像umbrellajs包以及ionic.io發布的包一樣的下載量大的包。這種攻擊的目標是軟件或數據的終端用戶,而非開發組織,這使得這種攻擊更接近於臭名昭著的SolarWinds攻擊。根據許多NPM包中用於獲取數據的域名間的相似性,這次供應鏈攻擊可能源於同一個攻擊者。
下文中是這次廣泛傳播的供應鏈攻擊的詳細信息,包括攻擊相關的失陷因子,以及對這些惡意NPM包的修補建議。
四月,ReversingLabs的研究人員偶然發現了使用JavaScript混淆器來隱藏其功能邏輯的一系列NPM包。對這些包的分析證實了對德國多個不同行業的頭部公司軟件供應鏈的模擬「依賴混淆」攻擊。從那以後, NPM倉庫中出現的使用相同混淆器的包就一直受到持續關注。
下面介紹了如何通過關注這種混淆技術來發現那些發布惡意代碼的NPM賬戶,這些惡意代碼最終被用於竊取用戶輸入的表單數據。
是否用了JavaScript混淆器是研究人員最初對大量NPM包關注的指標,這些包大多在過去兩個月發布,都使用上文提到的混淆器。總共發現了二十多個這樣的NPM包,查看這些包的名稱可以發現驚人的相似之處,如圖1所示。
圖1:使用JavaScript混淆器的相似NPM包
為了搞清楚這些包具體做了什麼,研究人員開始嘗試使用JavaScript 解混淆器對這些包進行解混淆。通過仔細測試解混淆後的實例,發現了它們都通過jQuery 的 Ajax請求模塊竊取用戶表單數據,並將這些數據發送到不同的域名下,最終由惡意代碼的作者獲取。一言以蔽之,這是惡意行為存在的證據。
顯然,這種通過故意錯誤拼寫來使開發者搞混這些包和惡意包的策略是有效的。以npm包作者ionic-io創建的包為例,圖2所示的是該作者發布的名為icon-package的包,該NPM包共計18個版本,其中包含着竊取數據的惡意代碼。這個包顯然是旨在誤導開發者使用這個包而非ionicons,這是一個常用的開源圖標庫,它為Web、安卓及桌面端應用提供了1000多個圖標。

圖2:icon-package發布的版本
圖4:正常的ionic頁面
在追蹤活動來源的過程中,甚至發現了包含此類惡意功能的舊軟件包。它們由作者fontsawesome於2021年12月發布,也針對上文提到的ionicons圖標集。這些包中用於數據獲取的域名為https://graph-googleapis.com,與icon包前兩個版本中使用的域名相同。
儘管該行為的確切開始尚不清楚,但惡意NPM包從2021年12月開始,一直到2022年5月中旬,主要在模仿ionicons框架。此後,攻擊者轉向開發新的NPM軟件包,這些軟件包使用與之前相同的手法,並開始針對其他流行的UI框架。
其中一個包被名為umberlaks,這顯然是對非常流行的umberlajs這一JavaScript DOM(document object model)操作框架的一種故意錯誤拼寫。
圖5:GitHub搜索結果
圖6:Woxruz的HackingTool倉庫
圖7:sidr包的說明和參考網站的內容
雖然最初觀察到的惡意軟件包採用保守的方法收集表單數據,但最近發布的惡意軟件包正在採取更主動的方法獲取數據。研究人員發現的另一個惡意軟件包footericon使用定義的「登錄表單」類從所有表單元素收集數據。
圖8:footericon包的表單竊取代碼
類似地,swiper-bundle包是一個針對流行的JavaScript框架swiper的惡意NPM包,它使用在jQuery嵌入代碼的方法,擴展了其end() 函數,使用頁面上的每個表單竊取數據。
圖9:swiper-bundle包的表單數據竊取代碼
雖然無法確定這些攻擊背後的主導者,但被部署的NPM包中藏着許多線索。例如,swiper-bundie軟件包在payload中包含一個JavaScript標頭,並帶有明文注釋,標記該NPM包的作者為Alberto Varela, 即Arpanrizki針對的sidr包的作者。同樣地,較長的注釋掉的單行JavaScript還包含對sidr包的幾個引用。
圖10:swiper-bundle包payload開始的注釋標頭
最後,惡意軟件包使用具有一致命名模式的域名:
<子域>.my.id
這些線索表明了各種惡意包背後是由同一系列的攻擊者主導的。
作者名與包名
下載數
fontsawesome
ionic-icon
108
ionicio
3724
ionic-io
icon-package
17774
ajax-libs
2440
umbrellaks
686
ajax-library
530
arpanrizki
iconion-package
101
package-sidr
91
kbrstore
89
icons-package
380
subek
99
package-show
103
package-icon
122
kbrstore
icons-packages
170
ionicon-package
64
icons-pack
49
pack-icons
468
ionicons-pack
89
aselole
package-ionicons
144
package-ionicon
57
base64-javascript
40
ionicons-js
38
ionicons-json
39
footericon
footericon
1903
ajax-libz
roar-01
40
roar-02
37
wkwk100
38
swiper-bundie
39
ajax-libz
40
swiper-bundle
185
atez
43
ReversingLabs的研究發現了影響廣泛的軟件供應鏈攻擊,下載數據表明,這次攻擊涉及數千個下游應用程序使用的二十多個NPM包。
對NPM包的分析揭示了合夥攻擊的證據,這些惡意包來源於一小部分作者,並且它們在支撐架構上與數據竊取域名有着相似之處。
此次攻擊標誌着軟件供應鏈攻擊的顯著升級。捆綁在NPM包內的惡意代碼在數量未知的移動和桌面應用程序以及網頁中運行,獲取了難以計數的用戶數據。由於很少有開發組織能夠檢測到開源庫和模塊中的惡意代碼,因此攻擊持續了數月才引起研究人員的注意,此時相關的NPM模塊已被總計下載超過27000次。在編寫本報告時,雖然一些惡意軟件包已從NPM中刪除,但大多數軟件包仍然可以下載。
除了這一特定事件之外,很明顯軟件開發組織及其客戶需要新的工具和流程來評估供應鏈攻擊的風險,例如這些惡意NPM包所帶來的風險。應用程序開發的分散和模塊化性質意味着應用程序和服務僅與其最不安全的組件一樣強。這次攻擊是得逞的,超過二十個惡意包可在通用的包管理軟件上下載,其中一個在幾周內被下載了17,000次。這揭示了應用開發自由散漫的特質,並說明惡意代碼甚至漏洞的代碼很容易存在于敏感應用程序和IT環境。
[graph]-googleapis.com
[io]nicio.com
[cur]ls.safhosting.xyz
[arp]anrizki.my.id
[dns]ter.my.id
[ok]ep.renznesia.xyz
[ryu]cha.my.id
[pan]elllgege.001www.com
[nge].scrp.my.id
[api]ii-xyz.yogax.my.id
[pan]el.archodex.xyz
[pan]el.curlz.online
(2) NPM包哈希
NPM包名
版本
SHA1
ionic-icon
4.7.0
8ab228743d3fef5c89aa55c7d3a714361249eba8
ionicio
5.0.0
f0221e1707075e2976010d279494bb73f0b169c7
icon-package
5.0.0
9299a3eb1f11fcc090c7584bb9ce895ba38fd2cb
icon-package
5.1.0
6092606456adce8eb705ba33ad3e9536682d917f
icon-package
5.2.0
d106693abc732a93176085410c67c4581de28447
icon-package
5.3.0
5a631ab46373251dade6dca5bb460b55bf738a64
icon-package
5.4.0
c173de3d3ee1dd0920ee5a3a4f80d8c280ce2697
icon-package
5.5.0
49f2bc011d1beece62b7a4ed47818e288b71edb6
icon-package
5.9.0
cf8a7066865ab6d009e226096fa879867b8e61bc
icon-package
6.0.0
6e2b0d621bf6031beee18b897b2da5d93d3ce5e7
icon-package
6.0.1
164ff2295b63434e8b260a46041669c98eab4235
icon-package
6.0.2
96aca5e901bd8f1229683339766073e4e5d1de59
icon-package
6.6.6
6253324c1d741c1be3ae20fd8262adb54530ee8b
icon-package
6.6.7
c77eda629d2076663276bc48c7462ea07470dbdc
icon-package
6.6.8
b7dc23a51469574205b0691944f4120e2d92e64d
icon-package
7.7.7
83e5ebd7f355b1655778a37db6b6953042fb77c4
icon-package
7.7.8
123dad7d48c47486e9c226ad50b26b2ba5ec9fe2
icon-package
7.7.9
17fef01df47ceb87b2755f4a18db23d8f7276d30
icon-package
8.0.9
ae70ef4e5a0bb522179e5d488ed56efb9ae5b4d9
icon-package
9.0.0
e66609e433e5b51a148889ff128bd7182fe22d4b
ajax-libs
9.0.1
54549337e60eede3d4dc6b52662c582449b66c40
ajax-libs
9.0.2
fd72a461bb62dce8989f1c24bdcc6ae6d4eaabc5
ajax-libs
9.0.3
66c41baf38e29c4b0a979cff35df4a1eed11e13e
umbrellaks
1.0.0
81031febc2ed49bdd8c8f7ca810830df1b0d3476
ajax-library
1.0.0
326dab8f5d4dab461ca5fd14f136503d12227eae
ajax-library
1.0.1
2afd6730426166f061d96a8ccbfba8d8c7ed9e3e
iconion-package
1.0.0
73db956f7f752c4f71a8a8588604fa7d7af7de7e
package-sidr
2.2.2
87cb0505dbb141391103e2bd358f3aa774210a4a
kbrstore
1.0.0
7e14150502ee992fc8b1259de58261aeb2f58ae1
icons-package
4.4.4
fb672c0b982542eeacce66be67a5bc4ff9567596
icons-package
4.4.5
a386ddf8fb1d0846e01501f6fbac11e0389ef581
icons-package
2.2.2
a5ad7a0edda67b7267694898a82abbee1ec7a466
icons-package
3.0.9
20254c86209118144e6a25fb90abea6f7c903d8e
subek
1.0.0
68d1c1883cfab75fa933ab08189ba7abbd2625a8
package-show
5.5.9
def789dc6322255264703c00d4f4dd265a48b50e
package-icon
6.0.5
1a719f2efa398ef8659a401e6209377beab87105
icons-packages
7.4.0
a2d25c070750cbd20f0c327980a40c26f4ea47ec
ionicon-package
9.0.3
f78a57ab8e288c725e452787f3b070ec690f276b
icons-pack
7.8.3
6388e354433f8c608ab8a97ed9391b9dc44d2a99
pack-icons
2.4.3
cda4b444744196ae9b2753830f750bc5e4548061
package-ionicons
8.0.5
abb8ff44d224b23266769d0808ebe97c3838e484
package-ionicon
8.0.5
c11d9aa077207adeef30cfdd9df3fe979e114b06
footericon
1.0.0
067e42878df480c0d1ca45c268300c96a258be63
footericon
3.7.1
06dbd365e76e7cb593df86a80385e8c46ca05545
footericon
3.7.0
8562edf90e988f7ca556183c2f032bc307dfefdb
footericon
3.7.3
08bc77bb17b6a4ab365d0354683cbd912219becf
footericon
1.7.9
9f5f2f34f15a03c4528d6fa632899d0e3b6d1ceb
roar-01
1.0.0
8c128c3be9645582db2fee9e64e175149d51d92c
roar-02
1.0.0
a1e2cb98d2aa1b134b3be04d6a720393dcf6c072
wkwk100
3.4.5
9f2a2001a07b92adef023ca697e4febba073728e
swiper-bundie
10.5.3
b64a10493897c96feb6eda1d0c9fc7ec85506258
ajax-libz
1.0.0
dd01c6baadd1d79f29b3d69a300e82b860edc57d
swiper-bundle
1.0.0
05d2084e1b2ce1d28c3096f16694413ec480704e
swiper-bundle
3.7.1
1de14d6be4029aa7888f8fc83779b61c96c063da
swiper-bundle
10.52.3
06cb7b1810ca1485e15fa81d92bd92533ff8c001
swiper-bundle
10.22.3
fa234405c958a9ff22bac7debfbcde452294d73c
swiper-bundle
10.21.3
64cd1eda88f92b32323f9784aab6d1a0bdd7a38c
ionicons-pack
1.5.2
fe59a8d59f6764800ce5b85f2bfbc4db05840bae
base64-javascript
3.7.2
77170de7458ee81382efd7de2499694a459abee3
ionicons-js
5.0.2
069f9c723af8be981a3e6220b991b9c40320d8b5
ionicons-json
5.0.2
52a96612e3d2df0a7980de81d622da6c5ff84513
atez
1.0.0
c6569dc3fd94f642cad56cb7a950175ff7c2062f
編輯|王浩鈞
審校|何雙澤、金矢
本文為CNTIC編譯整理,不代表本公眾號觀點,轉載請保留出處與鏈接。聯繫信息進入公眾號後點擊「關於我們」可見。