Worm NPM Kembali dan Kali Ini Jauh Lebih Buruk (TanStack Diretas)

BBetter Stack
Computing/SoftwareManagementInternet Technology

Transcript

00:00:00Shai Hulud kembali dengan sekuel keempat.
00:00:02Kali ini sasarannya adalah paket seperti TanStack,
00:00:04hanya beberapa jam setelah saya mempublikasikan video tentang Next.js ini,
00:00:07yang kebetulan memiliki waktu yang sangat tepat.
00:00:08Ini sebenarnya adalah serangan rantai pasok NPM berskala besar
00:00:11yang berdampak lebih dari sekadar TanStack.
00:00:13Serangan ini juga menyerang paket seperti UiPath, Mistral,
00:00:15dan 160 paket lainnya,
00:00:17bahkan termasuk paket PyPy seperti Guardrails.ai.
00:00:20Yang membuat ini lebih menarik
00:00:22adalah adanya mekanisme Deadman switch,
00:00:24jadi jika ia mendeteksi Anda mengganti kunci curian Anda,
00:00:26ia akan menghapus seluruh isi PC Anda,
00:00:28dan bahkan memiliki muatan politik global di dalamnya.
00:00:30Mari kita bahas lebih dalam.
00:00:36Untuk sekuel ini, The Worm memiliki tujuan yang sama,
00:00:39mencuri kredensial dari mesin pengembang dan runner CI/CD,
00:00:42lalu menggunakan kredensial tersebut untuk mencapai paket lainnya.
00:00:44Untuk TanStack, itu berarti mempublikasikan 84 versi berbahaya
00:00:47di 42 paket TanStack hanya dalam beberapa menit.
00:00:51Sekarang, saya akan menjelaskan bagaimana mereka berhasil
00:00:52menginfeksi TanStack sejak awal,
00:00:54namun mari kita lihat apa yang dilakukan malware tersebut
00:00:56jika Anda menginstal salah satu paket yang terdampak.
00:00:58Di dalam paket berbahaya tersebut,
00:00:59Anda akan menemukan file baru bernama routerinit.js,
00:01:02serta dependensi opsional yang disuntikkan,
00:01:04yang mengarah ke tautan yang terlihat seperti
00:01:05tautan GitHub router TanStack yang sah,
00:01:08namun sebenarnya adalah commit yatim di fork penyerang.
00:01:10Ini hanyalah cara GitHub menangani tautan fork,
00:01:13jadi URL tersebut bisa terlihat
00:01:14seolah-olah milik proyek asli,
00:01:16meskipun commit tersebut sebenarnya berasal dari sebuah fork.
00:01:18Di dalam fork itu, ada skrip siklus hidup,
00:01:20prepare, yang menjalankan bun run task runner JS,
00:01:22dan memiliki perintah exit 1 di bagian akhir.
00:01:24Itu hanyalah cara cerdas untuk membuat dependensi opsional gagal
00:01:27setelah muatan telah dijalankan,
00:01:28sehingga instalasi tetap berjalan seperti biasa,
00:01:30dan meninggalkan jejak yang tidak terlalu mencolok di log instalasi Anda.
00:01:33Selain itu, Anda mungkin menyadari bahwa ini tidak menjalankan
00:01:35file routerinit.js yang saya sebutkan telah disuntikkan
00:01:37ke dalam paket di awal,
00:01:38tapi untuk saat ini, anggap saja kedua file ini
00:01:40memainkan peran yang sama dengan nama yang berbeda.
00:01:42Intinya adalah, saat Anda menginstal ini,
00:01:44skrip ini akan dijalankan.
00:01:46Hal pertama yang coba dilakukan skrip itu
00:01:47adalah memisahkan diri dari alur instalasi yang jelas,
00:01:50sehingga ia akan memeriksa apakah ia sudah berjalan
00:01:51di latar belakang, dan jika belum,
00:01:53ia akan membuat salinan terpisah dari dirinya sendiri
00:01:54dan keluar dari skrip utama dengan bersih.
00:01:57Dengan cara ini, log npm install Anda
00:01:58tidak menunjukkan output skrip tersebut
00:02:00karena malware tersebut sekarang telah memisahkan diri
00:02:01dari proses tersebut dan berjalan di latar belakang.
00:02:04Setelah ini, ia melakukan sesuatu yang sangat cerdik.
00:02:06Ia menulis salinan dirinya
00:02:07ke dalam direktori hook clawed code Anda,
00:02:08kemudian mengonfigurasi pengaturan clawed Anda
00:02:10untuk menjalankan hook ini kapan pun Anda menggunakan clawed code
00:02:12di proyek tersebut.
00:02:13Dengan cara ini, ia bisa bertahan setelah instalasi awal
00:02:16dan terus memicu setiap kali
00:02:17Anda membuka clawed code di proyek tersebut.
00:02:20Ia sebenarnya melakukan hal yang sama dengan task runner VS Code,
00:02:22menggandakan dirinya di sana,
00:02:23jadi jika Anda menggunakan fitur auto-run workspace VS Code,
00:02:26Anda akan mengalami masalah yang sama.
00:02:28Ia bahkan menyiapkan layanan tingkat OS
00:02:29bernama GitHub Token Monitor,
00:02:31tapi kita akan kembali ke hal itu
00:02:32karena itu sangat kejam.
00:02:34Juga cukup kejam
00:02:35bahwa Anda belum berlangganan.
00:02:37Hal berikutnya yang dilakukan muatan tersebut
00:02:38adalah mulai mencuri kredensial Anda,
00:02:40dan ia mencoba segalanya.
00:02:41Di GitHub Actions, ia mencari kredensial
00:02:43dan rahasia di lingkungan runner.
00:02:45Lebih khusus lagi, mengikis memori proses worker
00:02:47runner GitHub Actions
00:02:48untuk rahasia alur kerja Anda
00:02:50yang menyertakan rahasia yang disamarkan,
00:02:52dan bahkan menyisipkan alur kerja GitHub palsu yang terlihat seperti code QL
00:02:55yang menserialisasi rahasia repositori Anda
00:02:57dan mengeksfiltrasi mereka nanti.
00:02:58Ia juga mencari rahasia AWS,
00:03:00pertama-tama mencari variabel lingkungan
00:03:02dan file konfigurasi lokal,
00:03:03tetapi kemudian juga mencari layanan metadata AWS
00:03:06seperti IMDS v2 dan metadata tugas ECS.
00:03:09Untuk Kubernetes, ia mencuri token akun layanan
00:03:11dan sertifikat yang memungkinkan akses API dalam klaster
00:03:14sesuai dengan hak istimewa kontrol akses berbasis peran
00:03:17yang dimiliki akun layanan pod tersebut,
00:03:19yang dalam klaster yang dikonfigurasi dengan buruk
00:03:21bisa menjadi sangat luas,
00:03:22terkadang secara efektif menjadi admin.
00:03:24Dan untuk membuat itu lebih buruk,
00:03:25ia juga mencari HashiCorp Vault,
00:03:27mengumpulkan semua variabel lingkungan terkait vault
00:03:29dan token,
00:03:30kemudian menggunakan akses Kubernetes apa pun yang dimilikinya
00:03:32untuk mengambil semua rahasia yang dikelola vault Anda.
00:03:34Dan semua itu hanyalah apa yang dilakukannya
00:03:35terhadap penyebaran CI Anda.
00:03:37Jika itu ada di workstation Anda,
00:03:38ia akan mencari semua kunci SSH Anda,
00:03:39kredensial NPM Anda,
00:03:41kredensial Git Anda,
00:03:42riwayat shell,
00:03:43kredensial penyedia cloud,
00:03:44kunci kripto,
00:03:45Signal,
00:03:45Slack,
00:03:45dan file Discord.
00:03:46Dan di atas semua itu,
00:03:47ia mengekstrak riwayat sesi clawed code Anda.
00:03:49Jadi jika Anda pernah memberikan kredensial clawed
00:03:51atau membiarkannya membaca file yang berisi kredensial,
00:03:53ia memiliki akses ke kredensial tersebut juga.
00:03:55Jadi ya, seperti yang saya katakan,
00:03:56mereka mengincar benar-benar segalanya
00:03:57yang bisa mereka dapatkan,
00:03:58dan kemudian mereka akan mengeksfiltrasi data ini
00:04:00melalui jaringan pengirim pesan sesi.
00:04:02Dan sebagai cadangan,
00:04:02mereka juga menjatuhkan data curian ini
00:04:04ke repositori GitHub.
00:04:05Dan sesuai dengan tema semua serangan mereka,
00:04:07cabang-cabang ini dinamai berdasarkan referensi Dune.
00:04:09Jadi, ia sudah mendapatkan kredensial Anda.
00:04:11Tidak mungkin bisa lebih buruk lagi, bukan?
00:04:12Yah, ya.
00:04:13Ya, bisa saja.
00:04:14Di atas semua itu,
00:04:15jika Anda ingat layanan itu
00:04:16yang saya katakan ia siapkan di mesin Anda,
00:04:18nah, layanan itu memantau token GitHub Anda
00:04:19dan terus mengeksfiltrasi mereka kembali.
00:04:21Tapi juga setiap menit,
00:04:22ia memeriksa apakah token tersebut masih valid.
00:04:24Dan jika tidak,
00:04:25ia menjalankan RMRF pada direktori pengguna Anda,
00:04:27menghapus semuanya.
00:04:28Ia juga mencoba membuat token NPM
00:04:30dengan kredensial Anda,
00:04:31dengan deskripsi,
00:04:32jika Anda mencabut token ini,
00:04:33kami akan menghapus komputer pemiliknya,
00:04:35menyiratkan bahwa ia melakukan hal yang sama
00:04:36untuk token NPM juga.
00:04:38Jadi jika Anda mencabut token ini
00:04:39sebelum mengisolasi mesin Anda
00:04:40dan menghapus proses latar belakang itu,
00:04:42muatan tersebut bisa menghancurkan PC Anda sendiri,
00:04:44yang benar-benar sangat kejam.
00:04:46Dan sebagai catatan tambahan di sini,
00:04:47varian Python dari serangan ini
00:04:48melakukan hal yang kira-kira sama,
00:04:49tetapi juga menyertakan pemeriksaan
00:04:51untuk melihat apakah bahasa mesin Anda adalah bahasa Rusia.
00:04:53Jika ya,
00:04:53ia akan berhenti.
00:04:54Dan jika mesin Anda tampaknya
00:04:55berasal dari Israel atau Iran,
00:04:56ia akan menghasilkan angka acak
00:04:58antara 1 dan 6.
00:04:59Dan jika angka itu adalah 2,
00:05:00ia akan menjalankan perintah hapus yang destruktif
00:05:01dan mencoba memutar MP3
00:05:03dengan volume penuh.
00:05:04Sayangnya,
00:05:05saya tidak bisa mencari tahu
00:05:05apa MP3 itu.
00:05:07Bagaimanapun,
00:05:07sekarang setelah melakukan semua itu,
00:05:08hal terburuk masih akan datang
00:05:09karena itu baru tahap 1.
00:05:11Tahap 2 adalah propagasi diri
00:05:13dan itu adalah bagian paling berbahaya
00:05:15dari serangan ini.
00:05:16Pertama,
00:05:16ia akan mencari di mesin Anda
00:05:17untuk token NPM valid apa pun
00:05:19di mana ia bisa mempublikasikan
00:05:19tanpa autentikasi dua faktor.
00:05:21Dan jika ia menemukannya,
00:05:22ia akan memindai semua paket
00:05:24yang memiliki akses ke akun tersebut,
00:05:26lalu menggunakan kredensial tersebut
00:05:26untuk menambahkan dirinya ke paket-paket tersebut
00:05:28dan mempublikasikan versi terinfeksi yang baru.
00:05:30Itu jelas cukup buruk,
00:05:32tetapi Anda juga mungkin tidak seharusnya
00:05:33memiliki token yang dipublikasikan
00:05:33yang tergeletak
00:05:34yang bisa melewati
00:05:35otentikasi dua faktor.
00:05:36Jadi versi yang jauh lebih menakutkan dari ini
00:05:38adalah apa yang terjadi
00:05:39ketika ia berjalan di dalam CI-CD Anda.
00:05:41Karena di dalam CI,
00:05:42penyerang tidak butuh
00:05:43token NPM yang tahan lama
00:05:44karena pengaturan yang baik
00:05:45sering mengandalkan OIDC,
00:05:47yang dimaksudkan agar lebih aman.
00:05:48Intinya,
00:05:49alih-alih menyimpan
00:05:50token NPM sebagai rahasia,
00:05:51GitHub Actions membuktikan kepada NPM,
00:05:53hei,
00:05:53saya adalah repo ini
00:05:54yang menjalankan alur kerja ini
00:05:55di cabang ini,
00:05:56dan NPM kemudian memberikannya
00:05:57token publikasi jangka pendek.
00:05:59Masalahnya, namun,
00:06:00adalah jika skrip mendapatkan akses
00:06:01ke lingkungan GitHub Actions yang tepercaya,
00:06:03ia bisa berdiri di tempat yang sama
00:06:04sebagai penerbit yang sah.
00:06:06Jadi malware bisa menggunakan
00:06:07lingkungan terkait OIDC
00:06:08yang diekspos GitHub ke pekerjaan tersebut
00:06:10untuk meminta token OIDC JWT
00:06:12dari titik akhir token GitHub,
00:06:14kemudian menukar token JWT itu
00:06:16dengan NPM
00:06:17untuk mendapatkan token publikasi jangka pendek
00:06:18melalui sistem publikasi
00:06:19yang tepercaya dari NPM,
00:06:20dan sekarang ia bisa menerbitkan
00:06:22tanpa pernah mencuri
00:06:22token NPM permanen
00:06:24dan terlihat sepenuhnya sah.
00:06:26Dalam kasus ini,
00:06:26malware membundel salinan
00:06:27file router init.js itu
00:06:29ke dalam tabel paket,
00:06:30kemudian menambahkan dependensi
00:06:31opsional yang berbahaya,
00:06:32lalu menerbitkan semuanya
00:06:33sebagai tag terbaru
00:06:34untuk paket itu,
00:06:35jadi ketika seseorang
00:06:35atau beberapa pipeline CI-CD
00:06:37menginstal paket-paket itu,
00:06:38lingkaran itu dimulai lagi,
00:06:40menyebar sejauh
00:06:40yang ia bisa.
00:06:42Jadi itu semua
00:06:42cukup gila, bukan?
00:06:43Tapi sekarang mari fokus
00:06:44pada pasien nol,
00:06:46TanStack.
00:06:46Bagaimana mereka terinfeksi
00:06:47sejak awal?
00:06:48Yah,
00:06:49menurut post-mortem mereka sendiri,
00:06:50penyerang menyalahgunakan
00:06:51pipeline GitHub Actions tersebut.
00:06:53Mereka memulainya sehari
00:06:53sebelum paket berbahaya
00:06:54benar-benar diterbitkan,
00:06:56di mana mereka membuat fork
00:06:57dari TanStack router,
00:06:58tapi mereka sebenarnya mengganti nama
00:06:59ini menjadi configuration
00:06:59untuk mencoba dan membuatnya lebih sulit
00:07:01ditemukan jika Anda mencari
00:07:02melalui nama fork yang jelas.
00:07:04Kemudian mereka menambahkan
00:07:04commit berbahaya
00:07:05ke fork ini,
00:07:06yang mereka buat seolah-olah penulisnya
00:07:07adalah Claude,
00:07:07dan memiliki pesan commit
00:07:08yang diawali
00:07:09oleh skip CI,
00:07:10agar tidak langsung
00:07:11menjalankan CI pada peristiwa push.
00:07:13Keesokan harinya,
00:07:13mereka kemudian membuka PR
00:07:14terhadap TanStack router
00:07:15yang disebut Work in Progress
00:07:16Simplify History Build.
00:07:18Dan di sinilah
00:07:18serangan yang sebenarnya terjadi.
00:07:20TLDR-nya adalah
00:07:21TanStack memiliki alur kerja
00:07:22GitHub Actions untuk ukuran bundle
00:07:23yang menggunakan pull request target,
00:07:25dan itu patut dicatat
00:07:26karena pull request target
00:07:27sebenarnya berjalan
00:07:28dalam konteks keamanan
00:07:29repo basis,
00:07:30bukan fork.
00:07:31Itu berarti ia memiliki akses
00:07:32ke cakupan cache repo basis
00:07:33dan token GitHub-nya.
00:07:35Jadi alur kerja ini
00:07:35memeriksa PR tersebut,
00:07:36menginstal dependensinya,
00:07:38dan menjalankan build benchmark.
00:07:39Namun masalahnya adalah,
00:07:40fork itu berisi
00:07:40kode berbahaya.
00:07:41Dalam kasus ini,
00:07:42itu adalah skrip pengaturan V
00:07:43yang meracuni
00:07:44penyimpanan paket PMPM
00:07:45di bawah kunci cache yang tepat
00:07:47yang akan digunakan nanti
00:07:48oleh tindakan rilis.
00:07:49Mereka sebenarnya telah menghitung
00:07:50ini sebelumnya dari file kunci
00:07:51PMPM publik
00:07:52menggunakan rumus yang sama persis
00:07:54yang juga digunakan oleh alur kerja itu.
00:07:56Begitu cache yang diracuni itu
00:07:57disimpan,
00:07:57mereka sebenarnya mereset
00:07:58cabang itu kembali
00:07:59agar sesuai dengan
00:07:59cabang utama saat ini,
00:08:00jadi PR yang terlihat
00:08:01tampak seperti file nol
00:08:02no-op,
00:08:03dan kemudian mereka menutup PR itu
00:08:04dan menghapus
00:08:05cabang berbahaya itu.
00:08:06Jadi dari luar,
00:08:07terlihat seperti
00:08:07sama sekali tidak ada
00:08:08yang terjadi,
00:08:09tetapi mereka telah meracuni
00:08:10cache GitHub action itu.
00:08:11Ini berarti bahwa
00:08:12delapan jam kemudian,
00:08:13ketika seorang pemelihara biasa
00:08:14menggabungkan PR yang tidak terkait
00:08:15ke dalam utama,
00:08:16itu memicu alur kerja rilis
00:08:17TanStack,
00:08:18yang memulihkan
00:08:19cache PMPM yang diracuni,
00:08:20dan sekarang kode yang dikendalikan penyerang
00:08:22berjalan di dalam
00:08:23tindakan rilis itu.
00:08:24Itu kemudian menggunakan logika yang sama
00:08:25dengan OIDC
00:08:26untuk mendapatkan token publikasi NPM,
00:08:28dan berhasil menerbitkan
00:08:2984 versinya sendiri
00:08:30di 42 paket Tanstack,
00:08:32dan itu bahkan tidak perlu
00:08:33sampai ke langkah
00:08:34paket yang diterbitkan
00:08:35dari tindakan tersebut.
00:08:36Lucunya,
00:08:36tindakan itu sebenarnya gagal
00:08:37karena beberapa tes gagal,
00:08:39jadi tidak pernah mencapai langkah itu,
00:08:40tetapi kode berbahaya itu berjalan
00:08:41dan menerbitkan semuanya
00:08:43terlepas dari itu.
00:08:43Jadi penyerang berhasil
00:08:44merantai tiga batasan kepercayaan.
00:08:46Pertama,
00:08:47kode PR fork
00:08:47bisa meracuni
00:08:48cache repo basis,
00:08:49kemudian cache repo basis itu
00:08:51dipulihkan di dalam
00:08:52alur kerja rilis yang sebenarnya,
00:08:53kemudian alur kerja rilis yang sebenarnya
00:08:54memiliki izin OIDC,
00:08:56yang berubah menjadi
00:08:57akses publikasi NPM,
00:08:58jadi mereka bisa menerbitkan
00:08:59apa yang terlihat
00:08:59paket-paket yang sepenuhnya sah.
00:09:01Dan itulah yang saya pikir
00:09:02menjadi sangat menakutkan
00:09:03tentang serangan rantai pasokan.
00:09:05Mereka beralih
00:09:05dari mencuri
00:09:06token satu pemelihara
00:09:07menjadi menyalahgunakan
00:09:08seluruh sistem CI-CD itu sendiri,
00:09:10dan itu berarti
00:09:11bahwa semua sinyal kepercayaan kita
00:09:12mulai bekerja
00:09:13untuk penyerang.
00:09:14Ini adalah paket yang ditandatangani
00:09:15dengan bukti asal yang valid
00:09:16yang diterbitkan oleh alur kerja nyata.
00:09:18Jadi begitulah,
00:09:19itu adalah ShaiHalud4,
00:09:20dan jika Anda ingin memeriksa
00:09:21apakah Anda telah dikompromikan
00:09:21oleh salah satu paket ini,
00:09:23saya akan meninggalkan tautan
00:09:23ke postingan blog di bawah,
00:09:25yang akan mencakup
00:09:25bagaimana Anda bisa tahu
00:09:26dan apa yang bisa Anda lakukan
00:09:27jika Anda telah menginstal
00:09:28salah satunya.
00:09:29Beri tahu saya di kolom komentar
00:09:30apa pendapat Anda
00:09:30tentang semua ini
00:09:31dan ekosistem NPM,
00:09:33selagi Anda di sana,
00:09:33berlangganan,
00:09:34dan seperti biasa,
00:09:34sampai jumpa di video berikutnya.

Key Takeaway

Penyerang menyalahgunakan alur kerja GitHub Actions dan cache PMPM yang teracuni untuk mempublikasikan 84 paket TanStack berbahaya yang terlihat sah melalui sistem OIDC.

Highlights

  • Serangan rantai pasokan berskala besar ini menginfeksi 160 paket NPM dan PyPy termasuk TanStack, UiPath, serta Mistral.

  • Muatan malware menggunakan mekanisme deadman switch yang menghapus isi komputer jika korban mencoba mencabut kunci curian.

  • Setelah instalasi, malware memisahkan diri dari proses utama untuk berjalan di latar belakang tanpa meninggalkan jejak di log.

  • Malware mencuri kredensial SSH, NPM, Git, cloud provider, serta riwayat sesi dari Claude Code, Signal, Slack, dan Discord.

  • Penyerang meracuni cache GitHub Actions untuk mendapatkan token publikasi OIDC yang sah dan menerbitkan 84 versi berbahaya pada 42 paket TanStack.

  • Varian Python serangan ini melakukan pemeriksaan lokasi; jika mesin berbasis di Rusia, serangan akan berhenti, sementara mesin di Israel atau Iran berisiko tinggi mengalami penghapusan data destruktif.

Timeline

Mekanisme dan Dampak Malware

  • Serangan rantai pasokan ini menargetkan lebih dari 160 paket perangkat lunak di ekosistem NPM dan PyPy.
  • Malware memanfaatkan dependensi opsional yang disuntikkan dan commit yatim untuk menjalankan skrip berbahaya saat instalasi.
  • Proses infeksi mencakup persistensi melalui hook Claude Code dan VS Code untuk terus memicu aktivitas setiap kali proyek dibuka.

Serangan ini beroperasi dengan menyisipkan file routerinit.js dan dependensi berbahaya yang menyamar sebagai tautan GitHub sah. Malware menggunakan trik skrip siklus hidup 'prepare' yang sengaja gagal agar instalasi tetap berjalan normal tanpa memicu kecurigaan. Begitu aktif, malware memisahkan diri dari alur proses utama untuk menghindari deteksi di log instalasi.

Eksfiltrasi Kredensial dan Destruksi Data

  • Malware mengikis memori proses runner GitHub Actions untuk mencuri rahasia alur kerja dan kredensial AWS.
  • Akses ke Kubernetes digunakan untuk mengambil rahasia yang dikelola oleh HashiCorp Vault.
  • Mekanisme deadman switch akan menghapus seluruh direktori pengguna melalui perintah RMRF jika token yang dicuri dicabut oleh korban.

Target pencurian data meliputi hampir semua kredensial sensitif di workstation pengembang, termasuk kunci SSH dan token penyedia cloud. Data yang dicuri dikirimkan melalui jaringan pengirim pesan dan disalin ke repositori GitHub dengan referensi bertema Dune. Ancaman penghapusan paksa (wipe) menjadi aspek paling berbahaya bagi pengguna yang mencoba melakukan pembersihan tanpa isolasi mesin yang tepat.

Propagasi Diri melalui CI/CD

  • Malware mampu mempublikasikan versi berbahaya tanpa perlu token permanen dengan memanfaatkan autentikasi OIDC.
  • Penyerang meracuni cache PMPM dalam repositori basis melalui pull request yang tampak tidak berbahaya.
  • Logika serangan merantai tiga batasan kepercayaan: PR fork, cache repo basis, dan izin publikasi OIDC.

Bagian paling krusial adalah kemampuan malware untuk berdiri sebagai penerbit sah dengan menggunakan token JWT OIDC dari GitHub Actions. Dalam kasus TanStack, penyerang membuat PR yang meracuni cache PMPM, yang kemudian dipulihkan saat alur kerja rilis sah berjalan delapan jam kemudian. Hasilnya adalah distribusi paket berbahaya yang ditandatangani dengan bukti asal yang valid, menipu seluruh sinyal kepercayaan ekosistem.

Community Posts

No posts yet. Be the first to write about this video!

Write about this video