ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π°Ρ‚Π°ΠΊΠΈ для ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ опрСдСлСния Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² памяти Π½Π° сСрвСрС

Π“Ρ€ΡƒΠΏΠΏΠ° исслСдоватСлСй ΠΈΠ· Грацского тСхничСского унивСрситСта (Австрия), Ρ€Π°Π½Π΅Π΅ извСстная Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ Π°Ρ‚Π°ΠΊ MDS, NetSpectre, Throwhammer ΠΈ ZombieLoad, ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π»Π° Π½ΠΎΠ²Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π°Ρ‚Π°ΠΊΠΈ (CVE-2021-3714) ΠΏΠΎ сторонним ΠΊΠ°Π½Π°Π»Π°ΠΌ Π½Π° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π΄Π΅Π΄ΡƒΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ страниц памяти (Memory-Deduplication), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π² памяти ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ±Π°ΠΉΡ‚ΠΎΠ²ΡƒΡŽ ΡƒΡ‚Π΅Ρ‡ΠΊΡƒ содСрТимого памяти ΠΈΠ»ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ раскладку памяти для ΠΎΠ±Ρ…ΠΎΠ΄Π° Π·Π°Ρ‰ΠΈΡ‚Ρ‹ Π½Π° основС Ρ€Π°Π½Π΄ΠΎΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ адрСсов (ASLR). ΠžΡ‚ Ρ€Π°Π½Π΅Π΅ дСмонстрируСмых Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Π°Ρ‚Π°ΠΊ Π½Π° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π΄Π΅Π΄ΡƒΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π½ΠΎΠ²Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ отличаСтся ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ Π°Ρ‚Π°ΠΊΠΈ с внСшнСго хоста с использованиСм Π² качСствС критСрия измСнСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² Π½Π° отправляСмыС Π°Ρ‚Π°ΠΊΡƒΡŽΡ‰ΠΈΠΌ запросы ΠΏΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°ΠΌ HTTP/1 ΠΈ HTTP/2. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ провСдСния Π°Ρ‚Π°ΠΊΠΈ продСмонстрирована для сСрвСров Π½Π° Π±Π°Π·Π΅ Linux ΠΈ Windows.

Атаки Π½Π° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π΄Π΅Π΄ΡƒΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ памяти ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π² качСствС ΠΊΠ°Π½Π°Π»Π° для ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ свСдСний Ρ€Π°Π·Π½ΠΈΡ†Ρƒ Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ записи Π² ситуациях, ΠΊΠΎΠ³Π΄Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ Π΄Π΅Π΄ΡƒΠΏΠ»ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ страницы памяти ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Copy-On-Write (COW). Π’ процСссС Ρ€Π°Π±ΠΎΡ‚Ρ‹ ядро опрСдСляСт ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ страницы памяти ΠΎΡ‚ Ρ€Π°Π·Π½Ρ‹Ρ… процСссов ΠΈ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ ΠΈΡ…, отобраТая ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹Π΅ страницы памяти Π² ΠΎΠ΄Π½Ρƒ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ физичСской памяти для хранСния Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ ΠΊΠΎΠΏΠΈΠΈ. ΠŸΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ измСнСния ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· процСссов Π΄Π°Π½Π½Ρ‹Ρ…, связанных с Π΄Π΅Π΄ΡƒΠΏΠ»ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ страницами, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ (page fault) ΠΈ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Copy-On-Write автоматичСски создаётся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ копия страницы памяти, которая закрСпляСтся Π·Π° процСссом. На Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ копирования тратится Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ врСмя, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠΌ измСнСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‰ΠΈΡ…ΡΡ с Π΄Ρ€ΡƒΠ³ΠΈΠΌ процСссом.

Π˜ΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΠ΅ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° COW Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ»ΠΎΠ²ΠΈΡ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ локально, Π½ΠΎ ΠΈ анализируя ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ доставки ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² ΠΏΠΎ сСти. ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΎ нСсколько ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² опрСдСлСния содСрТимого памяти с ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ хоста Ρ‡Π΅Ρ€Π΅Π· Π°Π½Π°Π»ΠΈΠ· Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния запросов ΠΏΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°ΠΌ HTTP/1 ΠΈ HTTP/2. Для сохранСния ΠΏΠΎΠ΄Π±ΠΈΡ€Π°Π΅ΠΌΡ‹Ρ… шаблонов ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΈΠΏΠΎΠ²Ρ‹Π΅ web-прилоТСния, ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‰ΠΈΠ΅ Π² памяти ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΡƒΡŽ Π² запросах ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ.

ΠžΠ±Ρ‰ΠΈΠΉ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π°Ρ‚Π°ΠΊΠΈ сводится ΠΊ заполнСнию Π½Π° сСрвСрС страницы памяти Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΠΌ содСрТимоС ΡƒΠΆΠ΅ ΠΈΠΌΠ΅ΡŽΡ‰Π΅ΠΉΡΡ Π½Π° сСрвСрС страницы памяти. Π—Π°Ρ‚Π΅ΠΌ Π°Ρ‚Π°ΠΊΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ врСмя, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ для выполнСния ядром Π΄Π΅Π΄ΡƒΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ объСдинСния страницы памяти, послС Ρ‡Π΅Π³ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΎΡ†Π΅Π½ΠΈΠ²Π°Π΅Ρ‚ врСмя Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈ для опрСдСлСния ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΡΡ‚ΠΈ попадания.

ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π°Ρ‚Π°ΠΊΠΈ для ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ опрСдСлСния Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² памяти Π½Π° сСрвСрС

Π’ Ρ…ΠΎΠ΄Π΅ ΠΏΡ€ΠΎΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹Ρ… экспСримСнтов максимальная ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ составила 34.41 Π±Π°ΠΉΡ‚ Π² час ΠΏΡ€ΠΈ Π°Ρ‚Π°ΠΊΠ΅ Ρ‡Π΅Ρ€Π΅Π· Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ ΡΠ΅Ρ‚ΡŒ ΠΈ 302.16 Π±Π°ΠΉΡ‚ Π² час ΠΏΡ€ΠΈ Π°Ρ‚Π°ΠΊΠ΅ Ρ‡Π΅Ρ€Π΅Π· Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΡΠ΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ быстрСС Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² извлСчСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ сторонним ΠΊΠ°Π½Π°Π»Π°ΠΌ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ Π°Ρ‚Π°ΠΊΠ΅ NetSpectre ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… составляСт 7.5 Π±Π°ΠΉΡ‚ Π² час).

ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΎ Ρ‚Ρ€ΠΈ Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Π°Ρ‚Π°ΠΊΠΈ. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ позволяСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² памяти web-сСрвСра, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Memcached. Атака сводится ΠΊ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… Π½Π°Π±ΠΎΡ€ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Memcached, очисткС Π΄Π΅Π΄ΡƒΠΏΠ»ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°, ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΉ записи Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ элСмСнта ΠΈ создания условия для возникновСния COW-копирования Ρ‡Π΅Ρ€Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ содСрТимого Π±Π»ΠΎΠΊΠ°. Π’ Ρ…ΠΎΠ΄Π΅ экспСримСнта с Memcached ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π·Π° 166.51 сСкунд ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π²Π΅Ρ€ΡΠΈΡŽ libc, ΡƒΡΡ‚Π°Π½ΠΎΠ²Π»Π΅Π½Π½ΡƒΡŽ Π² систСмС, Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠΉ Π² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машинС.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π΄Π°Π» Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΠ·Π½Π°Ρ‚ΡŒ содСрТимоС записСй Π² Π‘Π£Π‘Π” MariaDB, ΠΏΡ€ΠΈ использовании Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° InnoDB, Ρ‡Π΅Ρ€Π΅Π· воссозданиС содСрТимого Π±Π°ΠΉΡ‚ Π·Π° Π±Π°ΠΉΡ‚ΠΎΠΌ. Атака производится Ρ‡Π΅Ρ€Π΅Π· ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½Ρ‘Π½Π½Ρ‹Ρ… запросов, приводящих ΠΊ ΠΎΠ΄Π½ΠΎΠ±Π°ΠΉΡ‚ΠΎΠ²Ρ‹ΠΌ нСсовпадСниям Π² страницах памяти ΠΈ Π°Π½Π°Π»ΠΈΠ·Π΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈ для опрСдСлСния, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ³Π°Π΄ΠΊΠ° ΠΎ содСрТимом Π±Π°ΠΉΡ‚Π° Π±Ρ‹Π»Π° Π²Π΅Ρ€Π½ΠΎΠΉ. CΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ Π½Π΅Π²Π΅Π»ΠΈΠΊΠ° ΠΈ составляСт 1.5 Π±Π°ΠΉΡ‚ Π² час ΠΏΡ€ΠΈ Π°Ρ‚Π°ΠΊΠ΅ ΠΈΠ· локальной сСти. Плюсом ΠΌΠ΅Ρ‚ΠΎΠ΄Π° являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ для восстановлСния нСизвСстного содСрТимого памяти.

Π’Ρ€Π΅Ρ‚ΠΈΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ» Π·Π° 4 ΠΌΠΈΠ½ΡƒΡ‚Ρ‹ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π·Π°Ρ‰ΠΈΡ‚Ρ‹ KASLR ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ смСщСнии Π² памяти ΠΎΠ±Ρ€Π°Π·Π° ядра Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹, Π² ситуации ΠΊΠΎΠ³Π΄Π° адрСс смСщСния находится Π² страницС памяти, Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ. Атака ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΠ»Π°ΡΡŒ с хоста, находящСгося Π·Π° 14 Ρ‚Ρ€Π°Π½Π·ΠΈΡ‚Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ² (hops) ΠΎΡ‚ Π°Ρ‚Π°ΠΊΡƒΠ΅ΠΌΠΎΠΉ систСмы. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΠ΄Π° для осущСствлСния прСдставлСнных Π°Ρ‚Π°ΠΊ ΠΎΠ±Π΅Ρ‰Π°ΡŽΡ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒ Π½Π° GitHub.

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