Kisah ini bermula apabila Sébastien Lorber, penyelenggara Docusaurus, projek dokumentasi sumber terbuka berasaskan React, menyedari perubahan Permintaan Tarik pada manifes pakej. Berikut ialah perubahan yang dicadangkan kepada pakej cliui npm yang popular:
Khususnya, menarik perhatian kita kepada perubahan dependensi npm yang menggunakan sintaks yang tidak dikenali:
"dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
Kebanyakan pembangun menjangkakan untuk melihat julat versi semver dalam nilai pakej atau mungkin Git atau URL berasaskan fail. Walau bagaimanapun, dalam kes ini, terdapat npm khas: sintaks awalan. Apakah maksudnya?
Jadi, dalam kes perubahan yang dicadangkan dalam permintaan tarik ini, pakej string-width-cjs akan menyelesaikan kepada pakej string-width dalam versi ^4.2.0. Ini bermakna akan ada masukan direktori node_modules untuk string-width-cjs tetapi dengan kandungan string-width@^4.2.0 dan tingkah laku serupa dalam lockfile (package-lock.json).
Pengalian pakej ialah ciri pengurus pakej npm dan boleh digunakan secara sah untuk kes seperti yang dibayangkan di sini (untuk membantu dengan sokongan ESM vs CJS).
Dengan itu, aliasing pakej boleh disalahgunakan. Dalam artikel dan pendedahan keselamatan sejak tahun 2021, Nishant Jain, Duta Snyk, menunjukkan cara pendaftaran npmjs rasmi boleh ditipu untuk memberi maklumat salah maklumat pergantungan berdasarkan pengalian pakej sebagai sebahagian daripada kekeliruan kebergantungan dan kebimbangan keselamatan rantaian bekalan.
Permintaan tarikan ini sememangnya jinak, dan tiada risiko serangan rantaian bekalan. Walau bagaimanapun, Sébastien curiga dengan nama pakej sedemikian dan mendapati ada lagi yang perlu dibimbangkan.
Apabila Sébastien meneliti permintaan tarik, dia menjalankan alat yang dipanggil lockfile-lint, yang membantu dalam mengesahkan lockfiles seperti package-lock.json atau yarn.lock untuk memastikan ia tidak diganggu untuk menyuntik pakej berniat jahat dan bukannya pakej npm asal.
Menjalankan alat menunjukkan amaran berikut:
npx lockfile-lint --path package-lock.json --allowed-hosts yarn npm --validate-https --validate-package-names detected resolved URL for package with a different name: string-width-cjs expected: string-width-cjs actual: string-width detected resolved URL for package with a different name: strip-ansi-cjs expected: strip-ansi-cjs actual: strip-ansi detected resolved URL for package with a different name: wrap-ansi-cjs expected: wrap-ansi-cjs actual: wrap-ansi ✖ Error: security issues detected!
Penafian: lockfile-lint ialah alat yang saya bangunkan pada 2019 berikutan penerbitan saya yang mendedahkan kebimbangan keselamatan dengan lockfiles: mengapa npm lockfiles boleh menjadi titik buta keselamatan untuk menyuntik modul berniat jahat.
Memandangkan keputusan lockfile-lint di atas, Sébastien mencari nama pakej ini pada npm dan secara mengejutkan mendapati bahawa ini wujud pada pendaftaran npm awam:
Sébastien menyatakan bahawa nama pakej ini bukan sahaja wujud pada npm, tetapi ia mempunyai penunjuk yang menimbulkan kebimbangan:
Melihat pakej npm strip-ansi-cjs, tiada README dan tiada repositori kod sumber yang dikaitkan dengan pakej tetapi terdapat banyak pakej yang sah dan popular yang memetik tingkah laku yang sama.
Malah, untuk pakej khusus ini, terdapat isyarat populariti dalam bentuk tanggungan yang banyak (pakej lain yang bergantung pada yang ini) - tepatnya 529 tanggungan, dan juga jumlah muat turun mingguan yang semakin meningkat, berjumlah 7,274 pada masa menulis.
Melihat pada kod untuk strip-ansi-cjs, ia menunjukkan bahawa hanya terdapat satu fail dalam pakej ini, fail package.json package manifest.
Jadi, mengapa pakej yang tidak melakukan apa-apa mendapat banyak muat turun dan mengapa begitu banyak pakej lain bergantung padanya?
Mari kita terus memeriksa pengarang pakej npm ini.
Ketiga-tiga pakej dimiliki oleh himanshutester002, dan pakej mereka semuanya diterbitkan tahun lepas dengan nombor versi program. Ada yang menarik untuk dipanggil:
You can also note that the user himanshutester002 has no identifiable information on this user profile page on npmjs.
We previously noted that the strip-ansi-cjs npm package has over 500 other packages that use it, therefore, potentially a positive indicator for popularity. Let’s look at them:
If you give it a glance, this might transfer some sort of legitimacy with this list, but is it?
For example, names like clazz-transformer or react-native-multiply or maybe gh-monoproject-cli seem legitimate, but are they?
Here is the react-native-multiply npm package page:
This package has virtually no downloads and its author is also an anonymous npm user with no identifiable information. The source URL repository this package redirects to is https://github[.]com/hasandader/react-native-multiply which doesn’t exist and the GitHub user profile looks very suspicious and lacks practical activity.
The npm package contents might seem like there’s some actual source code in there, but in reality, it looks like a generated code sample for a “hello world” application prototype.
You also have to wonder, if this package is just a multiplication library, then why does it need 776 dependencies to do the following:
import { multiply } from 'react-native-multiply'; const result = await multiply(3, 7);
While some may mock JavaScript for its abuse of dependencies, contributing to an astronomical tree of nested packages, it doesn’t make any sense for a project to declare 776 direct (top-level) dependencies.
Among all of these dependencies, are the 3 suspicious npm packages that our story began with: string-width-cjs, strip-ansi-cjs, and wrap-ansi-cjs:
We mentioned that one of the strip-ansi-cjs dependencies was named clazz-transformer. Let’s look at it:
Let’s explain what is happening here:
The associated repository’s typstack/class-transformer on GitHub has the package.json file as follows:
Looking at the package.json file on GitHub shows no declaration of dependencies, yet if we inspect the source code of the actual package on npmjs we see the 437 dependencies that this clazz-transformer is packaged with. Again, very conveniently bundling the 3 suspicious *-cjs packages:
Before we draw further conclusions, it is important to mention a few of the traits of the npm packages we observed above:
Rakan sebaya kami di Sonatype sebelum ini telah mengenal pasti kes serupa membanjiri pendaftaran sumber terbuka dengan pakej. Dalam kes ini, matlamat utama adalah untuk pembangun memberi ganjaran kepada diri mereka sendiri dengan token Teh, yang merupakan platform Web3 untuk mengewangkan perisian sumber terbuka.
Mencari beberapa fail tea.yaml dalam pakej yang disebutkan seterusnya menyokong tesis bahawa sebahagian daripada tujuan kempen ini adalah untuk melombong token Teh melalui penyalahgunaan Teh.
Awal tahun ini, pada 14 April 2024, seorang pengguna forum Teh menyiarkan ulasan yang menyokong lagi kebimbangan penyalahgunaan teh:
Sebelum membuat kesimpulan, saya ingin mengucapkan terima kasih yang tulus kepada Sébastien Lorber atas pemikiran penyelenggaranya yang berhati-hati dan kerana membantu mendedahkan rangkaian serangan rantaian bekalan npm yang berpotensi ini.
Pada ketika ini, saya mempunyai keyakinan yang tinggi bahawa saya boleh terus menyucuk lubang di seluruh pakej yang kononnya bergantung pada string-width-cjs untuk mencari penunjuk kesahihan yang sangat meragukan.
Adalah andaian saya bahawa semua pakej bergantung dan rangsangan muat turun ini membawa kepada tujuan tunggal untuk mewujudkan kesahihan palsu untuk pakej 3 *-cjs supaya pada masa yang sesuai, dengan mangsa yang betul sedang bermain, pakej palsu ini akan dipasang dan kemudian ikuti dengan versi hasad baharu.
Untuk membantu anda kekal selamat semasa bekerja dengan perisian sumber terbuka, saya amat mengesyorkan agar anda mengamalkan amalan keselamatan dan khususnya sumber pendidikan susulan ini:
Adakah kami menangkap kempen keselamatan rantaian bekalan di tengah-tengah kecurangan mereka, atau adakah ini semua tentang jejak wang dan oleh itu boleh dikaitkan dengan spam dan penyalahgunaan pendaftaran awam seperti npm dan GitHub untuk melombong token Teh?
Walau bagaimanapun perkara ini berlaku, kekal berwaspada.
Atas ialah kandungan terperinci Penyelenggara yang Meragukan Menyingkap Benang Serangan Rantaian Bekalan npm. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!