Несколько недель назад компания Google выпустила новейшую версию своей флагманской мобильной операционной системы – Android 4.3. Некоторые считают, что на этот раз в новой версии системы совсем мало нового, однако с точки зрения безопасности налицо несомненные улучшения (в частности, наконец закрыта уязвимость MasterKey). Одно из наиболее заметных новшеств – появление SELinux. Многие наблюдатели приветствовали это событие как долгожданное, другие выступили с критикой того, как эта система реализована. Мне же кажется, что значение нового функционала оценить непросто, особенно в части его преимуществ для конечных пользователей. Чтобы внести ясность в этот вопрос, расскажем подробнее о том, что такое SELinux и от какого рода угроз эта система призвана защищать.
Начнем с основ: обеспечение безопасности любой системы на базе Linux строится на основе дискреционного, или избирательного, управления доступом (Discretionary Access Control, DAC). Это означает, что каждый пользователь сам решает, к каким из его файлов другие пользователи могут получать доступ (на чтение, запись или выполнение). В самой системе реализована защита от вмешательства: все системные файлы принадлежат пользователю root с привилегиями администратора. В основе операционной системы Android лежат те же принципы с единственным, но важным дополнением: каждое приложение получает собственный уникальный идентификатор (отметим, что исключения из этого правила все же возможны), что позволяет изолировать каждое приложение и защитить его данные от всех других приложений. Именно поэтому на устройствах, на которых пользователем не получены root-права, для легитимного приложения очень сложно или даже невозможно украсть конфиденциальные данные, используемые другим приложением (если, конечно, эти данные не помечены как world-readable, т.е. открытые для чтения без ограничений).
1 2 3 4 5 6 7 8 |
gattaca Users $ ls -las total 0 0 drwxr-xr-x 6 root admin 204 Aug 24 2012 . 0 drwxr-xr-x 31 root wheel 1122 Aug 16 12:56 .. 0 -rw-r--r-- 1 root wheel 0 Jun 20 2012 .localized 0 drwxr-xr-x+ 11 Guest _guest 374 Aug 24 2012 Guest 0 drwxrwxrwt 7 root wheel 238 Apr 9 15:58 Shared 0 drwxr-xr-x+ 87 stefano staff 2958 Aug 11 10:35 stefano |
Система SELinux построена на этой основе (а также на основе 15 лет исследований NSA в области безопасности ОС), но добавляет еще один уровень безопасности, называемый «мандатное управление доступом» (Mandatory Access Control, MAC). Этот уровень, конфигурируемый с помощью общесистемных политик, обеспечивает дополнительные возможности управления тем, как пользователи и приложения на Android-устройствах получают доступ как к собственным, так и предоставляемым системой данным, причем это делается незаметно для пользователей. В техническом плане это позволяет создавать политики, определяющие виды взаимодействий, разрешенные и не разрешенные для каждого процесса в рамках общего контекста безопасности. Простой, но показательный пример – демон системного журнала, работающий с правами root. SELinux позволяет сконфигурировать всю систему таким образом, чтобы данный процесс не мог получить доступ ни к чему, кроме файла журнала — для этого достаточно присвоить определенную метку файлу журнала и создать политику, разрешающую демону системного журнала получать доступ только к файлам, имеющим эту метку (конечно, в реальности все несколько сложнее :)). Отметим, что у такого подхода есть два преимущества: (1) политика применяется на уровне системы (и обязательна даже для пользователя с root-правами); (2) он обеспечивает значительно более тонкое разграничение доступа, чем при применении DAC.
Ограничение возможностей супер-пользователя (при всех его правах) играет ключевую роль в защите системы от атак с повышением привилегий. Именно это – наиболее сильная сторона SELinux. Возьмем в качестве примера Gingerbreak – распространенный эксплойт, применяемый для получения root-привилегий на устройствах с Android Gingerbread. Эксплойт посылает особым образом сформированное сообщение netlink демону управления громкостью (vold), работающему с привилегиями root. Из-за нереализованного контроля границ это сообщение может привести к успешному внедрению и выполнению произвольного кода. Поскольку процесс выполняется с root-привилегиями, злоумышленникам не составит труда запустить оболочку с атрибутом setuid-root, после чего получить полный контроль над системой. SELinux нейтрализовала бы этот эксплойт, заблокировав такое сообщение: применяемая по умолчанию политика (во всяком случае, в стандартном патчсете) запрещает открытие таких сокетов – проблема решена. Вдобавок, выполнение бинарных файлов, не являющихся системными, через этот процесс-демон может быть запрещено с помощью другой политики SELinux.
1 2 3 4 5 |
shell@tilapia:/ # ls -Z /system/ drwxr-xr-x root root u:object_r:unlabeled:s0 app drwxr-xr-x root shell u:object_r:unlabeled:s0 bin drwxr-xr-x root root u:object_r:unlabeled:s0 etc ... |
Здорово, правда? К сожалению, в действительности все далеко не так прекрасно. В реализации SELinux, входящей в состав стандартного дистрибутива Android 4.3, отсутствует несколько важных функций. Прежде всего, система SELinux настроена на работу в факультативном (Permissive) режиме, в котором не обеспечивается применение политик, а нарушения только заносятся в журнал (полезно только для целей тестирования). Кроме того, как показано выше, OTA-обновление некорректно устанавливает метку системного раздела. Я довольно долго пытался сообразить, что случилось с моим тестовым устройством, пока не обнаружил, что исследователь Pau Oliva опубликовал точно такие же выводы на DEF CON 21. Это значит, что у разработчика, который соберется тестировать эту реализацию SELinux, должна быть в запасе «стоковая» прошивка и средства ее восстановления. И вдобавок к тому, что имеющиеся политики никого ни в чем не ограничивают, в данной реализации отсутствует мандатное управление доступом (MAC) для промежуточного ПО (middleware) Android (эта функция реализована в патчсете NSA).
Что же все это значит для конечного пользователя? К сожалению, на данный момент практически ничего. В том виде, в котором эта система реализована в Android 4.3, SELinux годится только для целей тестирования и разработки политик. Безопасного способа обеспечить выполнение политик также нет. Пора приниматься за дело производителям устройств на Android. Google активно поощряет производителей к реализации SELinux (BYOD заказывали?) на основе функционала, реализованного в операционной системе, а не плохо написанных надстроек (подробное описание «проблем реализации» также можно найти в упомянутом выше докладе на DEFCON 21). Что касается разработчиков, им настоятельно рекомендуется ознакомиться с политиками, принятыми по умолчанию, и проверить свои приложения на соответствие этим политикам. Увидим ли мы когда-нибудь версию Android с SELinux в режиме обязательного применения политик? Надежда умирает последней 🙂
Android 4.3 и SELinux
Sto
Нет, ну серьезно???
«демону управления громкостью (vold)»