Безопасность операционной системы android

Содержание
  1. Основы безопасности операционной системы Android. Native user space, ч.1
  2. Вступление
  3. Список статей
  4. Что подразумевается под Native user space
  5. Файловая система Android
  6. Процесс загрузки Android
  7. Заключение
  8. Ссылки
  9. Безопасность на мобильных устройствах
  10. Созданы, чтобы защищать
  11. Множество функций защиты
  12. Полная защита
  13. Защита от опасных приложений
  14. Защита от спама
  15. Защита от опасных сайтов
  16. Ваша конфиденци­­альность
  17. Выбор всегда за вами
  18. Задавайте настройки доступа для приложений
  19. Проверка неиспользуемых приложений
  20. Не передавайте данные в приложения, которыми не пользуетесь
  21. Безопасность на всех уровнях
  22. Мощная встроенная защита
  23. Профессиональная защита для всех
  24. Центр безопасности Google
  25. Блог Google о безопасности
  26. Для разработчиков
  27. Для технических специалистов
  28. Для компаний
  29. Экстренная помощь
  30. Помощь в экстренной ситуации
  31. Для разработчиков
  32. Для организаций
  33. Для прессы
  34. Экосистема
  35. Помощь
  36. Основы безопасности операционной системы Android. Уровень ядра
  37. Вступление
  38. Disclaimer
  39. Список статей
  40. Стек Android
  41. Безопасность на уровне ядра
  42. Заключение

Основы безопасности операционной системы Android. Native user space, ч.1

Вступление

В этой статье я попробую рассмотреть безопасность чуть-чуть повыше ядра, а именно: как работает безопасность в Native user space. Мы коснемся темы процесса загрузки операционной системы и рассмотрим структуру файловой системы Android. Как я уже говорил, я не очень силен в Linux, поэтому если заметите неточности, то исправляйте — меня научите и статью улучшите. Так как эта тема довольно обширная, я решил разбить её на две части. В первой части мы рассмотрим процесс загрузки операционной системы и особенности файловой системы. Всем кому интересно, добро пожаловать!

Список статей

Что подразумевается под Native user space

Под Native user space подразумеваются все компоненты пространства пользователя, которые выполняются вне Dalvik Virtual Machine, и которые не являются частью Linux kernel.

Файловая система Android

Для начала давайте рассмотрим структуру файловой системы Android. Хотя Android и базируется на Linux kernel, привычную нашему глазу структуру файловой системы мы здесь не увидим. Давайте запустим эмулятор и посмотрим, что у нас есть. Для этого выполним комманду:

В моем терминале для эмулятора на Android 4.2 я вижу следующий результат:

Я отмечу здесь только главные директории и те, которые нам пригодятся в будущем. В Интернете можно найти описание и предназаначение других директорий. Можно заметить, что некоторые директории такие же, как и в Linux, например, /dev, /proc, /sys, /mnt, /etc И их предназначение в основном такое же, как и в Linux. Кстати, отметьте, что мы не видим /bin и /lib директорий. Где они скрылись, я расскажу чуть позже.

C другой стороны можно заметить директории, которых в Linux вообще нет. Среди них нас интересуют /data, /system, /cache, /init, /init.rc Давайте рассмотрим их назначение поподробнее.
/system Это главная директория, где хранятся неизменяемые компоненты Android системы. Если проводить аналогию, то эта папка похожа на папку C:\windows\, доступную только для чтения. Т.е. изменять данные в этой директории мы не можем. Как раз здесь можно найти директории /bin и /lib, где хранятся различные исполняемые файлы и shared libraries. Кроме того, здесь же лежат системные приложения, которые встроены в операционку и которые, по умолчанию, нельзя удалить. Содержимое этой директории формируется во время компиляции операционной системы.
/data Т.к. /system у нас доступна только для чтения, то должна быть директория где хранятся изменяемые данные. /data как раз ею и является. Например, в эту директорию в /data/app сохраняются apk файлы устанавливаемых приложений, а в /data/data хранятся их данные (эту директорию мы подробно рассматривали в прошлой статье).
/cache Это просто временное хранилище. Также в эту директорию сохраняются, а потом из неё запускаются системные обновления.

Чтобы понять, что такое /init файл и для чего нужны непонятные файлы с расширением *.rc, рассмотрим процесс загрузки системы.

Процесс загрузки Android

Давайте рассмотрим несколько шагов процесса загрузки операционной системы Android. Эта картинка взята из книги «Embedded Android», там же можно найти и более детальное описание. Хотя в целом я и понимаю процесс, но для меня это больше магия 🙂

CPU. Когда вы нажимаете на кнопку включения, на процессор вашего устройства начинает подаваться напряжение. Так как до этого момента процессор был выключен, и так как он не способен сохранять свое состояние без подачи напряжения, то сразу после старта он находится в некотором неинициализированном состоянии. В данном случае процессор считывает из своего специального регистра некоторый жестко зашитый адрес и начинает выполнять инструкции начиная с него. Чаще всего, этот адрес указывает на чип, в который зашит bootloader (загрузчик).
Bootloader. Bootloader инициализирует RAM и загружает в неё Linux kernel. Кроме того Bootloader создает RAMdisk.
Linux kernel. Ядро инициализирует различные подсистемы, встроенные драйвера и монтирует root filesystem (корневую файловую систему). После этого ядро может запускать первую программу.
На этом магия заканчивается и дальше всё становится более-менее понятно.

Первой программой в случае Android является init. Исполняемый файл находится в корневой директории (/init). Именно эту программу стартует ядро после своей загрузки. Её исходники находятся в папке system/core/init/ Давайте в них слегка покопаемся. Нас интересует system/core/init/init.c:

Читайте также:  Наушники айфон перестали работать с андроидом

Вначале мы создаем и монтируем некоторые необходимые для работы директории, а потом парсим файл /init.rc и выполняем то, что распарсили. Формат /init.rc файла очень хорошо описан в readme, там же можно найти и пример. Если кратко, то этот файл представляет собой набор actions (секций — именнованная последовательность комманд). Каждая последовательность команд срабатывает по определенному trigger (триггеру). Например, следующая последовательно — это action, в которой trigger — это fs, а последовательность команд — это набор mount команд:

Исходный файл /init.rc находится в system/core/rootdir/init.rc Давайте рассмотрим некоторые основные его части, хотя я вам очень советую просмотреть его полность. После этого многие вещи вам должны стать понятны. Итак, начинается наш файл следующими строками:

Они означают, что кроме init.rc файла нужно также импортировать настройки из файлов init.usb.rc, init.trace.rc и из файла с непонятным именем init.$.rc Впрочем, $ — это просто переменная, значение которая определяет тип железа. В случае эмулятора, её значение, например, — goldfish. Далее определяются переменные окружения:

После этого происходит инициализация переменных, необходимых для работы устройства. Если вас заинтересует эта тема, то вы легко найдете информацию о той или иной комманде. Давайте подробно рассмотрим следующий блок (который я уже приводил в этой статье):

MTD — Memory Technology Devices. Если в общих чертах, то MTD — это специальный чип с энергонезависимой (т.е. данные на этом чипе сохраняются после перезагрузки или выключения) flash-памятью (типа NOR или NAND), на который сохраняются образы дисков. В этой статье более подробно рассказывается об этом типе устройств, а также об ограничениях. Специально для этих разновидностей flash-памяти были разработаны специальные файловые системы, например, YAFFS. Одно из самых важных ограничений этих типов памяти заключается в том, что для того чтобы записать данные в сектор, куда уже записаны какие-то данные, вам надо полностью сначала стереть весь сектор. Поэтому производители стали переходить на новый тип блочной flash-памяти (eMMC), на которые можно поставить обычную ext4 файловую систему и избавиться от указанного ограничения. Т.к. я показываю пример init.rc файла для эмулятора, где вся работа эмулируется, то в нем по умолчанию используется файловая система YAFFS2 (думаю, что это пережитки прошлого, т.к. YAFFS2 использовалась для всех устройств до Android 2.2). В реальном устройстве (это как раз один из примеров, когда необходимо использовать init.rc файл для определенного железа) эти комманды будут перезаписаны. Например, в случае устройства herring (Google Nexus S), в файле init.herring.rc эта секция выглядит следующим образом:

Где fstab.herring — это файл, содержимое которого выглядит следующим образом:

Как вы могли заметить, /system, /data, /cache — это просто mounting points (точки монтирования файловой системы), которые указывают либо на MTD устройства (в случае эмулятора), либо на блочные устройства (в случае настоящего устройства), куда записаны соответствующие дисковые образы (system.img, userdata.img и cache.img). Я не уверен, но думаю, что внутри смартфона находится один единственный чип с flash-памятью, разделенный на partitions (тома), в каждый из которых записан соответствующий образ. Этот чип с flash-памятью — то, что мы знаем под именем Internal storage (внутренняя память), объем которой — один из основных параметров смартфона.

Следует заметить, что /system смонтирован read-only (только для чтения). Это означает, что содержимое данного раздела не изменяется в процессе работы устройства, а только когда вы, например, обновляете систему на вашем устройстве (используя системные обновления).

Продолжим рассматривать наш init.rc. По триггеру post-fs-data формируется базовая структура файловой системы /data раздела. Там, в общем всё понятно — набор mkdir, chown, chmod команд.

Далее init.rc запускает несколько демонов. Если вернуться к рисунку в начале статьи, то они перечислены в блоке Native daemons. На этом мы пока остановимся. Как вы могли заметить из рисунка, я не полностью рассмотрел процесс загрузки операционной системы. Некоторые непокрытые этапы я рассмотрю в следующих статья.

Заключение

В следующей части я расскажу, откуда берутся образы system.img, userdata.img и cache.img и рассмотрю безопасность на уровне Native user space. Как всегда приветствуются исправления, дополнения, а так же предложения, о чем написать. И хотя у меня уже есть некоторый план, о чем писать в следующих статья, я готов его подкорректировать.

Ссылки

Update

  • Комментарий от пользователя bmx666 про различные варианты размещения загузчика на MTD устройствах.
  • Комментарий от пользователя SamOwaR про инициализацию CPU на разных SoC

Источник

Безопасность на мобильных устройствах

Созданы, чтобы защищать

Множество функций защиты

Встроенные функции обеспечивают безопасность всех ваших действий, будь то скачивание приложений, посещение сайтов или обмен данными. Если мы заметим угрозу, например вредоносное приложение или опасную ссылку, то предупредим вас и посоветуем, что делать дальше. Наши мощные внутренние механизмы безопасности защищают ваше устройство и данные, даже когда вы ими не пользуетесь.

Полная защита

Защита от опасных приложений

Google Play Защита ежедневно сканирует приложения, которые вы скачиваете. Если мы обнаружим вредоносное приложение, то сообщим вам об этом и расскажем, что делать. Кроме того, мы изучим его, чтобы в дальнейшем защищать вас ещё лучше. Не беспокойтесь – вы в безопасности.

Читайте также:  Лучший чистильщик кэша для андроид

Защита от спама

Отвечайте только на те звонки, которых ждете. Мы проследим, чтобы вас не беспокоили боты, и предупредим, если позвонят спамеры. Расшифровка звонков выполняется только на устройстве, поэтому ваши данные надежно защищены.

Защита от опасных сайтов

Google Безопасный просмотр предупредит, если вы соберетесь перейти на подозрительный сайт или скачать вредоносный файл. Так мы сможем защитить вас от вредоносного ПО и фишинга. Мы заботимся о том, чтобы ваши личные данные не попали в руки злоумышленников.

Ваша
конфиденци­­альность

Мы защищаем ваши данные от посторонних глаз, шифруя их и ограничивая список действий, которые приложения могут выполнять в фоновом режиме. Если вы не хотите сохранять информацию о посещении сайта или построении маршрута, перейдите в режим инкогнито в Chrome или Картах. Мы также создали инструменты, которые позволяют выбирать, кто и когда будет иметь доступ к вашим данным, и к каким именно.

Выбор всегда за вами

Задавайте настройки доступа для приложений

На устройстве Android вы можете сами выбирать, какая информация будет доступна приложениям. Например, вы можете открыть доступ к микрофону, камере или данным о местоположении – только на один раз или насовсем. Делитесь данными когда и как захотите.

Проверка неиспользуемых приложений

Не передавайте данные в приложения, которыми не пользуетесь

Если вы давно не открывали какое-то приложение на своем телефоне, Android может автоматически отключить для него доступ к вашим данным. Но в любое время вы сможете снова его включить. Android поможет вам поддерживать порядок на устройстве.

Безопасность на всех уровнях

Мощная встроенная защита

В Android есть множество функций для обеспечения безопасности. Благодаря шифрованию ваши данные надежно защищены, если телефон заблокирован. Кроме того, если вы сохраняете данные с телефона в облаке, они шифруются с помощью PIN-кода устройства. Доступ к ним есть только у вас. Каждое приложение на телефоне защищено на уровне операционной системы: доступ других приложений к информации о ваших действиях блокируется. Мы сообщим вам, если обнаружим несанкционированное вмешательство в операционную систему. Эти функции безопасности всегда активны и работают автоматически в фоновом режиме.

Профессиональная защита для всех

Центр безопасности Google

Мы постоянно улучшаем наши инструменты обеспечения конфиденциальности и технологии безопасности. Мы развиваемся вместе с интернетом, а вы всегда остаетесь под нашей защитой.

Блог Google о безопасности

Читайте новости и другую полезную информацию о безопасности и конфиденциальности в интернете.

Для разработчиков

Узнайте о надежных инструментах обеспечения безопасности и встроенных функциях защиты, полезных для разработчиков.

Для технических специалистов

Узнайте больше о защите данных и устройств в Android.

Для компаний

Встречайте защиту первоклассного уровня. Управляйте всеми своими устройствами. Узнайте, как Android защищает коммерческие данные.

Экстренная помощь

Помощь в экстренной ситуации

Мы создаем уникальные функции для вашей безопасности. Узнайте, как быстро получить помощь в экстренной ситуации с помощью телефона Android.

Для разработчиков

Для организаций

Для прессы

Экосистема

Помощь

Некоторые функции и устройства доступны не во всех странах. Наличие не гарантируется.

Наличие функций и поддержка технологий зависят от производителя оригинального оборудования и/или устройства.

Источник

Основы безопасности операционной системы Android. Уровень ядра

Вступление

Самой распространенной операционной системой для смартфонов на сегодняшний день является Android. Но не только этот факт подогревает интерес к ней. Открытость, возможность что-то настроить, подкрутить, и, естественно, сломать тоже в немалой степени способствуют увеличению популярности этой платформы. Я попробую поделиться опытом, как устроена эта операционная система, а так же рассмотреть систему безопасности. Всем, кому интересно, добро пожаловать! В этой статье я рассмотрю безопасность на уровне ядра.

Disclaimer

Термины я буду стараться писать на английком языке, так как боюсь ошибиться в их переводе. Если кто-то знает, как их красиво перевести на русский язык, напишите мне, и я дам перевод этих терминов. Желательно, чтобы у вас под рукой находились исходный код Android (хотя я и буду стараться давать ссылки на файлы в Интернете), потому что я иногда буду давать ссылки на файлы, где находится та или иная функциональность. Как загрузить исходный код, можно почитать здесь или вот в этой статье на Хабре.

Список статей

Стек Android

Ну никуда не деться от этой картинки. Я нашел её на просторах Интернета и нужна она для того, чтобы понять из чего состоит Android. Итак, в стеке Android выделяют четыре уровня (снизу-вверх):

  1. Linux kernel (Ядро Linux)
  2. Native Libraries
  3. Application Framework
  4. Applications (Приложения)

Linux kernel. Как неудивительно это звучит, но изначально, Android Inc. — это стартап. Как и во всех стартапах, в этой компании стояла задача максимально использовать уже существующие решения. Поэтому в качестве ядра этой платформы был выбран Linux из-за его открытости и наличия необходимой функциональности. В Android ядро Linux управляет памятью, процессами, а так же используется в качестве hardware abstraction layer (HAL). Насколько мне известно, в Linux драйвера либо встроены в ядро, либо разработаны в виде загружаемых модулей ядра. Так как в Android загрузка модулей ядра по умолчанию отключена, а если встраивать все драйвера, то ядро очень сильно разрастется, то было принято решение создать промежуточный слой (proxy) между ядром и драйверами, который и назвали HAL. Таким образом, HAL — это просто набор интерфейсов, имплементация которых реализована в драйверах. С другой стороны в ядро были добавлены некоторые системы, которые характерны только для Android систем. На данный момент, они пока не включены в основную ветку ядра Linux, поэтому просто скачать ядро Linux и заменить им ядро Android не получится. Среди них следует выделить, Binder (обеспечивает межпроцессное взаимодействие IPC/RPC), Asynchronous SHared MEMory — Ashmem (драйвер разделяемой памяти), Wakelocks (механизм, который позволяет предотвращать затемнение экрана и/или отключение процессора), Low Memory Killer, Alarm, Logger и т.д.

Читайте также:  Андроид тейбл что это

Native Libraries. К этому слою относятся различные нативные библиотеки, которые необходимы для работы Android. Они так же позаимствованы у open-source сообщества. Среди них мы можем найти SQLite, WebKit и т.д.

Android Framework. К этому слою относится то, с чем мы обычно взаимодействуем, когда пишем наши приложения для Android (PowerManager, ActivityManager, NotificationManager и т.д.).

Applications. Приложения бывают двух типов: те, что поставляются вместе с образом системы (системные) и приложения, которые мы загружаем из маркета или других источников. В первом случае, в устройстве приложения находятся в «/system/app» директории, во втором случае в «/data/app».

Безопасность на уровне ядра

Давайте рассмотрим процесс установки приложения на Android устройство. Существует несколько способов установить приложение на устройство (в общем случае):

  1. Используя приложение PackageInstaller
  2. Используя приложение Android Market
  3. Используя комманду adb install

На рисунке, например, приложение ex1.apk устанавливается с помощью PackageInstaller (используется в случае, если вам, например, по почте прислали приложение и вы хотите его установить с устройства), ex2.apk устанавливается с помощью Android Market (Google Play), и приложение ex3.apk устанавливается с помощью комманды adb install ex3.apk (обычно эта комманда используется разработчиками приложений для установки приложения с компьютера).

Во время установки, Android каждому приложению по умолчанию присваивает уникальные user ID (UID) и group ID (GID), таким образом каждому приложению в этой операционной системе соответсвует свой пользователь. Имя пользователя обычно имеет формат app_x, а идентификаторы пользователя вычисляется по формуле (Process.FIRST_APPLICATION_UID + x), Process.FIRST_APPLICATION_UID равен 10000. Эти идентификаторы приложения не изменяются. Список установленных приложений хранится в файле «/data/system/packages.list» и если у вас рутованый телефон, или вы работаете с эмулятором, то вы можете просмотреть этот файл, используя следующую комманду:

У каждого приложения есть своя домашняя директория, например /data/data/

— имя Android пакета, например com.ex.ex1 Имя Android пакета задается в свойстве package в файле AndroidManifest.xml Эта папка — Internal storage (внутреннее хранилище), директория, где приложение хранит все свои приватные данные, и к которому разработчики приложений получают доступ используя функции Context.getFilesDir() или Context.getDir() У этой папки права доступа определены как drwxr-x—x, т.е. только владелец и пользователи входящие в группу владельцев имеют полный доступ к этой папке. А так как каждое приложение определено как уникальный пользователь, то это означает, что приложения, по умолчанию, не имеют доступа к информации друг друга. Хотя при создании файла во внутреннем хранилище можно явно задать, что этот файл будет MODE_WORLD_READABLE и/или MODE_WORLD_WRITABLE

Кроме того, на уровне ядра уникальные UID и GID каждого приложения используются для разделения доступа к ресурсам системы (память и процессорное время). Таким образом, на уровне ядра для каждого приложения создается своя собственная песочница (Application Sandbox).

С другой стороны, разработчик приложения может указать, что некоторые ЕГО приложения должны иметь один и тот же UID. В AndroidManifest.xml файле для этого есть специальное свойство sharedUserId В этом случае, эти приложения будут иметь доступ к ресурсам друг-друга, но только если они подписаны одним и тем же ключом разработчика.

Некоторые permission (разрешения) так же работают на уровне ядра. Давайте, например, рассмотрим наиболее используемое разрешение android.permission.INTERNET Если приложение запрашивает это разрешение, то Android во время установки дополнительно включает это приложение в специальную группу «inet». Так же работают и некоторые другие разрешения. Список соответствия между этими разрешениями и соответствующими группами можно найти в файле frameworks/base/data/etc/platform.xml:

Список соответствия между именами этих групп и значениями (GID) задан в явном виде в файле system/core/include/private/android_filesystem_config.h в массиве структур android_ids[]:

Таким образом, если приложение пытается подключиться к Интернету, ядро проверяет, находится ли это приложение в группе с идентификатором AID_INET. Если нет, то приложению запрещается доступ. Код этой проверки очень тривиальный:

Заключение

Это моя первая статья на Хабре, так что не судите строго. Если сообществу интересно, то я продолжу в следующих статьях описывать внутренности Android. Я понимаю, что много не знаю, да и времени всегда не хватает, но я постараюсь поделиться тем, что уже пропустил через себя. Надеюсь, что узнаю что-то новое из комментариев! Если кому-то интересна какая-то определенная тема, то пишите в комментариях, постараюсь в будущих статьях учесть ваши пожелания.

Источник

Оцените статью