Чувствительная информация в исполняемом файле
![]() |
Критичность: СРЕДНИЙ |
Описание
Описываемая уязвимость связана с небезопасным хранением чувствительной информации в бинарном файле приложения. Несмотря на распространенное мнение о том, что из скомпилированного файла нельзя получить никакой дополнительной информации, это совершенно не так. Хранение чувствительных данных внутри бинарного файла может подвергнуть их риску несанкционированного доступа.
Анализируя бинарный файл, злоумышленник может применять техники обратной разработки для определения и извлечения чувствительной информации, встроенной в приложение. Достаточно часто в исполняемом файле сохраняются токены сторонних сервисов, ключи шифрования и даже данные тестовых стендов и учетных записей в приложении. Для получения информации о строках достаточно применить команду strings
на исследуемый файл (strings <path_to_binary>
) и получить все строковые ресурсы, которые в нем присутствуют или же воспользоваться утилитой rabin2
(rabin2 -zz <path_to_binary>
).
Рекомендации
Настоятельно не рекомендуется оставлять строки в бинарном файле в неизменном виде. Чтобы скрыть строки в исполняемом файле и усложнить жизнь злоумышленникам, существует несколько методов. К большому сожалению простого и реально работающего «из коробки» способа нет, однако есть несколько предположений, как это можно реализовать:
-
Шифрование — можно зашифровать строки в приложении и расшифровывать их во время выполнения, когда они необходимы. Остается вопрос хранения ключа шифрования, но его, например, можно получить частями с сервера, собрать на клиенте и положить в KeyChain, предварительно зашифровав при помощи Security Enclave.
-
Разделение строк — вместо хранения полных строк в бинарном файле можно разделить их на маленькие части и объединять во время выполнения. Например, можно разделить символы строки на отдельные массивы, а затем объединить их, когда строка будет необходима. Это сильно усложнит поиск строк в скомпилированном бинарном файле.
-
Кодирование строк — можно закодировать строки в приложении, используя различные техники, такие как Base64 или пользовательские схемы кодирования. Благодаря этому строки не будут представлены в открытом виде и злоумышленнику, чтобы получить необходимую информацию, потребуется выполнить несколько дополнительных шагов. Однако имейте в виду, что простые схемы кодирования можно достаточно просто обнаружить и получить исходное значение строки, поэтому лучше использовать более сложные алгоритмы.
-
Динамическое генерирование строк — вместо хранения напрямую в бинарном файле можно генерировать их динамически во время выполнения с помощью различных алгоритмов или вычислений. Генерируя строки во время выполнения, вы избегаете хранения фактических строк в бинарном файле, что делает сложнее их извлечение.
Также стоит отметить, что нет смысла шифровать абсолютно все строки внутри бинарного файла. Вполне достаточно защищать только важные данные. Можно комбинировать подходы и использовать для разных типов данных разные методы обфускации, кодирования или шифрования. Таким образом, мы не только получим понимание, какие именно данные внутри исполняемого файла для нас важны, но и существенно усложним жизнь злоумышленнику, ведь для каждой строки ему придется подбирать алгоритм, которым она была скрыта.
И не стоит забывать, что хотя эти методы могут затруднить задачу злоумышленникам при извлечении строк из бинарного файла, они не обеспечивают абсолютной защиты. Злоумышленники всё равно могут провести обратную разработку и при достаточных усилиях извлечь строки. Эти методы в основном направлены на повышение сложности и времени, необходимых для понимания и извлечения конфиденциальной информации из бинарного файла.
Существуют также различные инструменты, которые помогают решить задачу скрытия строк в бинарном файле, например:
-
iXGuard — коммерческий инструмент компании Guardsquare, который предлагает продвинутое шифрование строк и обфускацию для Android и iOS приложений. Он выполняет такие функции, как шифрование строк, шифрование классов, шифрование ресурсов и другие.
-
Arxan, теперь являющийся частью Verimatrix, предлагает комплексное решение для защиты приложений, включающее функции шифрования и обфускации строк. Они предлагают решения как для нативных iOS-приложений, так и для гибридных фреймворков, таких как Xamarin.
-
DashO, предлагаемый компанией PreEmptive Solutions, является коммерческим инструментом обфускации, который поддерживает обфускацию и шифрование строк для iOS-приложений.
Эти инструменты имеют дополнительные функции, такие как обфускация кода, защита от вмешательства и защита приложения во время выполнения (RASP). Они разработаны для улучшения безопасности iOS-приложения и усложняют процессы обратной разработки, вмешательства и извлечения конфиденциальной информации из бинарного файла.
Ссылки
- https://www.appdome.com/how-to/mobile-app-security/mobile-data-encryption/encrypt-designated-ios-strings-with-in-app-secrets/
- https://www.securing.pl/en/how-do-i-protect-an-ios-app-from-reverse-engineering/
- https://www.guardsquare.com/blog/ios-app-security-introduction-objective-c-metadata-symbols-swift-objective-c-apps-part-1-2
- https://www.guardsquare.com/ixguard
- https://www.verimatrix.com/cybersecurity/verimatrix-xtd/
- https://www.preemptive.com/products/dasho/