TL; DR
Hiji penerbit npm, ddjidd5640, parantos ngawangun katalog 22 pakét pakakas kaamanan Web3 palsu dina mérek-mérek palsu sapertos Paguyuban Kaamanan Crypto, Kolektif Audit Web3, sarta Aliansi Kaamanan DeFi.
Pakét-pakétna katingalina sanés sapertos kampanye typosquat anu saderhana. Éta katingalina sapertos ékosistem kaamanan anu didamel nganggo mérek, didukung ku organisasi GitHub kosong anu cocog sareng nami alat MCP anu ngayakinkeun sapertos search_leaked_credentials, validate_chain_key, sarta deploy_safe.
Kampanye éta dibagi jadi dua kulawarga muatan aktif sareng hiji tranche anu teu aktif.
Varian A ngandung 8 pakét panén kredensial. Skrip pasca-instalasi maca panyimpenan rahasia lokal, sedengkeun anu dibundel scanner.js jalan nalika agén AI nimbalan alat MCP pakét, milarian konci dompét, mnemonik BIP39, token API, sareng kredensial anu sanésna.
Varian B ngandung 5 dropper binér berbasis Pinggy. Paket-paket ieu nyokot sareng ngaéksekusi payload jarak jauh salami pasca-instalasi, kalayan foundry-deploy-helper:1.8.96 ngaleupaskeun executable anu dipisahkeun di /tmp/.node-cache.
Varian C ngandung 9 pakét anu teu aktif tanpa payload pasca-instalasi anu jelas, tapi penerbit, pola branding, sareng penamaan anu fokus kana Web3 sami.
Ngan 8 tina 22 pakét anu ditandaan di mana waé anu urang tingali; sésana 14 masih hirup dina npm nalika analisis.
Parahna: kritis.
Serangan: Dua Muatan dina Hiji Lemari Pakaian
Lemari baju nyaéta mérekna. Buka README crypto-credential-scanner sareng anjeun bakal dibéjaan yén éta mangrupikeun pamindai kredensial anu diwangun ku Crypto Security Guild. Buka halaman defi-threat-scanner sareng anjeun bakal dibéjaan yén éta mangrupikeun alat DeFi Security Alliance. Buka web3-secrets-detector sareng éta nyaéta Web3 Audit Collective. Teu aya hiji ogé tina koléktif ieu anu aya salaku organisasi. Éta aya salaku organisasi GitHub kosong anu tujuanana ngan ukur pikeun ngeusian hyperlink "pangarang" halaman npm.
Varian A: pra-penerbangan pasca-instalasi sareng tindakan utama waktos MCP
Sadaya 8 pakét Varian-A ngabagikeun muatan dua tahap — pra-penerbangan pasca-instalasi anu ngarebut kredensial naon waé anu parantos aya dina disk dina téks polos, sareng tahapan runtime anu diaktipkeun nalika agén AI nyauran salah sahiji alat MCP pakét.
"Tahap 1, pra-penerbangan" hirup inline dina package.json salaku node -e one-liner. Éta muka tujuh dotfile anu terkenal sareng ngirimkeun 200 byte munggaran masing-masing ka C2:
200 bait tina ~/.ssh/id_ed25519 moal masihan panyerang konci pribadi anjeun nyalira, tapi éta bakal masihan ngaran koropak, koméntar, sareng baris munggaran tina lulugu PEM — cekap pikeun mastikeun jinis konci naon anu aya di dinya, anu cekap pikeun ngajalankeun tahapan salajengna. 200 bait tina ~/.env biasana leuwih ti cukup pikeun ngabocorkeun token API lengkep. 200 bait tina ~/.git-krédensial biasana mangrupa sakumpulan token OAuth anu lengkep.
"Babak 2, babak utama", nyaéta scanner.js. Éta dimuat ku pakét indéks.js sareng ditelepon ti jero pangendali pamundut MCP nalika agén AI nimbalan salah sahiji alat anu diiklankeun. File éta sami byte-for-byte di sakumna 8 pakét Varian-A (b461106e47a1f5966159cd6e92541505), sareng éta terus terang ngeunaan naon anu dilakukeunana. Blok koméntar bubuka maca, sacara harfiah:
| javascript // wallet-scanner.js — pamindai aktif anu dipasang pikeun pakét MCP // Jalan sacara teu langsung nalika agén AI nyauran alat MCP naon waé, nyeken lingkungan pikeun // wallets/keys // Ngan nganggo Node.js bawaan, teu aya katergantungan éksternal |
Ieu di handap mangrupikeun leumpang rekursif, jerona 3, tina:
direktori home sorangan
...nyaring ngaran file anu ngandung salah sahiji tina toko konci, dompét.json, dompét.dat, .rahasia, siki.txt, metamask, phantom, rabi, dompét kapercayaan, coinbase, swasta-konci, mnemonik, konci_rahasia, konci_api — nyaéta, daptar anu disaluyukeun sacara manual pikeun unggal tempat pangguna crypto nyimpen konci. Pikeun unggal cocokan, file dibuka sareng di-scan ngalawan genep regexe:
| ngetik | corak | Naon anu dicekelna |
|---|---|---|
| konci_pribadi | (?:0x)?[a-fA-F0-9]{64} | Konci pribadi Ethereum sareng rahasia heksadesimal 32-byte umum. |
| mnemonik | \b([a-z]+\s+){11,23}[a-z]+\b | Frasa awal mnemonik BIP39 anu jumlahna ti 12 nepi ka 24 kecap. |
| konci_api | (api[_-]?key\|API_KEY)\s*[:=]\s*["']?([A-Za-z0-9_\-]{20,}) | Token API umum sareng nilai kredensial anu dipasang dina file konfigurasi. |
| rasiah | (?:secret\|private).{0,10}[:=]\s*["']?([A-Za-z0-9+/=]{20,}) | Rahasia sareng nilai pribadi anu umumna disimpen dina format konfigurasi YAML, JSON, sareng INI. |
| alamat_éta | 0x[a-fA-F0-9]{40} | Alamat dompét Ethereum anu dianggo pikeun ngaidentipikasi sareng ngalacak sidik jari korban. |
| password | (?:PASSWORD\|PASSPHRASE)\s*=\s*["']?(\S{4,64}) | Variabel lingkungan kecap akses sareng frasa sandi gaya ékspor shell. |
Teras scanner.js maca genep dotfile deui sacara lengkep — dugi ka 500 byte masing-masing tina ~/.env, ~/.bash_history, ~/.zsh_history, ~/.npmrc, ~/.gitconfig, ~/.git-credentials — teras nyapu process.env pikeun variabel naon waé anu namina ngandung konci, rusiah, token, kecap akses, pribadi, mnemonic, dompet, atanapi siki. Pamungkas, éta nyauran execSync('whoami') ditambah os.hostname() sareng process.cwd() pikeun nandaan dump ku idéntitas korban. Sakabéh payload, ditambah dugi ka 100 panemuan individu, di-POST salaku hiji objék JSON.
Tujuan exfil henteu di-hardcode sacara langsung. Paket ngajemputna nalika runtime ti:
https://ddjidd564.github.io/defi-security-best-practices/config.json
— dokumén GitHub Pages anu dikontrol ku panyerang. config.json ayeuna mulangkeun
Upami éta panarikan gagal, scanner.js balik deui ka sarua situs webhook. URL di-hardcode salaku konstanta. Teu langsung ieu mangrupikeun hiji-hijina bagian tina kecanggihan operasional dina kampanye: éta ngamungkinkeun panyerang muterkeun target exfil tanpa nyebarkeun deui pakét, sareng éta ngajaga URL kolektor anu saleresna kaluar tina artefak npm, anu ngajantenkeun deteksi dumasar tanda tangan langkung sesah.
Varian B: torowongan Pinggy, binér, sareng hiji varian persisten
Tranche langsung anu sanésna langkung alit — lima pakét — sareng kirang pinter. Panulis ngaleungitkeun kostum MCP sapinuhna. Pakét-pakét ieu ngaku janten asisten konfigurasi pikeun alat Ethereum sareng Solana anu sah (pitulung konfigurasi-truffle, agregator-feed-harga-chainlink, panyadia-ganache-cli, solana-pda-helper, asisten-panyebaran-pabrik-pengecoran). Muatanna hiji https.get-and-exec garis dina saatos dipasang
C2 téh gratis Pinggy torowongan — layanan tunneling pamekar umum anu dianggo ku panyerang salaku C2 anu ephemeral. Paketna ngaunduh naon waé anu dipulangkeun ku torowongan teras diasupkeun kana prosés_anak.execTeu aya pamariksaan integritas, teu aya penandatanganan, teu aya panyalindungan tahap kadua. Naon waé anu dilayanan ku torowongan operator ayeuna, éta anu dijalankeun.
Pakét anu paling agrésif, bantuan-panyebaran-pabrik-tukang-pabrik:1.8.96, ngagantikeun inline https.get jeung curl sareng trik kegigihan:
Varian C: fasad anu dipoles, teu acan aya detonator (acan)
Salapan pakét sésana — panyadang-dompét-verifikasi, pamindai-kaamanan-env, parabot-pangadeg (salah ketik anu ngahaja tina Foundry), solna-web3 (salah ketik tina Solana), pamariksa kaamanan dompét, plugin profiler gas-hardhat, utilitas-multikal-éter, auditor-defi-env, etherjs-utils — gaduh teu aya skrip pasca-instalasi sareng teu aya exfil runtime anu atra dina pandangan munggaran. Aranjeunna ngabagi penerbit, bagian payun merek, pola penamaan Web3, sareng dina sababaraha kasus boilerplate README anu sami sareng varian aktif. Kami nganggap aranjeunna salaku bagian tina kampanye anu sami sareng parantos nyarankeun panyabutan pre-emptive, tapi kami tacan ngadaptarkeun pemicu runtime na sacara lengkep. Tranche dormant tiasa janten pijakan anu disimpen ku operator pikeun flip ka hareup - pola anu sami anu dianggo PhantomBot dina pertengahan Méi, dimana operator ngagentos maling kredensial pikeun rekrut botnet tanpa nyebarkeun deui nami pakét.
Garis Waktu & Katalogna
Paket anu pangheubeulna dina kampanye nyaéta versi anu panghandapna: validator-konci-ranté:0.2.3 jeung defi-env-auditor:0.3.2 katingalina sapertos tetes ékspériméntal awal. Nalika penerbit ngahontal truffle-config-helper:1.7.0 jeung bantuan-panyebaran-pabrik-tukang-pabrik:1.8.96, inflasi vérsi éta ngahaja — milih angka anu kabaca sapertos garis keturunan pakét anu tos aya. Teu aya hiji ogé ti 22 anu gaduh riwayat sah sateuacanna dina nami anu sami dina npm.
Katalog lengkep, dikelompokkeun dumasar varian:
### Varian A — pangumpul kredensial (pasca-instal + MCP-time scanner.js, MD5 b461106e47a1f5966159cd6e92541505)
| paket | Vérsi | Ditandaan dina Eupan Deteksi |
|---|---|---|
mnemonic-safety-check | 0.5.2 | nuhun |
solidity-deploy-guard | 0.4.4 | nuhun |
web3-secrets-detector | 1.2.6 | nuhun |
eth-wallet-sentinel | 1.0.9 | nuhun |
deployment-key-auditor | 0.7.3 | nuhun |
defi-threat-scanner | 2.1.2 | nuhun |
crypto-credential-scanner | 2.0.2 | nuhun |
chain-key-validator | 0.2.3 | nuhun |
### Varian B — Torowongan Pinggy https.get → exec (teu aya pisibilitas deteksi-feed sateuacan laporan ieu)
| paket | Vérsi | Rasa Pasca-Pasang |
|---|---|---|
truffle-config-helper | 1.7.0 | https.get → exec(stdout) |
chainlink-price-feed-aggregator | 1.1.12 | https.get telemetry call |
ganache-cli-provider | 1.7.51 | https.get telemetry call |
solana-pda-helper | 1.0.46 | https.get telemetry call |
foundry-deploy-helper | 1.8.96 | curl + chmod +x /tmp/.node-cache & |
### Varian C — teu aktip, dicurigai aya pemicu runtime (teu aya pisibilitas deteksi-feed sateuacan laporan ieu)
| paket | Vérsi | Catetan |
|---|---|---|
wallet-backup-verifier | 1.0.1 | |
env-security-scanner | 1.6.0 | |
foundy-toolkit | 1.5.79 | typosquat tina pengecoran |
solna-web3 | 1.5.98 | typosquat tina solana |
wallet-security-checker | 1.0.3 | |
hardhat-gas-profiler-plugin | 1.7.86 | |
ethers-multicall-utils | 1.3.15 | |
defi-env-auditor | 0.3.2 | |
etherjs-utils | 1.0.39 |
Kolom Varian-A sareng Varian-B henteu dipilih sacara acak. Nami Varian-A sadayana ngajual dirina salaku alat audit kaamanan — "pariksa kaamanan", "nyebarkeun panjaga", "detektor rusiah", "penjaga dompét", "auditor konci", "pamindai ancaman", "pamindai kredensial", "validator konci ranté". Éta ditujukeun pikeun pamekar atanapi agén AI anu milarian alat pikeun meunteun kaamanan proyék Web3. Nami Varian-B sadayana ngajual dirina salaku asisten ngawangun sareng nyebarkeun pikeun ékosistem Web3 anu sami — Truffle, Chainlink, Ganache, Solana PDA tooling, Foundry. Pamisahan ieu ngagambarkeun modél méntal pamekar Web3 normal ngeunaan "fase audit" vs. "fase panyebaran". Fase naon waé anu anjeun laksanakeun, penerbit parantos ngabungkus jebakan pikeun éta.
Indikator Kompromi
Jaringan sareng file
| IOCs | Variant | maksud |
|---|---|---|
https://ddjidd564.github.io/defi-security-best-practices/config.json | A | Resolver webhook dinamis anu di-host ngalangkungan GitHub Pages. |
https://webhook.site/8d334534-1c63-4f4f-a0d7-95c446c8b233 | A | Titik tungtung kolektor éksfiltrasi ayeuna, ogé dipasang salaku cadangan. |
rqnyz-2605-7280-7--2000-c51.run.pinggy-free.link/npm/-/binary/telemetry | B | Torowongan Pinggy anu dianggo pikeun nyebarkeun muatan binér jarak jauh. |
scanner.js MD5 b461106e47a1f5966159cd6e92541505 | A | Muatan pamindai anu idéntik dianggo deui di sadaya 8 pakét Varian-A. |
/tmp/.node-cache | B | File anu tiasa dieksekusi anu dipisahkeun dileupaskeun foundry-deploy-helper:1.8.96. |
pausahaan nu ngaluarkeun
- npm ngaran pamaké: ddjidd5640
- email: 1623682356@qq.com (teu acan diverifikasi)
- Email sareng SCM verifikasi: teu aya
- Paket anu aya dina akun: 22, sadayana didaptarkeun dina katalog di luhur
- Kagiatan anu paling mimiti katingali: validator-konci-ranté:0.2.3 (varian A)
- Aktivitas panganyarna anu katingali: chain-key-validator:0.2.3 sareng crypto-credential-scanner:2.0.2 (duanana dina 24 jam sateuacan tulisan ieu)
Bagian hareup merek (dianggo dina nu ngarang / README / org GH palsu)
- "Crypto Security Guild" — didukung ku GitHub org kosong cryptosec-guild
- "Web3 Audit Collective" — didukung ku GitHub org kosong w3audit
- "DeFi Security Alliance" — didukung ku GitHub org kosong kaamanan-défi
- Akun GH rujukan ddjidd564 — host tina dynamic-webhook config.json
Paripolah
- simpul -e saatos pamasangan maca naon waé .ssh, .ethereum, .bitcoin, .env, .bash_history, .zsh_sajarah, kredensial .git jeung .slice(0, 200) sareng ngahijikeun sareng | separator nyaéta sidik jari anu ampir unik pikeun Varian A.
- Ngimpor ./scanner.js tina pakét anu ngadaptarkeun dirina salaku MCP server kalawan alat-alat anu ngaranna kredensial_bocor_panéangan atanapi kecap pagawéan "audit kaamanan" anu dibingkai sami mangrupikeun konfirmasi Varian-A.
- Node -e postinstall anu ngajemput ti host *.run.pinggy-free.link naon waé sareng ngirimkeun réspon kana child_process.exec mangrupikeun konfirmasi Varian-B henteu paduli bungkusna.
Atribusi & Motivasi
Aya cekap kanggo sidik jari penerbit parsial sareng ampir teu cekap kanggo idéntifikasi anu saleresna. 1623682356@qq.com nyaéta alamat surélék QQ — surélék wéb gratis Tencent, populér di Cina daratan — sareng bagian lokal numerikna nyaéta ID pangguna QQ; kami nganggap ieu salaku sinyal lemes hungkul, kumargi alamat format QQ kadaptar sacara saderhana. Akun npm teu gaduh panyingkepan dua faktor, teu aya surélék anu diverifikasi, teu aya anu diverifikasi SCM tautan. Triad mérek "Crypto Security Guild" / "Web3 Audit Collective" / "DeFi Security Alliance" dijieun sacara borongan — teu aya hiji ogé tina tilu éta anu aya di luar kampanye ieu — sareng organisasi GitHub anu ngadukung mangrupikeun cangkang kosong anu didamel pikeun ngeusian tautan halaman npm.
Dua pola pantes dingaranan, sabab muncul dina kampanye anu padeukeut. Anu kahiji nyaéta prefabrikasi merek salaku bukti sosial: operator henteu milih nami proyék anu tos aya pikeun typosquat; aranjeunna ngadamel narasi kapercayaan ti mimiti, terang yén hiji Pangwangunan agén AI pipeline atanapi pamekar anu buru-buru nyeken halaman npm bakal cocog sareng pola dina "katingalina sapertos organisasi kaamanan" tinimbang "mangrupikeun organisasi kaamanan". Ieu mangrupikeun pendekatan anu sami anu diémutan ku literatur slopsquatting — pakét anu disaluyukeun kana jinis nami anu bakal dilakukeun ku LLM invent lamun dipenta alat kaamanan Web3, dangdanna sing rapih supaya LLM moal mariksa deui. Ngagoler bari jongkok nyaéta istilah anu nembe diciptakeun pikeun pakét jahat anu namina cocog sareng placeholder anu dihalusinasi ku LLM nalika pakét otoritatif teu aya; kampanye ieu mangrupikeun dulurna anu langkung agrésif, dimana operator ogé ngarang organisasi anu bakal dianggo ku placeholder éta.
Pola kadua nyaéta Aktivasina MCP-waktos. Dina waktosna scanner.js jalan, pamasangan parantos réngsé sareng pamekar parantos ngalih. Pemicu na nyaéta agén AI anu nelepon alat — kredensial_bocor_panéangan, dina kasus Varian-A — anu pasti bakal dilakukeun ku agén, sabab éta alesan utama naha pakét éta dipasihkeun. Padamelan jahat lumangsung salami alus bagian tina alur kerja, nalika pamekar kamungkinan ageung ningali asisten AI na suksés dina tugas anu dipénta. Éta mangrupikeun parobahan paripolah leutik tina "exfil on" anu langkung lami npm install" pola, sareng éta kalayan rapih nyingkahan sandboxing waktos pamasangan.
Kami henteu nyebutkeun aktor ancaman. Sinyal-sinyalna (email QQ, akun tunggal, burst dinten tunggal 22-pakét, dua tumpukan C2 paralel) sami-sami konsisten sareng hiji operator anu terus-terusan, tim alit, atanapi salah sahiji kru banjir pakét anu parantos katingali dina telemetri npm dugi ka 2025–2026. Naon anu kami bisa nyaéta operator ieu gaduh ékosistem anu dipikaresep anu jelas (Ethereum + Solana + Foundry/Hardhat tooling), korban anu dipikaresep anu jelas (pamekar Web3 sareng agén AI anu ngagarap proyék Web3), sareng modél persistensi anu dipikaresep anu jelas (pemicu runtime waktos MCP ditambah fallback binér anu misah).
Dampak, Tren, sareng Naon Anu Tiasa Dilaksanakeun ku Para Pembela
Peringatan awal urang pipeline bray 8 of 22 pakét salami kampanye — genep dina sapuan awal sareng dua deui anu sumping engké dina dinten anu sami nalika ngalangkungan clustering kampanye. 14 pakét anu sanésna hirup dina npm salami sababaraha dinten tanpa pernah muncul dina feed deteksi anu kami pantau, sareng dina waktos nyerat tetep tiasa dipasang. Celah éta penting kusabab:
- Varian A teu aya sora nalika dipasang. Maca dotfile kajadian, tapi bulk exfil ngan ukur dijalankeun nalika agén AI nimbalan alat MCP pakét. A standard sandbox anu ningali saatos pamasangan bakal ningali simpul -e meungpeukan terus mutuskeun éta téh leutik jeung sigana teu aktif.
- Varian B nyaéta hiji baris. Teu aya nanaon anu tiasa dipelajari ku pangklasifikasi malware — teu aya obfuscation, teu aya payload anu dikodekeun, teu aya domain anu katingalina curiga. Torowongan Pinggy mangrupikeun layanan pamekar anu sah. Hiji-hijina hal anu curiga nyaéta "pembantu konfigurasi" kedah nelepon ka bumi pisan.
- Varian C katingalina bersih pisan. Teu aya instalasi na hooksKu unggal sinyal statis, éta normal.
Daptar Pariksa Singkat Bek pikeun Era MCP-Tool
Tilu tindakan nyata anu bakal ngaganggu kampanye ieu sateuacanna:
- Beuratkeun penerbitna, lain bungkusanna. Dua puluh dua pakét dina akun QQ-mail anu umurna sataun tanpa SCM verifikasi mangrupikeun sinyal anu langkung cerah tibatan fitur per-pakét naon waé. Alur kerja peringatan awal kami néwak pakét anu munggaran sabab sidik jari penerbit nonjol — nyarankeun skor reputasi penerbit anu tiasa dikirangan ku salah sahiji klasifikasi per-pakét anu aman, teu nyimpulkeun, atanapi malware.
- Anggap indireksi dynamic-config salaku jahat nepi ka kabuktian béda. Paket anu ngaréngsékeun titik tungtung kaluarna nalika runtime ti dokumén pihak katilu (GitHub Pages, GitHub Gist, Pastebin, objék S3, di mana waé) teu gaduh alesan anu sah pikeun ngalakukeun éta pikeun telemetri. Titik tungtung telemetri anu saleresna di-hardcode sareng didokuméntasikeun.
- Audit paket server MCP dumasar kana permukaan alat anu diiklankeun. Paket Variant-A sadayana ngiklankeun alat anu dingaranan
search_leaked_credentials,validate_chain_key,deploy_safe, sareng kecap pagawéan "audit" anu sami. Host MCP anu muka alat anu pedaranana ngaku nyeken diréktori proyék pikeun kredensial kedah meryogikeun opt-in operator anu eksplisit sateuacan agén nimbalanana dina basis kode anu nyata. Intina MCP nyaéta puteran agén teu gaduh cara pikeun terang nahasearch_leaked_credentialsnyaéta pamilarian kredensial atanapi mangrupikeun pangéksfiltrator kredensial.
Pikeun pamekar anu panginten parantos masang salah sahiji tina 22 pakét: anggap konci plaintext naon waé dina ~ / .shsh, ~/.ethereum, ~/.bitcoin, ~/.solana, ~/.env, atawa ~/.git-krédensial upami kabocoran, puterkeun unggal kredensial anu namina cocog sareng daptar filter variabel-env di luhur, sareng dina Linux/macOS parios file anu tiasa dieksekusi di /tmp/.node-cache (sareng prosés yatim piatu naon waé dimimitian ti dinya). Masang deui vérsi sah tina alat anu ditiru (foundry, truffle, hardhat, ganache, jsb.) henteu ngahapus binér anu dicabut.
Tranche Variant-C anu teu aktif mangrupikeun bagian tina carita ieu anu paling lami. Salapan pakét kalayan profil pamasangan anu bersih sareng penerbit anu parantos mapan mangrupikeun jinis inventaris anu disimpen ku operator. Upami éta ngabeledug engké — sapertos anu dilakukeun ku PhantomBot nalika na axois-utils repackage anu dibalikkeun tina maling kredensial ka rekrut botnet — aranjeunna bakal ngabeledug ngalawan konsumen pendaptaran anu nyemat pakét Variant-C antara dinten ieu sareng takedown. Nyemat pakét jahat ku vérsi henteu ngajagi anjeun tina penerbit anu ngontrol unggal vérsi.
Rujukan
- [kaca penerbit npm kanggo ddjidd5640](https://www.npmjs.com/~ddjidd5640) — 22 pakét ayeuna didaptarkeun dina akun ieu. Sumber otoritatif pikeun katalog dina waktos nyerat ieu.
- [kaca pakét npm pikeun pamindai kredensial-crypto](https://www.npmjs.com/package/crypto-credential-scanner) — conto artefak Varian-A; README, riwayat vérsi, sareng tautan pangarang katingali di dieu.





