До недавнего времени телефонная сеть предлагала абонентам ограниченный набор функций и сервисов, которыми трудно было злоупотреблять, а мобильные терминалы были достаточно закрыты и не позволяли запускать сторонние приложение. Фактически расшить возможности мобильных телефонов можно было только за счет Java-приложений, в которых взаимодействие с мобильной сетью было сильно ограничено, и разработчики в основном занимались созданием игр и редко использовали собственно коммуникационные функции телефона. Программное обеспечение мобильных устройств не имело единых стандартов, которые позволяли бы писать универсальные вредоносные приложения для различных производителей. Иногда возникали единичные проблемы с безопасностью, например в платформе Nokia Series 60, однако полноценных эпидемий не случалось. Операционная система Windows Mobile способна работать на разнообразных процессорных архитектурах, и каждый производитель фактически имел свой вариант этой встраиваемой ОС, поэтому и для нее было сложно реализовать вредоносную программу.
По сути, первой операционной системой, которая создавала «благоприятную почву» (распространенность ОС, унификация, наличие уязвимостей) для роста вредоносных программ, стала iPhone OS. Ее популярность, идентичность для всех моделей телефонов и наличие ряда известных уязвимостей (она основана на достаточно изученной Mac OS X) потенциально создавали среду для вирусных эпидемий. Однако этому воспрепятствовала стратегия компании Apple по распространению приложений — пользователи могли устанавливать приложения, получая их только из специального хранилища App Store. Вредоносы для этой ОС появились, но только тогда, когда операционная система была взломана и появилась возможность устанавливать на нее сторонние приложения из других источников. Собственно, именно метод взлома и открывал дырку для червя, однако таких телефонов оказалось недостаточно для глобальной эпидемии.
Сегодня на рынке появилась еще одна платформа для мобильных устройств — Google Android, которая базируется на открытых кодах, загружает приложения не только с Android Market (аналог App Store), но и с компьютера, и, скорее всего, в ней обязательно имеются уязвимости. Аналитики уверяют, что очень скоро появятся вредоносные коды для этой платформы, способные вызвать глобальную эпидемию. Впрочем, разработчики утверждают, что создали достаточно прочную защиту.
Начинка Android
Система Android базируется на ядре Linux, тем не менее ее разработчики сильно модифицировали некоторые базовые механизмы, что в конечном итоге привело и к усилению защиты. В частности, рабочая среда Android включает в себя драйверы оборудования, поддержку сетевого стека, файловую систему, а также механизмы управления памятью, процессорным временем и расходом электроэнергии. Все эти механизмы реализуются с помощью библиотек, написанных на языке Си/Си++, но все приложения для Android исполняются в виртуальной машине Dalvik VM, которая, по своей сути, является подмножеством Java 5 Standard Edition. В отличии от Java, в Android используются свои библиотеки классов и более компактный метод сохранения исполняемых файлов (выполняемые программы для Android имеют расширение .dex). Приложения для Android формируются в специальные пакеты, которые имеют расширение .apk и очень похожи на jar-файлы Java.
Каждое приложение Android имеет собственный идентификатор и запускается в собственной виртуальной машине. Для каждой такой машины действует принцип изоляции по потокам и низкоуровневому распределению памяти. Все взаимодействие отдельных процессов происходит только через ядро Linux, а не напрямую. В Android вместо одного пользователя с высокими привилегиями предусмотрено целых три: root, system и rild. ОС Android во время загрузки в память запускает мастер-процесс zygote, который порождает новые экземпляры Dalvik VM — по одному для каждого приложения. Кроме того, во время старта ОС запускается несколько системных процессов system_server, которые реализуют все необходимые сервисы операционной системы: процесс init, инициализирующий операционную систему; mountd, отвечающий за работу со съемными дисками; rild, управляющий взаимодействием с телефонной сетью и другими коммуникационными интерфейсами.
Android является клоном Linux и унаследует из этой ОС некоторые механизмы защиты, в частности, в Android, как и в Linux, используется идентификатор пользователя, а также группы пользователей. Правда, в отличие от Linux, пользователь — это не человек, работающий с телефоном, а отдельная программа, которая на нем запускается, поэтому разные программы, запускаемые владельцем телефона, имеют разные идентификаторы. Для этих пользователей-приложений устанавливаются права доступа к файлам на чтение, запись или исполнение, которые хранятся в атрибутах файловой системы.
Для каждого файла указываются права собственника файла, группы собственников или всех остальных пользователей. При этом собственниками системных файлов являются либо пользователь root, либо system, а для файлов каждого отдельного приложения назначается отдельный идентификатор, ассоциированный с данным приложением. В базовой поставке операционной системы пять процессов запускаются с идентификатором root, два — как system и еще два — под rild. Такое разделение идентификаторов процессов закодировано в ядре операционной системы, и любые попытки изменить пользователей для этих процессов приведут к идентификации атаки и будут автоматически исправлены. В частности, под идентификатором root запускаются такие программы-демоны, как init, mountd, debuggerd, zygote и installd. Подобная методика идентификации файлов и пользователей помогает более точно контролировать работу как самих суперпользователей, так и отдельных приложений, каждое из которых имеет свой уникальный идентификатор.
В Android используется отличный от принятого в Linux механизм распределения прав, называемый привилегиями. Так, есть привилегии для работы с мобильной сетью (например, CALL_PHONE), работы с изображениями (CAMERA) или доступа к Интернет (INTERNET), и, чтобы получить определенные привилегии, приложение должно их декларировать в своем описании. При установке приложения набор этих привилегий проверяется, и пользователю предлагается их подтвердить. Например, первый отечественный троянец, который рассылал SMS на платные короткие номера, при установке просил привилегии на отсылку SMS. А поскольку он представлялся как медиаплеер, то подобное разрешение должно было насторожить пользователя — зачем плееру нужны права на отсылку SMS?
Все эти механизмы позволяют решить основную проблему Linux — всесилие пользователя root. Поскольку каждое приложение запускается под своим идентификатором, то и запущенные процессы можно легко классифицировать по приложениям и определить для каждого из них правила контроля доступа к объектам ОС. При этом для доступа к радиосети нужно получить доступ не столько к идентификатору root, сколько к пользователю rild, который обеспечивает работу сетевых сервисов. Фактически в Android используется классическая модель разделения властей в государстве: root выполняет законодательные функции, занимаясь конфигурацией, rild — исполнительные функции, связанные сетью, а system — судебную, контролируя работу внутрисистемных сервисов.
Кроме того, производитель старается контролировать приложения, которые пользователь устанавливает на свой мобильный телефон, например через специальную торговую площадку Android Market, правда, аналитики компании «Лаборатория Касперского» заметили размещение в этой среде приложений, очень похожих на шпионские программы.
Проблемы безопасности Android
Одной из проблем защитных механизмов Android является низкая точность определения привилегий, в частности, если приложение получает доступ в Интернет, то оно может использовать любые порты как на вход, так и на выход, что позволяет использовать Интернет для самых разных задач. Например, если бы уже упомянутый троянец представлялся ICQ-клиентом, а не медиапроигрывателем, то доступ к Интернет для него был бы вполне логичным и кроме работы по протоколу ICQ он мог бы посылать другую информацию — такую деятельность метод защиты с помощью привилегий не блокирует.
Еще одним опасным местом Android является демон installd, который занимается распаковкой пакетов программ и их установкой в операционную систему. Он запускается от имени суперпользователя root, однако имеет дело с пакетами программ, которые могут быть получены из непроверенных источников. При этом в архиваторах и различных парсерах часто встречаются ошибки, что позволяет подозревать их наличие и в installd. В то же время обнаруженная в этом демоне ошибка открывает широкие возможности для проникновения вредоносных программ на мобильные телефоны, работающие под управлением Android, вплоть до реальной угрозы глобальной эпидемии для мобильных телефонов.
Проблемой может стать и система обновления Android, которая может быть выведена из строя вредоносным приложением, и такой прецедент уже был, когда неофициальное исправление ошибки в Android блокировало официальную систему обновления и пользователям приходилось устанавливать обновления вручную.
Дополнительные средства защиты
В Android, как и в Linux, можно использовать защитные инструменты, изначально разработанные для родительской операционной системы. В частности, одним из проектов по улучшению средств защиты на уровне ядра является Linux Security Modules (LSM), позволяющий дополнить ядро операционной системы различными функциями контроля системных вызовов. При этом модель идентификации для Android может быть настроена более точно, чем в Linux, в частности при определении правил доступа приложений и сервисов к ресурсам смартфона. Правда, для установки в Android данного приложения придется установить на смартфон совершенно другое ядро с интегрированной в нем системой LSM.
Еще одним дополнительным средством защиты для Linux является разработка SELinux, модифицирующая ядро ОС для интеграции различных механизмов контроля доступа. В частности, SELinux позволяет реализовать ролевую модель управления правами доступа и так называемую многодоменную систему управления безопасности, которую в России принято называть мандатной. Данная система защиты была перенесена группой ученых из Университета Бен-Гуриона на Android.
Валерий Коржов (oskar@osp.ru) – обозреватель Computerworld Россия (Москва)