В данном документе мы опишем атаку, названную атакой замещения, на приложения, защищенные виртуализацией уровня процесса. В ходе данной атаки атакующий замещает защищающую виртуальную машину (ВМ) атакующей ВМ, тем самым делая приложение уязвимым к анализу и модификации.
Учитывая все большее использование виртуализации уровня процесса в защите программ, важно оценивать ее безопасность в целом. Существование любых слабостей в ПВМ или ее взаимодействии с приложением может серьезно подорвать эффективность любого механизма защиты, который полагается на виртуализацию уровня процесса.
Остаток данного документа организован следующим образом. Раздел 2 дает общие сведения о виртуализации уровня процесса. В разделе 3 описана модель защиты виртуализованного приложения. Раздел 4 описывает цели и возможности атакующего. Раздел 5 дает высокоуровневый обзор динамической атаки замещения. Раздел 6 описывает подробности механизмов защиты и то, как динамическая атака обходит их, чтобы сделать приложение уязвимым. Раздел 7 описывает влияние данной методологии на реверс-инженерию. В разделе 8 рассматриваются некоторые требования для проведения успешной атаки. Раздел 9 описывает некоторые из предыдущих работ в области защиты ПО от несанкционированной модификации и, наконец, в разделе 10 представлены заключения.
Рисунок 1. Высокоуровневый обзор виртуализации уровня процесса. Гостевое приложение запускается при посредничестве ВМ уровня процесса, благодаря чему выглядит для используемой платформы как нативный процесс.
Рисунок 1 иллюстрирует типичную среду виртуальной машины уровня процесса, где гостевое приложение запускается под управлением ПВМ, и тем самым выглядит как нативный хостовой процесс. Данная работа сосредоточена исключительно на виртуализации уровня процесса и ее слабостях, касающихся защиты программ.
При запуске программы ПВМ берет управление в свои руки и начинает декодировать инструкции приложения в том порядке, в каком они следуют в программе. Декодированные инструкции затем используются для вызова подходящих обработчиков, которые интерпретируют инструкции на хостовой системе. По существу ПВМ может постоянно отслеживать код приложения, запускаемый на хостовой системе, и служить платформой для динамического применения схем защиты.
Программы часто выполняют критичные задачи из широкого круга областей, например, для медицинских, банковских и транспортных систем. Любая несанкционированная модификация подобных критичных программных систем может привести к серьезному нарушению сервисов и потенциальным потерям, измеряемых не только имуществом, но и жизнями. Таким образом, необходимо защищать приложения от вредоносной модификации. Мы определим защитника, как сущность, чья цель – это сохранение целостности приложения. Для достижения этой цели защитник использует разные схемы защиты, чтобы защитить критичный функционал ПО. В целом эти схемы можно разделить на статические методы (защищающие от анализа хранимый на диске двоичный файл) и динамические (защищающие программу во время ее работы).
Рисунок 2. Высокоуровневый обзор процесса создания защищенной программы. Линкующий инструмент используется для сборки кода приложения, библиотек и кода ПВМ и применения разных защитных механизмов, чтобы создать защищенный двоичный файл. Во время выполнения приложение управляется защищающей ПВМ.
Статические методы защиты защищают находящийся на диске двоичный файл от анализа и модификации. За последние несколько лет было предложено множество мощных методов статической защиты [13, 14, 32, 52]. Например, непрозрачные предикаты являются распространенным методом, помогающим при обфускации программ [14]. Непрозрачный предикат имеет два возможных исхода: true/false. Непрозрачность данных предикатов кроется в том факте, что реверс-инженеру трудно найти их значения из находящегося на диске двоичного файла с помощью статических методов. Данные конструкции используются в обфускации информации потока управления. Шифрование кода – еще один полезный метод противодействия статическому анализу [9]. Рисунок 2 иллюстрирует создание виртуализованного приложения, которое защищено подобными методами. Во время создания приложения защитник упаковывает защищающую ВМ с гостевым приложением P вместе с ее библиотеками с помощью инструмента линковки. Данный инструмент затем применяет разнообразные схемы защиты к виртуализованному приложению PV. После применения защитных методов инструмент выдает защищенный файл, как показано на рисунке 2.
Статические методы сами по себе не могут обеспечить адекватную защиту. Как мы опишем в разделе 4, атакующие все чаще анализируют программы во время выполнения. Чтобы защититься от таких атак, было предложено несколько решений, которые включают изменение программного кода в ходе выполнения, что перемещает цель атаки (напрмер, динамическая перезапись инструкций [28] и скриптов модификации [35]). Другое решение включает упаковку вместе с приложением ВМ уровня процесса, которая защищает приложение во время выполнения и от общих атак [1, 20, 51], как показано справа на рисунке 2. Приложение модифицируется так, что при старте программы происходит инициализация ПВМ и передача ей управления. Затем приложение запускается под управлением ПВМ, а не напрямую на нативной платформе. Код для вызова ПВМ хранится в инициализирующей процедуре виртуализованного приложения. Существуют различные методы создания таких инициализирующих процедур (например, в ELF-файлах эти процедуры могут быть помещены в секцию .init [54]). Формат двоичного файла MacOS, Mach-O, содержит раздел DATA для размещения конструкторов классов [2]).
Способность ПВМ отслеживать код гостевого приложения делает ее подходящей платформой для динамической защиты. Поскольку ПВМ виртуализует гостевое приложение, она может делать проверять код на предмет модификации и обфусцировать код. ПВМ можно использовать для применения схем защиты при каждом запуске, создавая разные поверхности атаки с каждым стартом приложения [20]. Подобные схемы усложняют запуск автоматизированных атак на приложение. ПВМ увеличивает и эффективность существующих защитных методов. Например, схемы шифрования кода часто уязвимы из-за грубых уровней дешифрования в ходе работы приложения [5]. ПВМ помогает выполнять дешифрование кода по требованию, в нужное время [20]. Расшифровываются только те инструкции приложения, которые планируется выполнить. После выполнения эти инструкции могут быть зашифрованы опять. Таким образом, приложение не будет расшифровано полностью ни в какой момент выполнения.
Достижению целей атакующего способствуют недавние достижения в технологии реверс-инженерии, которые привели к появлению мощных инструментов анализа программ. Существует два типа инструментов анализа: инструменты для статического анализа, которые собирают информацию о программе путем изучения ее двоичного файла, не запуская ее (например, дизассемблеры и декомпиляторы), и инструменты для динамического анализа, которые собирают информацию из запущенной программы (например, отладчики, симуляторы, фреймворки для динамического анализа и эмуляторы [18, 34, 55]). Разработка и доступность динамических инструментов в частности усилили способности атакующего, поскольку многие методы статической защиты поддаются анализу во время выполнения [5]. С помощью этих инструментов атакующий пытается получить информацию, необходимую для выполнения задуманной атаки. Атака, описываемая в следующем разделе, делает возможным использование таких инструментов на приложениях, защищенных ПВМ.
Термин | Обозначение | Определение |
---|---|---|
Гостевое приложение | P | Защищаемая программа |
Защищающая ПВМ (PVM) | V | Виртуальная машина уровня процесса, которая настроена на применение разнообразных защитных методов во время выполнения. |
Виртуализованное приложение | PV | Приложение, состоящее из P, упакованной вместе с защищающей ПВМ |
Функция входа | EP | Функция в коде ВМ, которая инициирует процесс виртуализации приложения. Для успешного выполнения атаки атакующему нужно найти эту функцию. |
Атакующая ПВМ | M | ВМ уровня процесса, которая помогает атакующему в анализе P. |
Фреймворк интроспекции кода | CIF | Фреймворк интроспекции, способный отслеживать и инструментировать выполняемый код. |
Таблица 1. Глоссарий используемой в данном документе терминологии.
Терминология, используемая в данном документе, сведена в таблицу 1.
Данная методология нацелена на поверхность приложения, которая наиболее уязвима к атаке (например, при наиболее слабом уровне защитных методов). Точнее, данная методология атаки нацелена на приложение сразу после его запуска (когда статические методы защиты не так эффективны) но до момента, когда ПВМ получает управление и начинает применять к приложению защитные механизмы. В случае успеха атака отсоединяет защищающую ПВМ и отключает защиты, работающие во время выполнения.
Чтобы подготовить успешную атаку замещения против защищаемого ПВМ приложения, необходимо выполнить определенные требования.
В разделе 8 данные требования обсуждаются более подробно, включая эвристику, которую атакующий может использовать для получения требуемой информации.
Атака происходит в два этапа. На первом этапе атакующую ПВМ нужно расширить, чтобы декодировать защищенное приложение, что включает понимание гостевой ISA. Если ISA зашифрована, ключи расшифрования и алгоритмы также должны быть получены и использованы для дальнейшего расширения атакующей ПВМ путем включения алгоритма дешифрования и ключей. Подробности дешифрации ISA гостевого приложения даны в разделе 8.2.
Рисунок 3 иллюстрирует второй этап атаки на PV. На рисунке 3(a) атакующий вызвает PV под фреймворком интроспекции кода (CIF), наблюдая за инструкциями по мере их запуска. Хорошо известные примеры CIF включают Pin [33] и QEMU [3]. Атакующий модифицирует CIF для нахождения и вызова функции входа защищающей ПВМ.
Процедура инициализации затем затем переходит к подготовке внутренних структур ПВМ. Когда вызывается функция входа защищающей ПВМ, CIF перехватывает этот вызов и извлекает стартовый адрес, изображенный на рисунке 3(b). Подробности процедуры определения функции входа ПВМ даны в разделе 8.1.
Далее CIF приступает к загрузке и инициализации атакующей ПВМ, показанной на рисунке 3(с). Затем CIF вызывает данную атакующую ПВМ со стартовым адресом P, который был извлечен из первоначального вызова.
Таким образом, P теперь выполняется при посредничестве атакующей ПВМ (показано на рисунке 3(d)). Происходит обход защищающей ПВМ, которая не может обеспечить P динамическую защиту. Атакующая ПВМ может быть использована для выполнения задач, которые помогают атакующему понять P (например, выгрузить информацию, определить положения функций, отследить инструкции и т. д.).
В разделе 6 мы опишем две демонстрационных реализации, которые используют только что описанный подход. Первый прототип использует популярный CIF, Pin, для замещения защищающей ПВМ атакующей ПВМ и запуска гостевого приложения. Второй использует модифицированный архитектурный симулятор, который выполняет интроспекцию кода, а также виртуализацию.
[1] ANCKAERT, B., JAKUBOWSKI, M., AND VENKATESAN, R. Proteus: virtualization for diversified tamper-resistance. In DRM ’06: Proceedings of the ACM Workshop on Digital Rights Management (New York, NY, USA, 2006), ACM Press, pp. 47–58.
[2] APPLE. Mac OS X ABI Mach-o file format reference, 2009.
[3] BELLARD, F. QEMU, a fast and portable dynamic translator. In ATEC’05: Proceedings of the USENIX Annual Technical Conference (Berkeley, CA, USA, 2005), USENIX Association, pp. 41–41.
[4] BILLET, O., GILBERT, H., AND ECH-CHATBI, C. Cryptanalysis of a white box AES implementation. In Selected Areas in Cryptography (Hiedelberg, 2004), Springer-Verlag, pp. 227–240.
[5] BIONDI, P., AND FABRICE, D. Silver needle in the skype. In Black Hat Europe (Amsterdam, the Netherlands, 2006).
[6] BORELLO, J.-M., AND M` E, L. Code obfuscation techniques for metamorphic viruses. Journal in Computer Virology 4 (2008), 211–220. 10.1007/s11416-008-0084-2.
[7] BRUENING, D., GARNETT, T., AND AMARASINGHE, S. An infrastructure for adaptive dynamic optimization. In CGO ’03: Proceedings of the IEEE/ACM International Symposium on Code Generation and Optimization (Los Alamitos, CA, USA, 2003), IEEE Computer Society, pp. 265–275.
[8] CABALLERO, J., JOHNSON, N. M., MCCAMANT, S., AND SONG, D. Binary code extraction and interface identification for security applications. In NDSS ’10: Proceedings of the Network and Distributed System Security Symposium (2010), The Internet Society.
[9] CAPPAERT, J., PRENEEL, B., ANCKAERT, B., MADOU, M., AND DE BOSSCHERE, K. Towards tamper resistant code encryption: practice and experience. In ISPEC’08: Proceedings of the 4th International Conference on Information Security Practice and Experience (Berlin, Heidelberg, 2008), Springer-Verlag, pp. 86–100.
[10] CHANG, H., AND ATALLAH, M. Protecting software code by guards. In Proceedings of the ACM Workshop on Security and Privacy in Digital Rights Management (2000), pp. 160–175.
[11] CHEN, X., GARFINKEL, T., LEWIS, E. C., SUBRAHMANYAM, P., WALDSPURGER, C. A., BONEH, D., DWOSKIN, J., AND PORTS, D. R. Overshadow: a virtualization-based approach to retrofitting protection in commodity operating systems. In ASPLOS XIII: Proceedings of the 13th International Conference on Architectural Support for Programming Languages and Operating Systems (New York, NY, USA, 2008), ACM Press, pp. 2–13.
[12] CHOW, S., EISEN, P. A., JOHNSON, H., AND OORSCHOT, P. C. V. White-box cryptography and an AES implementation. In SAC ’02: Revised Papers from the 9th Annual International Workshop on Selected Areas in Cryptography (London, UK, 2003), Springer-Verlag, pp. 250–270.
[13] COLLBERG, C., THOMBORSON, C., AND LOW, D. A taxonomy of obfuscating transformations. University of Auckland Technical Report (1997), 170.
[14] COLLBERG, C., THOMBORSON, C., AND LOW, D. Manufacturing cheap, resilient and stealthy opaque constructs. In POPL’98:Proceedings of the 25th ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages (New York, NY, USA, 1998), ACM Press, pp. 184–196.
[15] COOGAN, K., LU, G., AND DEBRAY, S. Deobfuscating virtualization-obfuscated software: A semantics-based approach. CCS ’11: Proceedings of the ACM Conference on Computer and Communications Security (October 2011). To appear.
[16] DE BUS, B., DE SUTTER, B., VAN PUT, L., CHANET, D., AND DE BOSSCHERE, K. Link-time optimization of ARM binaries. In LCTES’04: Proceedings of the 2004 ACM SIGPLAN/SIGBED Conference on Languages, Compilers, and Tools for Embedded Systems (Washington D.C., U.S.A, 7 2004), ACM Press, pp. 211–220.
[17] DEHNERT, J. C., GRANT, B. K., BANNING, J. P., JOHNSON, R., KISTLER, T., KLAIBER, A., AND MATTSON, J. The Transmeta code morphing software: using speculation, recovery, and adaptive retranslation to address real-life challenges. In CGO’03: Proceedings of the International Symposium on Code Generation and Optimization (Washington, DC, USA, 2003), IEEE Computer Society, pp. 15–24.
[18] EAGLE, C. The IDA Pro Book: The Unofficial Guide to the World’s Most Popular Disassembler. No Starch Press, San Francisco, CA, USA, 2008.
[19] GARFINKEL, T., PFAFF, B., CHOW, J., ROSENBLUM, M., AND BONEH, D. Terra: a virtual machine-based platform for trusted computing. In SOSP’03: Proceedings of the 19th ACM Symposium on Op- erating Systems Principles (New York, NY, USA, 2003), ACM Press, pp. 193–206.
[20] GHOSH, S., HISER, J. D., AND DAVIDSON, J. W. A secure and robust approach to software tamper resistance. In IH ’10: Proceedings of the 12th International Conference on Information Hiding (Berlin, Heidelberg, 2010), Springer-Verlag, pp. 33–47.
[21] GR ¨ OBERT, F., WILLEMS, C., AND HOLZ, T. Automatic identification of cryptographic primitives in binary programs. In RAID ’11: Proceedings of the 14th International Symposium on Recent Advances in Intrusion Detection (London, UK, 2011), Springer-Verlag, pp. 45–65.
[22] HALDERMAN, J. A., SCHOEN, S. D., HENINGER, N., CLARKSON, W., PAUL, W., CALANDRINO, J. A., FELDMAN, A. J., APPELBAUM, J., AND FELTEN, E. W. Lest we remember: cold-boot attacks on encryption keys, May 2009.
[23] HISER, J. D., COLEMAN, C. L., CO, M., AND DAVIDSON, J. W. Meds: The memory error detection system. In ESSoS ’09: Proceedings of the 1st International Symposium on Engineering Secure Software and Systems (Berlin, Heidelberg, 2009), Springer-Verlag, pp. 164–179.
[24] HISER, J. D., WILLIAMS, D., FILIPI, A., DAVIDSON, J. W., AND CHILDERS, B. R. Evaluating fragment construction policies for SDT systems. In VEE ’06: Proceedings of the 2nd International Conference on Virtual Execution Environments (New York, NY, USA, 2006), ACM Press, pp. 122–132.
[25] HISER, J. D., WILLIAMS, D., HU, W., DAVIDSON, J. W., MARS, J., AND CHILDERS, B. R. Evaluating indirect branch handling mechanisms in software dynamic translation systems. In CGO’07: Proceedings of the International Symposium on Code Generation and Optimization (Washington, DC, USA, 2007), IEEE Computer Society, pp. 61–73.
[26] HORSPOOL, R. N., AND MAROVAC, N. An approach to the problem of detranslation of computer programs. Computer Journal 23, 3 (1980), 223–229.
[27] HU, W., HISER, J. D., WILLIAMS, D., FILIPI, A., DAVIDSON, J. W., EVANS, D., KNIGHT, J. C., NGUYEN-TUONG, A., AND ROWANHILL, J. Secure and practical defense against code-injection attacks using software dynamic translation. In Proceedings of the 2nd International Conference on Virtual Execution Environments (New York, NY, USA, 2006), ACM Press, pp. 2–12.
[28] KANZAKI, Y., MONDEN, A., NAKAMURA, M., AND MATSUMOTO, K.-I. Exploiting self-modification mechanism for program protection. In COMPSAC’03: Proceedings of the 27th Annual International Conference on Computer Software and Applications (Washington, DC, USA, 2003), IEEE Computer Society, pp. 170–176.
[29] KC, G. S., KEROMYTIS, A. D., AND PREVELAKIS, V. Countering code-injection attacks with instruction-set randomization. In CCS ’03: Proceedings of the 10th ACM Conference on Computer and Communications Security (New York, NY, USA, 2003), ACM Press, pp. 272–280.
[30] KIRIANSKY, V., BRUENING, D., AND AMARASINGHE, S. P. Secure execution via program shepherding. In USENIX’02: Proceedings of the 11th USENIX Security Symposium (Berkeley, CA, USA, 2002), USENIX Association, pp. 191–206.
[31] LEDER, F., MARTINI, P., AND WICHMANN, A. Finding and extracting crypto routines from malware. In Proceedings of the IEEE 28th International Performance Computing and Communications Conference (IPCCC) (Washington, DC,USA, December 2009), IEEE, pp. 394 –401.
[32] LINN, C., AND DEBRAY, S. Obfuscation of executable code to improve resistance to static disassembly. In CCS’03: Proceedings of the 10th ACM Conference on Computer and Communications Security (CCS) (Washington D.C., U.S.A, 2003), ACM Press, pp. 290–299.
[33] LUK, C.-K., COHN, R., MUTH, R., PATIL, H., KLAUSER, A., LOWNEY, G., WALLACE, S., REDDI, V. J., AND HAZELWOOD, K. Pin: building customized program analysis tools with dynamic instrumentation. In PLDI ’05: Proceedings of the 2005 ACM SIGPLAN Conference on Programming Language Design and Implementation (New York, NY, USA, 2005), ACM Press, pp. 190–200.
[34] MADOU, M., ANCKAERT, B., DE SUTTER, B., AND DE BOSSCHERE, K. Hybrid static-dynamic attacks against software protection mechanisms. In DRM ’05: Proceedings of the 5th ACM workshop on Digital Rights Management (New York, NY, USA, 2005), ACMPress, pp. 75–82.
[35] MADOU, M., ANCKAERT, B., MOSELEY, P., DEBRAY, S., DE SUTTER, B., AND DE BOSSCHERE, K. Software protection through dy- namic code mutation. In The 6th International Workshop on Information Security Applications (WISA 2005) (August 2005), vol. LNCS, Springer Verlag.
[36] OREANS TECHNOLOGIES. Themida. http://oreans.com/ themida.php, 2009.
[37] OREONS TECHNOLOGY. Codevirtualizer. http://oreans.com/ codevirtualizer.php, 2009.
[38] PAYER, M., AND GROSS, T. R. Fine-grained user-space security through virtualization. In VEE’11: Proceedings of the 7th ACM SIG- PLAN/SIGOPS International Conference on Virtual Execution Environments (New York, NY, USA, 2011), ACM Press, pp. 157–168.
[39] POPEK, G. J., AND GOLDBERG, R. P. Formal requirements for virtualizable third generation architectures. Communications of the ACM 17 (July 1974), 412–421.
[40] PORTOKALIDIS, G., AND KEROMYTIS, A. D. Fast and practical instruction-set randomization for commodity systems. In ACSAC’10: Proceedings of the 26th Annual Computer Security Applications Conference (New York, NY, USA, 2010), ACM Press, pp. 41–48.
[41] ROLLES, R. Unpacking virtualization obfuscators. In WOOT’09: Proceedings of the 3rd USENIX Conference on Offensive Technologies (Berkeley, CA, USA, 2009), USENIX Association, pp. 1–10.
[42] SCOTT, K., AND DAVIDSON, J. Safe virtual execution using software dynamic translation. In ACSAC ’02: Proceedings of the 18th Annual Computer Security Applications Conference (Los Alamitos, CA, USA, 2002), IEEE Computer Society, p. 209.
[43] SCOTT, K., KUMAR, N., VELUSAMY, S., CHILDERS, B., DAVIDSON, J. W., AND SOFFA, M. L. Retargetable and reconfigurable soft- ware dynamic translation. In CGO ’03: Proceedings of the International Symposium on Code Generation and Optimization (Washington D.C., U.S.A, 2003), IEEE Computer Society, pp. 36–47.
[44] SHARIF, M., LANZI, A., GIFFIN, J., AND LEE, W. Automatic reverse engineering of malware emulators. In SP’07: Proceedings of the 2009 30th IEEE Symposium on Security and Privacy (Washington, DC, USA, 2009), IEEE Computer Society, pp. 94–109.
[45] SITES, R. L., CHERNOFF, A., KIRK, M. B., MARKS, M. P., AND ROBINSON, S. G. Binary translation. Communcations of the ACM 36 (February 1993), 69–81.
[46] SMITH, J., AND NAIR, R. Virtual Machines: Versatile Platforms for Systems and Processes (The Morgan Kaufmann Series in Computer Architecture and Design). Morgan Kaufmann Publishers Inc., San Francisco, CA, USA, 2005.
[47] SRIDHAR, S., SHAPIRO, J. S., NORTHUP, E., AND BUNGALE, P. P. HDTrans: an open source, low-level dynamic instrumentation system. In VEE’06: Proceedings of the 2nd International Conference on Virtual Execution Environments (New York, NY, USA, 2006), ACM, pp. 175–185.
[48] STARFORCE. Starforce crypto. http://www.star-force.com/, 2008.
[49] SZOR, P. The Art of Computer Virus Research and Defense. Addison-Wesley Professional, 2005.
[50] UDUPA, S., DEBRAY, S., AND MADOU, M. Deobfuscation: reverse engineering obfuscated code. In WCRE ’05: Proceedings of the International Working Conference on Reverse Engineering (Los Alamitos, CA, USA, Nov. 2005), vol. 0, IEEE Computer Society, pp. 45–54.
[51] VMPROTECT SOFTWARE. VMProtect. http://vmpsoft.com/, 2008.
[52] WANG, C., DAVIDSON, J., HILL, J., AND KNIGHT, J. Protection of software-based survivability mechanisms. In DSN’01: Proceedings of the International Conference on Dependable Systems and Networks (Goteborg, Sweden, 2001), IEEE Computer Society, pp. 193–202.
[53] WANG, C., HILL, J., KNIGHT, J., AND DAVIDSON, J. Software tamper resistance: Obstructing static analysis of programs. Tech. rep., Charlottesville, VA, USA, 2000.
[54] YOUNGDALE, E. Kernel korner: The ELF object file format: Introduction. Linux Journal 1995 (April 1995).
[55] YOURST, M. PTLsim: A cycle accurate full system x86-64 microarchitectural simulator. In ISPASS’07: Proceedings of the IEEE International Symposium on Performance Analysis of Systems and Software (2007), IEEE, pp. 23–34.
[56] ZAMBRENO, J., CHOUDHARY, A., SIMHA, R., NARAHARI, B., AND MEMON, N. SAFE-OPS: An approach to embedded software security. Transactions on Embedded Computing Systems 4, 1 (2005), 189–210.
Большой брат следит за вами, но мы знаем, как остановить его. Подпишитесь на наш канал!