12 hal aneh yang bisa terjadi setelah menginstal paket npm

Beberapa bulan yang lalu saya memulai proyek yang disebut paket jahat (alias "paket jahat"). Ia memantau pembaruan dalam repositori npm, mengunduh semua modul baru, dan kemudian memeriksanya untuk kutu - ia mencari aktivitas jaringan, operasi mencurigakan dengan sistem file, dll. Bahkan proyek kecil pada node.js sering memiliki pohon ketergantungan yang besar, dan pengembang secara fisik tidak memiliki cara untuk menguji semuanya. Ini memberikan penyerang ruang lingkup yang sangat besar untuk bermanuver, dan muncul pertanyaan - berapa banyak registri jahat yang bersembunyi di sudut gelap registri npm? 180.000 paket diperiksa kemudian, saya mendapat jawaban kasar.


gambar


Dan jawaban ini - mungkin tidak terlalu banyak.
[catatan: di media ada versi bahasa Inggris dari artikel ini, juga oleh penulis saya]


Apa yang bisa dilakukan paket npm dengan sistem Anda?


Paket ini memiliki dua cara utama untuk membahayakan Anda - saat menginstal / mencopot dan pada saat Anda meluncurkan aplikasi Anda. Mari kita lihat kedua opsi dengan contoh.


Skrip NPM memungkinkan paket untuk menjalankan perintah sewenang-wenang pada saat instalasi dan penghapusan instalasi. Ini termasuk preinstall , install , postinstall , preuninstall dan postuninstall , yang secara otomatis dijalankan oleh npm pada saat yang tepat dalam siklus hidup paket. Apa yang bisa mereka lakukan? Semua sama seperti yang dapat dilakukan pengguna Anda saat ini - misalnya, menghapus semua foto Anda dari liburan terakhir, atau menggabungkan riwayat browser Anda ke FBI (walaupun, kemungkinan besar, mereka sudah memilikinya). Perilaku ini dapat dinonaktifkan dengan melewati --ignore-scripts , tetapi, pertama, tidak ada yang melakukannya, dan kedua, dengan cara ini Anda dapat merusak banyak paket yang cukup andal. Melalui skrip itulah serangan sensasional terhadap ESLint dilakukan, yang memengaruhi pengguna eslint-scope (6 juta instalasi per minggu) dan eslint-config-eslint (2 ribu instalasi per minggu).


Paket mendapat kesempatan kedua untuk mempersulit hidup Anda selama inisialisasi (biasanya terjadi pada panggilan pertama yang require ). Sekarang dia memiliki kesempatan untuk memodifikasi variabel global dan paket lainnya, misalnya, untuk mencuri kunci pribadi dari dompet bitcoin Anda, atau untuk membuat metode crypto.randomBytes tidak begitu acak .


gambar


Berapa banyak paket jahat yang terdeteksi?


Nah, daftar tidak dapat disebut mengesankan, total 3 paket ditemukan yang telah dihapus dari repositori npm oleh upaya tim keamanan npm . Mari kita bahas:



Meskipun hasilnya sangat sederhana, dalam proses menganalisis semua paket yang mencurigakan (dan saya melihat lebih dari 3.000 laporan untuk menemukan tiga mutiara ini), banyak hal lucu dan tidak terlalu banyak ditemukan yang biasanya tidak Anda pikirkan (atau cobalah untuk tidak memikirkan) dengan mengetikkan npm install . Jadi, mari kita bayangkan bahwa Anda secara tidak sengaja memilih salah satu dari banyak paket dari repositori dan menginstalnya. Apa yang bisa salah?


1. Paket dapat menimpa metode dalam paket lain (termasuk yang dari pengiriman standar Node.js)


Namun, jika Anda membaca beberapa paragraf sebelumnya atau telah bekerja dengan ekosistem javascript selama lebih dari seminggu, maka ini tidak mungkin menjadi berita untuk Anda. Tetapi skala bencana ini bisa saja lolos dari Anda. Jadi, jika proyek Anda memiliki setidaknya beberapa dependensi, maka kemungkinan besar metode fs.closeSync Anda telah ditimpa (dan mungkin lebih dari sekali). Sejumlah besar paket memodifikasi API orang lain, tetapi hanya beberapa dari mereka yang memiliki setidaknya beberapa alasan bagus untuk ini. Di antara "juara" adalah anggun-fs dengan 12 juta instalasi per minggu, yang mendefinisikan kembali puluhan metode dari fs . Perlu juga dicatat bahwa pendengar tidak crypto.randomBytes , yang menimpa 46 metode yang berbeda , termasuk crypto.randomBytes bernasib buruk, yang sedikit mengganggu saya ketika saya pertama kali menemukan ini.


Bayangkan apa yang akan dicari bug yang disebabkan oleh penimpaan seperti itu dari beberapa ketergantungan pada kedalaman hierarki. Namun, tidak ada alasan untuk khawatir, karena ...


2. Paket dapat menentukan API yang diubah untuk membuat koreksi tambahan padanya


gambar


Ya, beberapa paket melakukannya (paling sering berkenaan dengan graceful-fs ) menggunakan keajaiban akrobat seperti / graceful-fs /graceful-fs/.test(fs.closeSync.toString()) . Jadi, jika Anda tiba-tiba menemukan masalah yang tidak dapat dipahami di perpustakaan standar, coba instal saja beberapa paket npm acak. Atau matikan komputer dan berjalan-jalan di taman terdekat, hidup terlalu singkat untuk memahami semua ini.


3. Dia dapat mengirim analitik


Adblock tidak akan melindungi Anda jika terjadi sesuatu di konsol, dan penulis beberapa paket berhasil menggunakannya. Beberapa mengirim informasi paling mendasar, seperti ecdsa-csr :


 // POST https://api.therootcompany.com/api/therootcompany.com/public/ping { "package":"ecdsa-csr", "version":"1.1.1", "node":"v10.14.2", "arch":"x64", "platform":"linux", "release":"4.9.125-linuxkit", "action":"install", "ppid":"eDSeYr9XUNRi9WhWli5smBNAvdw=" } 

Beberapa tidak begitu pemalu. Di sini, misalnya, adalah bagian dari laporan tanpa server (yang asli 2 kali lebih besar):


 // POST https://tracking.serverlessteam.com/v1/track { "userId":"0e32cba0-14ef-11e9-9f89-b7ed4ca5dbba", "event":"framework_stat", "properties":{ "version":2, "general":{ "userId":"0e32cba0-14ef-11e9-9f89-b7ed4ca5dbba", "context":"install", "timestamp":1547135257977, "timezone":"GMT+0000", "operatingSystem":"linux", "userAgent":"cli", "serverlessVersion":"1.35.1", "nodeJsVersion":"v10.14.2", "isDockerContainer":true, "isCISystem":false, "ciSystem":null } } } 

Untungnya, jquery tidak mengirim statistik apa pun, sehingga Anda masih dapat menginstalnya secara diam-diam dari semua orang. Untuk saat ini.


4. Komputer Anda dapat digunakan sebagai pengganti server CI / CD


Mengapa Anda mengkompilasi paket Anda jika pengguna Anda dapat melakukan ini selama instalasi ? Anda bisa mendapatkan hasil tambahan jika Anda hanya menentukan versi utama dari kompiler yang diperlukan, misalnya typescript@3 . Satu harapan bagi orang-orang terpelajar dari Microsoft yang tahu bagaimana melakukan semver yang tepat.


Apakah mungkin untuk melangkah lebih jauh? Tentu saja !


 "postinstall": "eslint --ext .js,.vue --fix src" 

Sekarang Anda dapat tidur nyenyak - semua pengguna akan menerima sumber yang diformat sempurna untuk paket Anda.


5. Dia mungkin mencoba menakut-nakuti Anda.


gambar


Jika Anda menonton semua seri Mr. Robot, tetapi masih belum cukup termotivasi untuk membaca Jaringan Komputer dan melakukan sesuatu yang sangat mengesankan, yaitu solusi sederhana - tunjukkan keahlian Anda kepada dunia melalui beberapa baris dalam skrip postinstall . Ini persis seperti yang dilakukan penulis pizza-pasta (dan pada saat yang sama memberi saya KDPV).


 { "name": "pizza-pasta", "author": "Zeavo", "scripts": { "install": "mkdir -p ~/Desktop/hacked && touch ~/Desktop/hacked/pwnddddd && wget https://imgur.com/download/KTDNt5I -P ~/Desktop/hacked/", "postinstall": "find ~/.ssh | xargs cat || true && printf '\n\n\n\n\n\nOH HEY LOOK SSH KEYS\n\n\n\nHappy Birthday! Youve been h4ck0red\n\n\n'" } } 

6. Paket ini dapat memuat dan menjalankan skrip bash


Pernahkah Anda mendengar bahwa curl|bash bukanlah ide yang baik ? Jika tidak, maka Anda mungkin menjadi karyawan perangkat lunak ORESoft yang memiliki banyak paket dengan baris serupa di skrip postinstall :


 curl --silent -o- https://raw.githubusercontent.com/oresoftware/realpath/master/assets/install.sh | bash 

Sejauh ini, tidak ada kriminal dalam naskah ini ... Untuk saat ini. Saya harap setiap orang yang memiliki akses untuk master oresoftware/realpath adalah orang yang sangat jujur ​​dan baik.


7. Anda mungkin dimintai kata sandi


Penulis magicleap datang dengan cara yang agak tidak biasa untuk mendistribusikan paket pribadi melalui repositori publik. Proyeknya terdiri dari arsip terenkripsi dan utilitas untuk mendekripsi - tetapi hanya jika Anda memasukkan kunci yang benar dalam MAGICLEAP lingkungan MAGICLEAP :


 // : https://github.com/modulesio/magicleap/blob/master/decrypt.js var key = process.env['MAGICLEAP']; console.warn('Decrypting magicleap module with MAGICLEAP environment variable'); const ws = fs.createReadStream(path.join(__dirname, 'lib.zip.enc')) .pipe(crypto.createDecipher('aes-256-cbc', Buffer.from(key, 'base64'))) .pipe(fs.createWriteStream(path.join(__dirname, 'lib.zip'))); 

8. Paket mungkin menambal sendiri selama instalasi


Penulis palsu-template tidak punya waktu untuk memisahkan tes dari kode langsung, terutama karena ini mudah dilakukan dengan menambahkan komentar khusus di akhir baris tes:


 // : https://github.com/framp/fake-template/blob/master/index.js const template = (string, tag=defaultTag) => { if (mode !== 'literal') throw new Error('Invalid template') return (context={}) => tag(literals, ...expressions.map(evalInContext(context))) } assert.equal(template('')(), ``) // TEST assert.equal(template('abc')(), `abc`) // TEST const dog = 'Orlando' // TEST assert.equal(template('abc ${dog} lol ${cat}')({dog}), `abc ${dog} lol ${cat}`) // TEST 

Dan kemudian menghapusnya melalui sed :


 "postinstall": "sed -i '/\\/\\/ TEST/d' index.js" 

Sederhana dan elegan!


9. Paket dapat mengubah pengaturan npm


Menurut pendapat saya yang sederhana, package-json.lock adalah hal hebat yang dapat menyelamatkan Anda dari sejumlah masalah yang disebabkan oleh kelalaian pengembang lain. Namun, beberapa penentang gagasan ini memiliki argumen yang cukup bagus:


 "preinstall": "npm config set package-lock false" 

10. Dia dapat mengubah latar belakang desktop Anda pada foto Nicolas Cage


gambar


Berikut ini tautan, untuk berjaga-jaga - https://www.npmjs.com/package/cage-js . Mungkin bermanfaat untuk mendaftarkan paket ini sebagai berbahaya.


11. Paket ini dapat membuat Anda terguling


Inilah yang dilakukan oleh bara-data-reaksi , membuka video terkenal selama instalasi. Sayangnya, tidak mungkin mentransfer data dari Ember ke React dengan bantuannya - tidak ada satu baris kode javascript di dalamnya.


12. Mungkin tidak menginstal.


gambar
Ketergantungan yang tidak ada, versi yang tidak ditentukan, repositori pribadi yang telah tenggelam - Anda tidak dapat menginstal sekitar 0,6% dari semua paket dari repositori npm.


Alih-alih sebuah kesimpulan


Paket NPM dapat melakukan hal-hal aneh dengan sistem Anda, dan Anda tidak memiliki banyak opsi untuk melindungi dari ini. Gunakan package-lock.json untuk menghindari pembaruan yang tiba-tiba (dan pastikan bahwa tidak ada yang memutusnya tanpa sepengetahuan Anda), konfigurasikan CSP di frontend sehingga pintu belakang di modul pihak ketiga setidaknya tidak dapat menggabungkan data ke pembuatnya. Dan buat cadangan foto Anda, untuk jaga-jaga.


Jika Anda merasa memiliki kekuatan yang cukup untuk membenamkan diri dalam dunia indah paket npm - Anda dapat menemukan semua sumber di sini: https://github.com/malicious-packages/core . Utilitas ini penuh dengan peretasan dan solusi yang tidak optimal, tetapi mengatasi tugasnya. Ada juga dump MongoDB di repositori dengan hasil analisis lebih dari 180.000 paket, yang paling penting, jangan lupa untuk menambahkan filter {'reports.status': 'unverified'} . Saya tidak berencana untuk mengembangkan proyek ini lagi karena kurangnya waktu, tetapi saya akan mencoba membantu dengan semua pertanyaan dan masalah, jika ada.


Jaga diri Anda dan aplikasi Anda!

Source: https://habr.com/ru/post/id436132/


All Articles