Rumah >hujung hadapan web >tutorial js >Penyelenggara yang Meragukan Menyingkap Benang Serangan Rantaian Bekalan npm

Penyelenggara yang Meragukan Menyingkap Benang Serangan Rantaian Bekalan npm

WBOY
WBOYasal
2024-07-18 15:06:49415semak imbas

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:

Suspicious Maintainer Unveils Threads of npm Supply Chain Attack
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.

Mencari tingkah laku yang mencurigakan dalam fail kunci npm mengenai modul berniat jahat

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.

Makluman tinggi: pakej popular kelihatan serupa pada npm

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:

  • https://www.npmjs.com/package/string-width-cjs
  • https://www.npmjs.com/package/strip-ansi-cjs
  • https://www.npmjs.com/package/wrap-ansi-cjs

Sébastien menyatakan bahawa nama pakej ini bukan sahaja wujud pada npm, tetapi ia mempunyai penunjuk yang menimbulkan kebimbangan:

  • Pakej ini tidak terikat dengan mana-mana repositori kod sumber awam
  • Jika diperiksa untuk kandungannya, pakej ini kosong daripada sebarang kod sebenar.
  • Identiti pengarang yang menerbitkan pakej ini adalah tanpa nama dan tidak dikaitkan dengan sebarang maklumat peribadi atau yang boleh dikenal pasti.

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.

Suspicious Maintainer Unveils Threads of npm Supply Chain Attack
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?

Suspicious Maintainer Unveils Threads of npm Supply Chain Attack

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:

  • isaacs-cliui npm package - potentially a typosquatting attempt on Isaac’s own fork of the cliui project and the legitimate npm package under their namespace: @isaacs/cliui.
  • azure-sdk-for-net npm package - potentially an attempt at dependency confusion campaign to attack private packages of the same name.
  • link-deep npm package - squatting on a popular capability related to utility packages such as lodash and others

Suspicious Maintainer Unveils Threads of npm Supply Chain Attack
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:

Suspicious Maintainer Unveils Threads of npm Supply Chain Attack
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:

Suspicious Maintainer Unveils Threads of npm Supply Chain Attack
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.

Suspicious Maintainer Unveils Threads of npm Supply Chain Attack
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:

Suspicious Maintainer Unveils Threads of npm Supply Chain Attack
We mentioned that one of the strip-ansi-cjs dependencies was named clazz-transformer. Let’s look at it:

Suspicious Maintainer Unveils Threads of npm Supply Chain Attack
Let’s explain what is happening here:

  • The npm package name is clazz-transformer, yet the package has a title of class-transformer at the top of the README’s package page here which was purposely done.
  • Similarly, the source code repository is https://github[.]com/typestack/class-transformer which might be a legitimate repository or a fake one, but it is not associating itself at all with the wording “clazz”.

The associated repository’s typstack/class-transformer on GitHub has the package.json file as  follows:

Suspicious Maintainer Unveils Threads of npm Supply Chain Attack
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:

Suspicious Maintainer Unveils Threads of npm Supply Chain Attack

Further thoughts on suspicious npm package findings

Before we draw further conclusions, it is important to mention a few of the traits of the npm packages we observed above:

  • Pakej React Native nampaknya berasal daripada alat perancah create-react-native-library yang turut menampilkan contoh fungsi darab lalai sebagai sebahagian daripada kod sumber stok yang dijana untuk projek baharu.
  • Pakej mempunyai struktur direktori dan fail serta kebergantungan yang boleh diperoleh daripada pelat dandang pemula Next.js 14, seperti yang dibuat dengan npx create-next-app@14.

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:

Suspicious Maintainer Unveils Threads of npm Supply Chain Attack
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.

Apa yang berlaku dengan string-width-cjs?

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:

  • Mengapa npm lockfiles boleh menjadi titik buta keselamatan untuk menyuntik modul berniat jahat
  • Amalan Terbaik Keselamatan 10 npm
  • Keselamatan NPM: mencegah serangan rantaian bekalan

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn