Обфускация
Обфуска́ция программы, всякое её преобразование, которое сохраняет вычисляемую программой функцию (эквивалентное преобразование), но при этом придает программе такую форму, что извлечение из текста программы (исходного кода) ключевой информации об алгоритмах и структурах данных, реализованных в этой программе, становится трудоёмкой задачей.
Обфускация программ преследует цель затруднить понимание программ и воспрепятствовать целенаправленной их модификации. Поэтому задачу обфускации программ можно воспринимать как одну из задач системного программирования, подобную другим задачам преобразования программ: трансляции (компиляции), оптимизации, реорганизации, распараллеливания. С другой стороны, обфускацию можно также рассматривать как особую разновидность шифрования программ. В отличие от традиционных видов шифрования обфускация не предполагает построения эффективных алгоритмов расшифрования, т. е. восстановления исходного текста программы, но зато требует сохранения смысла зашифрованного сообщения – функции, вычисляемой обфускируемой программой. Поэтому задача обфускации программ может быть также отнесена к области криптографии и криптоанализа. Именно двойственность этой задачи и объясняет тот факт, что её исследование вот уже более 20 лет проводится по двум направлениям: со стороны системного программирования и со стороны криптографии, которые очень мало взаимодействуют друг с другом. Обфускация сравнительно новый раздел информатики.
Впервые (без использования самого термина «обфускация») это понятие возникло в 1976 г. в работе Диффи и Хеллмана (Diffie. 1976. P. 644–654). Они заметили, что введённое ими понятие криптосистем с открытым ключом позволяет преобразовывать некоторые схемы вычисления с секретным ключом в стойкие криптографические схемы с открытым ключом. А собственно понятие обфускации программ впервые введено в работе Коллберга (Collberg), где обфускация представлялась эффективным средством защиты интеллектуальной собственности. Эти две статьи стали началом двух направлений исследований обфускации программ, а именно обфускации для решения криптографических задач и обфускации для решения задач в области программного обеспечения и кибербезопасности.
Основные характеристики проблемы обфускации программ:
Спектр задач, для решения которых можно было бы использовать алгоритмы обфускации, весьма обширен, и цели применения обфускации могут быть противоположны. Обфускацию можно использовать как для защиты программ от атак (Cohen. 1993. P. 565–584), так и для маскировки компьютерных вирусов (Chess. 2000; Ször. 2001. P. 123–144). При обфускации программ для нужд криптографии целью маскировки является сокрытие данных (секретного ключа), но не алгоритмов. Но когда методы обфускации применяются для обеспечения безопасности, то целью маскировки является сокрытие алгоритмов, но не обрабатываемых данных. Таким образом, «проблема обфускации программ» включает в себя целое семейство задач маскировки программ, для каждой из которых вводятся специальные требования стойкости обфускации.
Имеется большой разрыв между теоретическими требованиями стойкости обфускации программ и применяемыми на практике методами и средствами решения этой задачи. Известно немало работ, в которых предлагаются различные практические методы обфускации программ; практические методы обфускации программ (подробное описание многих из них см.: Collberg. 2009). Некоторые из этих методов были реализованы в коммерческих программных продуктах (см., например: Aucsmith. 1996. P. 317–333; Hamilton. 2011. P. 1–15; A study of software protection techniques. 2007. P. 249–253; Jien-Tsai Chan. 2004. P. 1–10; Jun Ge. 2005. P. 83–92). Однако влияние фундаментальных теоретических результатов [Barak. 2001. P. 1–18 (см. также On the (im)possibility of obfuscating programs 2012. P. 1–48); Varnovsky. 2004. P. 127–137; On the concept of software obfuscation ... 2007. P. 281–298; Goldwasser. 2007. P. 194–213] на эту ветвь развития программного обеспечения минимально: требования безопасности, исследуемые в контексте криптографических приложений, либо являются слишком сильными, либо неадекватны тем задачам защиты программного обеспечения, которые возникают на практике.
Имеется большой разрыв между положительными и отрицательными результатами решения задачи обфускации. Доказано, что для некоторых строго формализованных определений стойкости обфускации (стойкость в модели виртуального «чёрного ящика») существуют такие семейства эффективно вычислимых функций, которые не допускают стойкой обфускации [On the (im)possibility of obfuscating programs. 2001. P. 1–18; см. также On the (im)possibility of obfuscating programs. 2012. P. 1–48]. Стойкую обфускацию удалось построить для существенно более слабых требований стойкости и лишь для очень простых функций – точечных функций и близких к ним семейств функций (Canetti. 1997. P. 455–469; Varnovsky. 2003. P. 91–102; Lynn. 2004. P. 20–39; Wee. 2005. P. 523–532; Hofheinz. 2007. P. 214–232). Несмотря на то что положительные результаты были обобщены для более широких классов функций (Canetti. 2008. P. 489–508; Securely obfuscating re‐encryption. 2007. P. 233–252; Canetti. 2010. P. 72–89), вопрос о возможности/невозможности эффективной обфускации для общих криптографических протоколов или же для любого значимого класса программ (например, для детерминированных автоматов) при стандартных криптографических предположениях остаётся открытым.
Проблема обфускации программ – очень сложная и многогранная задача, для неё вряд ли существует единый универсальный метод решения. Важнейшим направлением исследований этой проблемы является формирование математических основ для создания широкого многообразия формальных концепций и методов обфускации программ в контексте различных приложений. Создание такого математического аппарата требует разработки различных определений стойкости обфускации и исследования взаимосвязи между предложенными определениями и подходящими понятиями и моделями дискретной математики, математической криптографии, теории сложности вычислений. Наличие спектра различных определений стойкости обфускации позволяет понять, какие требования безопасности обеспечивают те или иные обфускирующие преобразования, и оценить, насколько эти преобразования удовлетворяют заявленным целям. Кроме того, введение новых формальных требований стойкости обфускации программ откроет новые возможности адаптации формальных методов теоретической информатики к решению задач защиты компьютерных программ.