Новости были полны пугающих историй о том, как дыра в безопасности, обнаруженная в операционной системе Android, может привести к захвату вредоносными программами практически любого устройства. Заявления не слишком дикие, но что действительно интересно, так это то, что причина не в какой-то глубоко укоренившейся ошибке в системе безопасности может быть описана как глупая ошибка.
Одним из ключевых механизмов защиты в Android является подписание кода. Когда приложение Android установлено, его криптографическая подпись проверяется, чтобы убедиться, что она настоящая и не была подделана. Это довольно стандартная система безопасности, но на прошлой неделе Джефф Форристал из Bluebox Security обнародовал ошибку.
Основное утверждение заключалось в том, что приложение Android можно было изменить и установить без изменения его подписи. Большая проблема заключалась в том, что подробности эксплойта должны были быть представлены на брифингах Black Hat в августе. Многие люди задаются вопросом, что это за эксплойт. Может ли быть, что подпись, используемая Android, уязвима для изменения содержимого, которое каким-либо образом не влияет на значение вычисленной подписи? Если так, это будет большим провалом для криптографической реализации.
Теперь у нас есть представление о том, в чем проблема на самом деле, в виде демонстрационного скрипта, цель которого — доказать, что эксплойт практичен. Скрипт, созданный Pau Oliva Fora, использует только стандартные инструменты. Сначала он берет действительную программу, которую можно проверить, и декомпилирует ее с помощью APKTool. Затем вы можете перекомпилировать его, добавляя новые файлы, содержащие код полезной нагрузки, который делает все, что хочет, если исходное приложение имеет привилегии root. Затем новый файл APK можно загрузить в устройство Android без проверки подписи новых файлов.
Причина этого в том, что когда система запрашивает объект, соответствующий ключу, возвращается только один объект, даже если их два. Если первый объект — это файл, который проверяется правильно, то вторая версия того же файла вообще не проверяется. Это как если бы действительные файлы использовались для маскировки присутствия измененных файлов. Второй файл в APK устанавливается, даже если он проверяется первым.
Это серьезная проблема безопасности, и ее можно использовать, но это очень глупая ошибка, а не глубокая брешь в безопасности ОС. Очевидно, решение состоит в том, чтобы заставить проверку подписи обрабатывать все файлы в APK, даже если есть дубликаты, или, проще говоря, запретить дубликаты.
Некоторые OEM-производители уже поставляют исправление — например, Samsung, в том числе для устройств Google Nexus.