Обфускация и шифрование
При шифровании безопасность должна зависеть от секретности ключа, а не от неизвестности алгоритма.
Обфускация работает иначе. Программа должна продолжать выполняться, поэтому среда выполнения в определенный момент получает информацию, необходимую для ее работы.
Например, если строка зашифрована внутри приложения, программа должна иметь возможность получить ее открытое значение перед использованием. Значит, аналитик потенциально может наблюдать момент расшифрования во время динамического анализа.
Поэтому обфускация не заменяет криптографическую защиту информации.
Обфускация и кодирование
Кодирование не предназначено для обеспечения конфиденциальности.
Base64 или аналогичное представление может скрыть читаемую строку от поверхностного просмотра, но алгоритм восстановления общедоступен.
Тем не менее злоумышленники могут использовать кодирование именно как часть обфускации — например, чтобы скрыть содержимое команд или полезной нагрузки от простого статического поиска. MITRE ATT&CK объединяет подобные сценарии в технике T1027 и отдельно описывает encrypted/encoded content.
Обфускация и минификация
Минификация особенно распространена в веб-разработке.
Из JavaScript удаляются:
- лишние пробелы;
- переносы строк;
- комментарии;
- другие элементы, не необходимые для исполнения.
Имена отдельных переменных также могут сокращаться.
В результате код действительно становится менее удобным для чтения, однако основная задача минификации — сократить объем передаваемых данных и иногда ускорить загрузку.
Обфускация ставит другую цель: намеренно увеличить сложность анализа.
Поэтому минификация может давать определенный побочный эффект запутывания, но ее не следует считать полноценной заменой обфускации.
Как злоумышленники используют обфускацию
Те же свойства, которые делают обфускацию полезной для защиты коммерческого программного обеспечения, привлекательны и для атакующего.
Злоумышленнику также выгодно сделать программу сложной для исследования.
Только цель меняется: вместо защиты интеллектуальной собственности необходимо скрыть вредоносную функциональность и затруднить работу средств информационной безопасности.
MITRE ATT&CK выделяет такую активность в отдельную технику T1027 — Obfuscated Files or Information. В актуальной версии ATT&CK она включает различные подтехники, среди которых software packing, command obfuscation, encrypted/encoded files, polymorphic code, compression, junk code insertion и другие способы сокрытия.
Обфусцированные файлы, скрипты и команды
Вредоносный код может содержать:
- зашифрованные или закодированные строки;
- преобразованные команды;
- бессмысленные имена;
- большое количество мусорных инструкций;
- упакованные исполняемые файлы;
- скрытую полезную нагрузку;
- динамически восстанавливаемые элементы.
Например, очевидный адрес командного сервера можно не хранить непосредственно в открытом виде, а собрать динамически во время выполнения.
А скрипт может быть преобразован таким образом, чтобы его реальная логика стала понятна только после нескольких этапов декодирования.
MITRE также документирует случаи, когда злоумышленники внедряют полезную нагрузку внутрь внешне легитимных файлов или используют скрытые и закодированные данные, которые восстанавливаются непосредственно перед исполнением.
Именно поэтому обфускация рассматривается в информационной безопасности не только как защитный механизм разработчика, но и как одна из техник сокрытия активности атакующего.
Почему одной проверки сигнатур недостаточно
Изменение статического представления программы усложняет обнаружение, основанное только на точном совпадении известных признаков.
Например, один и тот же вредоносный функционал может существовать в нескольких вариантах с:
- другими строками;
- измененным порядком инструкций;
- дополнительным мусорным кодом;
- другим упаковщиком;
- измененной структурой файла.
Это не означает, что обфускация делает вредоносный код невидимым.
Современные защитные системы могут анализировать не только содержимое файла, но и его поведение:
- какие процессы запускаются;
- какие дочерние процессы создаются;
- какие файлы появляются;
- какие команды выполняются;
- куда устанавливаются сетевые соединения;
- как изменяется система;
- какие действия происходят до и после подозрительного события.
MITRE в актуальной стратегии обнаружения T1027 отдельно рекомендует коррелировать исполнение скриптов и подозрительных процессов с созданием закодированных, сжатых или зашифрованных объектов, а также анализировать необычный синтаксис команд.
Поэтому обнаружение обфусцированных угроз обычно требует сочетания статического и поведенческого анализа.
Ограничения обфускации и деобфускация
Обфускацию легко переоценить.
На практике это не абсолютная защита, а способ увеличить сложность атаки.
Можно ли полностью защитить код обфускацией
Если программа должна выполняться на устройстве пользователя, процессор или среда выполнения в определенный момент должны получить необходимые инструкции и данные.
Это фундаментально ограничивает возможности защиты клиентской части.
Квалифицированный исследователь может:
- наблюдать за программой во время работы;
- ставить точки останова;
- анализировать память;
- перехватывать результаты расшифрования;
- отслеживать вызовы функций;
- модифицировать выполнение;
- исследовать отдельные фрагменты независимо от остального кода.
Поэтому OWASP прямо указывает, что даже сочетание нескольких методов обфускации не остановит исследователя с достаточным временем и ресурсами. Цель подобных мер — сделать дальнейший reverse engineering менее выгодным.
Это принципиальное отличие от подхода «security through obscurity», когда безопасность системы фактически строится на предположении, что атакующий не узнает, как она устроена.
Обфускация может быть дополнительным слоем защиты, но критически важные механизмы должны оставаться безопасными даже при понимании их общей архитектуры.
Что такое деобфускация
Деобфускация — исследование или преобразование обфусцированного кода и данных с целью сделать их более понятными для анализа.
Она может применяться:
- специалистами по реверс-инжинирингу;
- исследователями безопасности;
- аналитиками вредоносного ПО;
- разработчиками средств обнаружения угроз.
Деобфускация не всегда означает полное восстановление исходного проекта.
Обычно исследователю достаточно восстановить тот фрагмент логики, который отвечает на конкретный вопрос: например, понять, как работает механизм лицензирования или куда вредоносная программа отправляет информацию.
Для анализа могут использоваться:
- дизассемблирование;
- декомпиляция;
- статический анализ;
- динамический анализ;
- отладка;
- анализ памяти;
- снятие упаковки;
- восстановление строк;
- упрощение потока управления.
Иногда проще не пытаться математически обратить каждое преобразование, а запустить программу в контролируемой среде и наблюдать за уже восстановленными во время исполнения данными.
Недостатки обфускации
Более сложный код труднее анализировать не только злоумышленнику.
Неудачно настроенная обфускация способна повлиять и на сам продукт.
Возможные последствия:
- увеличение размера программы;
- дополнительная нагрузка на процессор;
- увеличение времени запуска;
- усложнение диагностики ошибок;
- проблемы с трассировкой (stack trace);
- затруднение отладки;
- нарушения работы механизмов, использующих reflection;
- несовместимость с отдельными библиотеками;
- усложнение процессов сборки и тестирования.
Насколько заметным будет влияние, зависит от выбранных методов.
Простое переименование идентификаторов практически не сопоставимо по стоимости с интенсивным управлением выполнением (control flow flattening) или динамическим расшифрованием большого количества элементов.
Поэтому максимальная сложность обфускации далеко не всегда является оптимальной.
Методы следует выбирать исходя из модели угроз и ценности защищаемого компонента.
Почему нельзя хранить секреты только за обфускацией
Особенно опасно рассматривать обфускацию как надежное хранилище секретов.
В клиентском приложении могут находиться:
- API-ключи;
- токены;
- пароли;
- криптографические ключи;
- адреса внутренних сервисов;
- конфиденциальные параметры.
Обфускация действительно способна затруднить их обнаружение. Но если секрет необходим приложению в открытом виде для выполнения операции, исследователь потенциально может получить его во время работы программы.
Поэтому критически важные секреты по возможности не должны передаваться клиентской части вообще.
Та же архитектурная логика применяется при защите от реверс-инжиниринга: сервер должен самостоятельно проверять права пользователя и допустимость критических операций, даже если похожая проверка присутствует в приложении.
Обфускация в таком случае становится дополнительным препятствием для исследователя, а не основой всей модели безопасности.
Вопросы и ответы
Что такое обфускация простыми словами?
Обфускация — это намеренное запутывание кода или информации, чтобы затруднить их понимание.
Например, понятные имена функций можно заменить бессмысленными, изменить структуру выполнения программы и преобразовать строки. Приложение продолжит работать, но человеку будет сложнее понять его внутреннее устройство.
Для чего нужна обфускация кода?
Основная задача — повысить трудоемкость анализа программы.
Обфускацию используют для защиты от реверс-инжиниринга, усложнения копирования алгоритмов и бизнес-логики, противодействия модификации отдельных механизмов приложения и повышения стоимости исследования программного продукта.
Может ли обфускация полностью защитить программу от реверс-инжиниринга?
Нет.
Она способна значительно усложнить анализ, но не гарантирует невозможность reverse engineering. Особенно это касается клиентского приложения, код которого выполняется на устройстве потенциального исследователя.
Поэтому обфускацию следует использовать как один из элементов многоуровневой защиты.
Обфускация и шифрование — это одно и то же?
Нет.
Шифрование предназначено прежде всего для обеспечения конфиденциальности информации и предполагает использование криптографического ключа.
Обфускация предназначена для усложнения понимания и анализа.
Эти методы можно использовать совместно — например, обфускатор может зашифровать строковые значения внутри программы, — но решают они разные задачи.
Является ли Base64 обфускацией или шифрованием?
Base64 — это способ кодирования данных.
Он не является шифрованием и сам по себе не обеспечивает конфиденциальность.
Однако Base64 может использоваться как простой элемент обфускации, если задача заключается в том, чтобы убрать очевидное текстовое представление из файла, команды или скрипта.
Что такое обфускатор?
Обфускатор — программа или инструмент, который автоматически преобразует программный код, чтобы затруднить его анализ.
В зависимости от возможностей обфускатор может:
- переименовывать идентификаторы;
- преобразовывать строки;
- изменять поток управления;
- внедрять дополнительный код;
- выполнять другие защитные преобразования.
Что такое деобфускация?
Деобфускация — анализ или преобразование запутанного кода с целью сделать его более понятным.
Она применяется при реверс-инжиниринге и анализе вредоносного программного обеспечения.
При этом не всегда требуется полностью восстановить исходный код. Часто достаточно определить назначение интересующего участка программы или получить скрытые данные во время ее выполнения.
Используют ли обфускацию вредоносные программы?
Да.
Злоумышленники используют обфускацию для затруднения анализа и обнаружения вредоносной активности.
MITRE ATT&CK относит такие действия к технике T1027 Obfuscated Files or Information и документирует различные варианты: упаковку ПО, обфускацию команд, закодированные и зашифрованные файлы, полиморфный и мусорный код и другие способы.
Заключение
Обфускация позволяет преобразовать программный код таким образом, чтобы сохранить необходимую функциональность, но сделать внутреннюю структуру значительно менее очевидной для исследователя.
Для разработчика это дополнительный уровень защиты интеллектуальной собственности и клиентского приложения от реверс-инжиниринга. Для злоумышленника те же методы становятся способом скрыть вредоносный код, усложнить статический анализ и попытаться обойти часть механизмов обнаружения.
При этом возможности обфускации имеют принципиальные ограничения.
Если программа выполняется на устройстве пользователя, полностью исключить возможность ее исследования нельзя. Квалифицированный специалист может использовать статический и динамический анализ, декомпиляцию, отладку и другие методы деобфускации.
Поэтому задача обфускации — не обеспечить абсолютную секретность программы, а повысить стоимость и продолжительность анализа.
Наиболее эффективна она как часть многоуровневой защиты вместе с безопасной архитектурой, корректной серверной валидацией, контролем целостности, защитой чувствительных данных и другими механизмами.
Если необходимо проверить, насколько настольное, веб- или мобильное приложение устойчиво к атакам и реверс-инжинирингу, специалисты «Гладиаторов информационной безопасности» могут провести тестирование на проникновение и анализ защищенности, выявить потенциальные точки атаки и сформировать рекомендации по усилению защиты.