ΠΡΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΠΈ Π¦Π΅Π½ΡΡΠ° ΠΠ΅Π»ΡΠΌΠ³ΠΎΠ»ΡΡΠ° ΠΏΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ (CISPA) ΠΈ ΠΠΎΡΠΎΠ»Π΅Π²ΡΠΊΠΎΠ³ΠΎ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΈΠ½ΡΡΠΈΡΡΡΠ° (Π¨Π²Π΅ΡΠΈΡ) ΠΏΡΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π»ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΠΎΡΡΡ ΡΠ΅Ρ Π½ΠΈΠΊΠΈ Π·Π°ΡΠΎΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΡΠΎΡΠΈΠΏΠ° ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² JavaScript («prototype pollution») Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π°ΡΠ°ΠΊ Π½Π° ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ Node.js ΠΈ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π° Π΅Ρ ΠΎΡΠ½ΠΎΠ²Π΅, ΠΏΡΠΈΠ²ΠΎΠ΄ΡΡΠΈΡ ΠΊ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ΄Π°.
ΠΠ΅ΡΠΎΠ΄ Π·Π°ΡΠΎΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΡΠΎΡΠΈΠΏΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡ ΡΠ·ΡΠΊΠ° JavaScript, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π½ΠΎΠ²ΡΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π° Π² ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΉ ΠΏΡΠΎΡΠΎΡΠΈΠΏ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°. Π ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ ΠΌΠΎΠ³ΡΡ Π²ΡΡΡΠ΅ΡΠ°ΡΡΡΡ Π±Π»ΠΎΠΊΠΈ ΠΊΠΎΠ΄Π° (Π³Π°Π΄ΠΆΠ΅ΡΡ), Π½Π° ΡΠ°Π±ΠΎΡΡ ΠΊΠΎΡΠΎΡΡΡ Π²Π»ΠΈΡΠ΅Ρ ΠΏΠΎΠ΄ΡΡΠ°Π²Π»Π΅Π½Π½ΠΎΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΠΊΠΎΠ΄Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ Π²ΠΈΠ΄Π° ‘const cmd = options.cmd || «/bin/sh»‘, Π»ΠΎΠ³ΠΈΠΊΠ° ΡΠ°Π±ΠΎΡΡ ΠΊΠΎΡΠΎΡΠΎΠΉ Π±ΡΠ΄Π΅Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π°, Π΅ΡΠ»ΠΈ Π°ΡΠ°ΠΊΡΡΡΠΈΠΉ ΡΡΠΌΠ΅Π΅Ρ ΠΏΠΎΠ΄ΡΡΠ°Π²ΠΈΡΡ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ «cmd» Π² ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΉ ΠΏΡΠΎΡΠΎΡΠΈΠΏ.
ΠΠ»Ρ ΡΡΠΏΠ΅ΡΠ½ΠΎΠ³ΠΎ ΡΠΎΠ²Π΅ΡΡΠ΅Π½ΠΈΡ Π°ΡΠ°ΠΊΠΈ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ, ΡΡΠΎΠ±Ρ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΏΠΎΡΡΡΠΏΠ°ΡΡΠΈΠ΅ ΠΈΠ·Π²Π½Π΅ Π΄Π°Π½Π½ΡΠ΅ ΠΌΠΎΠ³Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠ²ΠΎΠΉΡΡΠ²Π° Π² ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΌ ΠΏΡΠΎΡΠΎΡΠΈΠΏΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΡΠΎΠ±Ρ Π² Ρ ΠΎΠ΄Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π²ΡΡΡΠ΅ΡΠ°Π»ΡΡ Π³Π°Π΄ΠΆΠ΅Ρ, Π·Π°Π²ΠΈΡΡΡΠΈΠΉ ΠΎΡ ΠΈΠ·ΠΌΠ΅Π½ΡΠ½Π½ΠΎΠ³ΠΎ ΡΠ²ΠΎΠΉΡΡΠ²Π°. ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΡΠΎΡΠΈΠΏΠ° ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ Π² Node.js ΡΠ»ΡΠΆΠ΅Π±Π½ΡΡ ΡΠ²ΠΎΠΉΡΡΠ² «__proto__» ΠΈ «constructor». Π‘Π²ΠΎΠΉΡΡΠ²ΠΎ «__proto__» Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΏΡΠΎΡΠΎΡΠΈΠΏ ΠΊΠ»Π°ΡΡΠ° ΠΎΠ±ΡΠ΅ΠΊΡΠ°, Π° ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ «constructor» Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°.
ΠΡΠ»ΠΈ Π² ΠΊΠΎΠ΄Π΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π²ΡΡΡΠ΅ΡΠ°Π΅ΡΡΡ ΠΏΡΠΈΡΠ²ΠΎΠ΅Π½ΠΈΠ΅ «obj[a][b] = value» ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π²ΡΡΡΠ°Π²Π»ΡΡΡΡΡ ΠΈΠ· Π²Π½Π΅ΡΠ½ΠΈΡ Π΄Π°Π½Π½ΡΡ , Π°ΡΠ°ΠΊΡΡΡΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΡΡΠ°Π²ΠΈΡΡ «a» Π² Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ «__proto__» ΠΈ Π΄ΠΎΠ±ΠΈΡΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΡΠ²ΠΎΠ΅Π³ΠΎ ΡΠ²ΠΎΠΉΡΡΠ²Π° Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ «b» ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ «value» Π² ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΌ ΠΏΡΠΎΡΠΎΡΠΈΠΏΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ° (obj.__proto__.b = value;), ΠΏΡΠΈ ΡΡΠΎΠΌ Π²ΡΡΡΠ°Π²Π»Π΅Π½Π½ΠΎΠ΅ Π² ΠΏΡΠΎΡΠΎΡΠΈΠΏΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ Π±ΡΠ΄Π΅Ρ Π²ΠΈΠ΄Π½ΠΎ Π²ΠΎ Π²ΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°Ρ . ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ Π΅ΡΠ»ΠΈ Π² ΠΊΠΎΠ΄Π΅ Π²ΡΡΡΠ΅ΡΠ°ΡΡΡΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ Π²ΠΈΠ΄Π° «obj[a][b][c] = value», Π²ΡΡΡΠ°Π²ΠΈΠ² «a» Π² Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ «constructor», Π° «b» Π² «prototype» Π²ΠΎ Π²ΡΠ΅Ρ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°Ρ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π½ΠΎΠ²ΠΎΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ «c» ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ «value».
ΠΡΠΈΠΌΠ΅Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΏΡΠΎΡΠΎΡΠΈΠΏΠ°: const o1 = {}; const o2 = new Object () ; o1.__proto__.x = 42; // ΡΠΎΠ·Π΄Π°ΡΠΌ Π² ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΌ ΠΏΡΠΎΡΠΎΡΠΈΠΏΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ «x» console.log (o2.x); // ΠΎΠ±ΡΠ°ΡΠ°Π΅ΠΌΡΡ ΠΊ ΡΠ²ΠΎΠΉΡΡΠ²Ρ «x» ΠΈΠ· Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° // Π½Π° Π²ΡΡ ΠΎΠ΄Π΅ ΠΏΠΎΠ»ΡΡΠΈΠΌ 42, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΠ΅ΡΠ΅Π· ΠΎΠ±ΡΠ΅ΠΊΡ o1 Π±ΡΠ» ΠΈΠ·ΠΌΠ΅Π½ΡΠ½ ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΉ ΠΏΡΠΎΡΠΎΡΠΈΠΏ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ ΠΈ Π² ΠΎΠ±ΡΠ΅ΠΊΡΠ΅ o2
ΠΡΠΈΠΌΠ΅Ρ ΡΡΠ·Π²ΠΈΠΌΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°: function entryPoint (arg1, arg2, arg3){ const obj = {}; const p = obj[arg1]; p[arg2] = arg3; return p; }
ΠΡΠ»ΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ entryPoint ΡΠΎΡΠΌΠΈΡΡΡΡΡΡ ΠΈΠ· Π²Ρ ΠΎΠ΄Π½ΡΡ Π΄Π°Π½Π½ΡΡ , ΡΠΎ Π°ΡΠ°ΠΊΡΡΡΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π² arg1 Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ «__proto__» ΠΈ ΡΠΎΠ·Π΄Π°ΡΡ Π² ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΌ ΠΏΡΠΎΡΠΎΡΠΈΠΏΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ Ρ Π»ΡΠ±ΡΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ. ΠΡΠ»ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π² arg2 Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ «toString», Π° Π² arg3 — 1, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ «toString» (Object.prototype.toString=1) ΠΈ Π΄ΠΎΠ±ΠΈΡΡΡΡ ΠΊΡΠ°Ρ Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ toString().
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΡΠΈΡΡΠ°ΡΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ΄Π° Π°ΡΠ°ΠΊΡΡΡΠ΅Π³ΠΎ, ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠ²ΠΎΠΉΡΡΠ² «main», «shell», «exports», «contextExtensions» ΠΈ «env». ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π°ΡΠ°ΠΊΡΡΡΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ·Π΄Π°ΡΡ Π² ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΌ ΠΏΡΠΎΡΠΎΡΠΈΠΏΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ «main», Π·Π°ΠΏΠΈΡΠ°Π² Π² Π½Π΅Π³ΠΎ ΠΏΡΡΡ ΠΊ ΡΠ²ΠΎΠ΅ΠΌΡ ΡΠΊΡΠΈΠΏΡΡ (Object.prototype.main = «./../../pwned.js») ΠΈ Π΄Π°Π½Π½ΠΎΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ Π±ΡΠ΄Π΅Ρ Π²ΡΠ·Π²Π°Π½ΠΎ Π² ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π² ΠΊΠΎΠ΄Π΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ require(«my-package»), Π΅ΡΠ»ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΠΌΡΠΉ ΠΏΠ°ΠΊΠ΅Ρ ΡΠ²Π½ΠΎ Π½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ Π² package.json ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ «main» (Π΅ΡΠ»ΠΈ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ Π½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎ, ΠΎΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΎ ΠΈΠ· ΠΊΠΎΡΠ½Π΅Π²ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠΎΡΠΈΠΏΠ°). ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΏΠΎΠ΄ΡΡΠ°Π²Π»Π΅Π½Ρ ΡΠ²ΠΎΠΉΡΡΠ²Π° «shell», «exports» ΠΈ «env»: let rootProto = Object.prototype; rootProto[«exports»] = {«.»:»./changelog.js»}; rootProto[«1»] = «/path/to/npm/scripts/»; // trigger call require («./target.js»); Object.prototype.main = «/path/to/npm/scripts/changelog.js»; Object.prototype.shell = «node»; Object.prototype.env = {}; Object.prototype.env.NODE_OPTIONS = «—inspect-brk=0.0.0.0:1337»; // trigger call require («bytes»);
ΠΡΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΠΈ ΠΏΡΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π»ΠΈ 10 ΡΡΡΡΡ NPM-ΠΏΠ°ΠΊΠ΅ΡΠΎΠ², ΠΈΠΌΠ΅ΡΡΠΈΡ Π½Π°ΠΈΠ±ΠΎΠ»ΡΡΠ΅Π΅ ΡΠΈΡΠ»ΠΎ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ, ΠΈ Π²ΡΡΠ²ΠΈΠ»ΠΈ, ΡΡΠΎ 1958 ΠΈΠ· Π½ΠΈΡ Π½Π΅ ΠΈΠΌΠ΅ΡΡ ΡΠ²ΠΎΠΉΡΡΠ²Π° main Π² package.json, 4420 ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΏΡΡΠΈ Π² Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΈ require, Π° 355 Π½Π°ΠΏΡΡΠΌΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ API Π΄Π»Ρ ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄.
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ°Π±ΠΎΡΠ°ΡΡΠ΅Π³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΡΠΊΡΠΏΠ»ΠΎΠΈΡ Π΄Π»Ρ Π°ΡΠ°ΠΊΠΈ Π½Π° Π±ΡΠΊΠ΅Π½Π΄ Parse Server, ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΠΈΠΉ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ evalFunctions. ΠΠ»Ρ ΡΠΏΡΠΎΡΠ΅Π½ΠΈΡ Π²ΡΡΠ²Π»Π΅Π½ΠΈΡ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΡ
ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠ΅ΠΉ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π½ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ, ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΡΡΡΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄Ρ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°. Π Ρ
ΠΎΠ΄Π΅ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Node.js Π±ΡΠ»ΠΎ Π²ΡΡΠ²Π»Π΅Π½ΠΎ 11 Π³Π°Π΄ΠΆΠ΅ΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ Π°ΡΠ°ΠΊ, ΠΏΡΠΈΠ²ΠΎΠ΄ΡΡΠΈΡ
ΠΊ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ΄Π° Π°ΡΠ°ΠΊΡΡΡΠ΅Π³ΠΎ. ΠΠΎΠΌΠΈΠΌΠΎ Parse Server, Π΄Π²Π΅ ΡΠΊΡΠΏΠ»ΡΠ°ΡΠΈΡΡΠ΅ΠΌΡΠ΅ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ ΡΠ°ΠΊΠΆΠ΅ Π±ΡΠ»ΠΈ Π²ΡΡΠ²Π»Π΅Π½Ρ Π² NPM CLI.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: opennet.ru