GuardDo Pixel — это кастомная защищённая ОС для телефонов Pixel в лучших инженерных традициях безопасного софта: опенсорсная, защищённая ото всех, начиная с самих разработчиков, ориентированная на защиту пользователя, а не «национальной безопасности».

Из текущей линейки разработок для защиты и уничтожения данных GuardDo, GuardDo Pixel — самая актуального для индивидуального использования — частного или профессионального. Телефон всегда в кармане, всегда включён, первым попадает в руки при досмотре, при задержании, при «простой проверке документов», на границе итд. И именно в этом контексте проявляется преимущество специализации, в отличие от других защищённых решений как GrapheneOS, начиная с полной невидимой невидимости защищённого пространства: из белого нельзя обнаружить серое — ни через интерфейс, ни через системные системные запросы. А для остальных сценариев — есть запатентованные функции моментального и безвозвратного стирания устройства.

После статьи про «GuardDo Pixel против GrapheneOS» в комментариях на Хабре появились вопросы, которые звучали примерно так:

Что-то в статье много воды, а по факту 0. Какие у системы механики безопасности кроме panic button и защиты от прослушки?

— прочитав которые, разработчики GuardDo Pixel не выдержали, и попросили написать про их разработку ещё раз. Если первая статья была про философию GuardDo Pixel против GrapheneOS, то эта — про то, как оно работает внутри.

В первую очередь, стоит сказать, что у GuardDo есть открытый репозиторий — git.guarddo.net/opensource. Код открыт — можно смотреть, проверять, аудировать. И даже сборки обновлений полностью открыты в реальном времени —  jenkins.guarddo.net (такого нет нигде, даже в grapheneOS). Поэтому разговор сегодня — технический и предметный.

Phones in both BFU and AFU states are safe from Cellebrite on updated builds, and as of late 2024, even a fully unlocked GrapheneOS device is immune from having its data copied.

Ссылка на статью Ars Technica от октября 2025 года. Хорошая статья, но там речь про конкретный сценарий: BFU (Before First Unlock) и AFU (After First Unlock) на обновлённых билдах. Да, GrapheneOS стал лучше с тех пор, как я писал про утёкшую таблицу Cellebrite 7.68.6 февраля 2024 года.

Но проблема, которую я описывал — видимость второго пространства — это не проблема Cellebrite. Это проблема момента, когда телефон уже разблокирован и в чужих руках. Cellebrite здесь вообще ни при чём: достаточно потянуть шторку и открыть меню переключения профилей. GrapheneOS это не скрывает — по дизайну. Это не баг, это особенность архитектуры. И именно её GuardDo решает иначе.

Часть первая: скрытые пространства — как это реализовано

Когда в прошлой статье я писал про «двойное пространство через пароль, не через меню» — это звучало как маркетинг. Объясняю, что за этим стоит технически.

Автопереключение с Keyguard

В стандартном Android смена пользователя — это: открыть настройки → выбрать профиль → ввести пароль от нужного профиля. Три шага, каждый из которых визуально демонстрирует, что профилей несколько.

В GuardDo Pixel это работает иначе. При вводе пароля на экране блокировки система верифицирует синтетический пароль через стандартный механизм Keyguard, но добавляет один шаг: проверяет, не принадлежит ли этот пароль другому скрытому пространству. Если принадлежит — запускается скрытый процесс переключения:

  1. Текущий профиль помечается разблокированным, чтобы экран блокировки исчез без попытки запустить лаунчер текущего пользователя.

  2. Keyguard уведомляется о предстоящем переходе — это блокирует повторный запрос пароля.

  3. Выполняется переключение пользователя через кэшированную аутентификацию — без визуальных артефактов и дополнительных шагов.

Для человека, держащего телефон: он ввёл пароль и попал в нужное пространство. Никаких меню, никакого намёка на то, что пространств несколько.

В GrapheneOS — и в стандартном AOSP — такого механизма нет. Переключение там всегда явное и заметное.

Маскировка белого пространства и полная изоляция

Одно из пространств (белое) выглядит как совершенно обычный сток Android. За это отвечает модуль внутри лаунчера, который для заданного списка пакетов подменяет иконки и названия на стоковые ресурсы через системный набор иконок и строк. Данные кэшируются для быстродействия.

Дополнительно: в белом пространстве полностью отсутствуют все нестандартные элементы интерфейса — QS-тайлы «Уничтожение» и «Паника», любые настройки, которых нет в AOSP. Переключатели многопользовательского режима скрыты. Обои — стандартные.

С точки зрения форензики, белое пространство никак не сигнализирует о наличии защищённого. В GrapheneOS — сигнализирует всем, кто знает, как выглядит GrapheneOS. А знают все, кому нужно знать.

Полная изоляция: пространства не видят друг друга никак — ни через интерфейс, ни через системные запросы. Из белого нельзя обнаружить серое. Каждое работает как отдельное устройство.

Часть вторая: функция уничтожения — три независимых барьера

В прошлой статье я описал сценарии уничтожения. Сегодня — что происходит внутри при нажатии тайла.

Вызов WipeData с флагом destroy_device = true. Это не заводской сброс. Разница критическая.

Барьер первый: криптографическое стирание ключей

На Android 11+ метаданные файловой системы шифруются через dm-default-key, а ключ для этого слоя хранится в разделе /metadata в виде KeyMint-блоба. Titan M2 защищает этот ключ на аппаратном уровне и участвует в derivation-цепочке.

Это форматирует /metadata и безвозвратно уничтожает KeyMint-блобы. Блоки данных на /data физически остаются — но без ключей это криптографический шум. Cryptographic erase — стандартный метод из NIST SP 800-88.

Барьер второй: снятие блокировки записи и физическая очистка

Системные разделы по умолчанию смонтированы только для чтения — и на уровне ФС, и на уровне блочного устройства. Перед переформатированием блокировка снимается принудительно.

После этого форматирование делегируется make_ext4fs или mkfs.f2fs, которые при создании новой ФС отправляют накопителю команду BLKSECDISCARD — secure discard, физическое затирание ячеек.

Барьер третий: AVB и заблокированный загрузчик

ОС подписана собственными приватными ключами AVB GuardDo. Загрузчик заблокирован, а возможность его разблокировки программно отключена.

Это означает: даже если кто-то разберёт телефон и попытается залить сторонний образ через fastboot — верификация AVB провалится. Зарегистрировать кастомный ключ можно только при разблокированном загрузчике. Разблокировать загрузчик нельзя. Titan M2 не выдаст ключи шифрования. На накопителе — шум.

Триггеры уничтожения

Все хранятся в Settings.Secure и недоступны без системных привилегий:

  • Специальный пароль — отдельный PIN на экране блокировки, ввод которого немедленно вызывает initiateDeviceSelfDestruct()

  • 5 неверных попыток — флаг ERASE_ERROR_PIN_LAYOUT, после пятой ошибки уничтожение, а не просто задержка

  • Отпечаток пальца — флаг ERASE_ON_FINGERPRINT; полезен при принуждении, когда заставляют приложить палец

  • Авиарежим — переход в режим полёта может быть настроен как триггер

  • QS-тайл — прямое нажатие в шторке

  • Удалённый сигнал — SMS или звонок с заданного номера (доп. Опция)

  • Таймер неактивности — автоуничтожение, если телефон не использовался заданное время

Часть третья: функция «Паника» — мягкое обнуление

Уничтожение — это кирпич навсегда. Паника — это другой сценарий: устройство остаётся рабочим, но пользовательских данных на нём больше нет.

По долгому нажатию тайла запускается panicPressed(). Последовательность:

  1. Перебираются все установленные пакеты через getInstalledPackages(0). Системные приложения определяются по флагу FLAG_SYSTEM и не трогаются. Остальные удаляются через deletePackageAsUser() с флагом DELETE_ALL_USERS — удаление для всех профилей, а не только текущего.

    packageManager.deletePackageAsUser(

        packageInfo.packageName,

        observer,

        PackageManager.DELETE_ALL_USERS,

        UserHandle.USER_SYSTEM,

    )

  2. Браузеры обрабатываются отдельно через clearApplicationUserData() — история, куки, кэш, сохранённые пароли.

  3. Очистка для каждого профиля через UserManager.aliveUsers. Внешнее хранилище — по путям /storage/emulated/{userId}. Удаляются: DCIM, Pictures, Movies, Music, Downloads, Documents, папки мессенджеров — WhatsApp, Telegram, Signal, Recordings, ScreenRecorder.

  4. Внутренние данные — по /data/user/{userId} для каждого профиля. Рекурсивно: cache, code_cache, files, databases, shared_prefs.

  5. Сброс индексов MediaStore. Вызывается resolver.delete() для всех четырёх URI: Images, Video, Audio, Downloads. Без этого галерея продолжала бы «видеть» удалённые файлы.

В результате, устройство включается, работает, выглядит чисто — но всех пользовательских данных нет.

Часть четвёртая: App Lock — системный сервис, которого нет в GrapheneOS

И GrapheneOS, и GuardDo реализуют многопользовательские профили и private spaces. Однако GuardDo добавляет к этому App Lock — глубоко интегрированный системный сервис в system_server, отсутствующий в AOSP. GrapheneOS для изоляции чувствительных приложений опирается прежде всего на отдельные профили, тогда как GuardDo даёт возможность точечно блокировать конкретные приложения прямо внутри одного пространства — с перехватом запуска, автоматической релокировкой и скрытием из лаунчера.

Перехват запуска приложений реализован через ActivityInterceptorCallback — каждая попытка открыть защищённое приложение перехватывается на системном уровне, до того как приложение успевает запуститься. Показывается экран аутентификации с IntentSender для возобновления после верификации.

Автоматическая релокировка работает через TaskStackListener. Как только защищённое приложение покидает передний план — запускается таймер. Два режима: по таймауту (минимум 5 мс) или мгновенно при выключении экрана.

Скрытие приложений из лаунчера: сервис ведёт список скрытых пакетов через getHiddenPackages. Приложения остаются установленными, но в интерфейсе их нет.

Пароль App Lock хэшируется через scrypt (N=2048, r=8, p=1) с 16-байтовой случайной солью. Прогрессивная задержка: 5 попыток → 30 сек, 10 → 1 мин, 15 → 5 мин.

Защита уведомлений: для заблокированных приложений содержимое уведомлений подавляется — виден только заголовок.

Конфигурация хранится в /data/system_de и требует системного разрешения MANAGE_APP_LOCK. Обычные приложения не могут получить доступ к конфигурационным файлам.

Часть пятая: блокировка QS и меню питания на локскрине

На заблокированном экране физический свайп для вызова панели быстрых настроек игнорируется полностью. Глобальное меню питания не вызывается. За это отвечает специализированный контроллер в SystemUI, который отслеживает состояние экрана через ScrimEventListener.

Если keyguardShowing или dozing — любая попытка открыть шторку не вызывает никакой реакции. Параллельно в showGlobalActionsInternal() при isKeyguardLocked() && isKeyguardSecure() диалог меню питания не отображается.

Почему это важно: Cellebrite и аналогичные инструменты используют разные векторы, в том числе через физические кнопки и быстрые настройки на локскрине. Здесь эта поверхность атаки закрыта.

Часть шестая: стабильность — то, о чём не говорят в маркетинге

Ещё один типичный вопрос из комментариев к кастомным прошивкам: «а оно вообще нормально работает?»

Подход GuardDo к базе — гибридный. Google ежедневно вносит правки в Android, часть из них интегрируется точечно. Если посмотреть на реальные коммиты — это сухой список того, что было сломано и исправлено:

  • Состояние гонки в уведомлениях (исправлено)

  • NPE в TextToSpeechManagerPerUserService (исправлено)

  • Краш QSAnimator (исправлено)

  • NPE в SettingsLib для фрагментов без разделителя (исправлено)

  • Краш при смене конфигурации через ConcurrentModificationException в SystemUI (исправлено)

  • Краш вторичного пользователя при заблокированном системном пользователе (исправлено)

  • NPE в ArtFastDataOutput.writeUTF() (исправлено)

  • Утечка памяти в car service — исправлено

  • Краш FlashlightControllerImpl при пустом списке ID камер — исправлено

  • Мерцание экрана при запуске горизонтальных приложений из вертикальных — исправлено

  • ConcurrentModificationException в LocaleStore — исправлено

И это — только небольшая часть. Плюс отключено отладочное логирование в десятках системных компонентов: SplashScreen, лаунчер, телефония, медиаплеер. Эти «невидимые» процессы незаметно нагружали процессор и расходовали батарею в любой кастомной прошивке, которая просто не занималась этим.

А что GrapheneOS?

GrapheneOS тоже не стоит на месте и переносит часть апстрим-патчей из AOSP. Но здесь важно понимать приоритеты: GrapheneOS сфокусирован на hardening — усилении ядра, изоляции процессов, sandboxed Google Play. Это их сильная сторона, и они делают это хорошо. Однако точечная работа по стабильности — перенос апстрим-фиксов в том объёме и с той скоростью, как это делает GuardDo — не является приоритетом GrapheneOS. Большинство патчей из списка выше — это апстрим-фиксы, которые Google вносит в основную ветку Android, но которые в кастомные прошивки не попадают автоматически: их нужно находить, оценивать и переносить вручную. GuardDo это делает системно.

Что касается отладочного логирования — GrapheneOS этим не занимается в сопоставимом объёме. Отключение debug-логов в десятках компонентов — SplashScreen, лаунчер, телефония, медиаплеер — это тихая работа, которая не попадает в анонсы, но ощутимо влияет на плавность и время работы от батареи.

Напомню: всё это — примерно 1% от реального объёма работы над прошивкой. И уже на этом 1% хорошо видно, чем системная разработка отличается от «взял AOSP, накрутил фичи».

7. Собственные серверы для мессенджеров

Отдельный момент, который не попал в прошлую статью. В GuardDo Pixel есть поддержка настройки собственных серверов для p2p-мессенджеров. Это означает: вы поднимаете свою инфраструктуру, прошивка умеет с ней работать. Никаких централизованных серверов третьих сторон в критически важных коммуникациях — если вы этого хотите. Для корпоративного сегмента, family-офисов это не опция, это требование.

Сравнение с другими кастомными ОС всё ещё актуально?

Оба проекта заслуживают уважения. GrapheneOS — технически сильная система с открытым кодом, hardened kernel, sandboxed Google Play. CalyxOS — удобнее для обычного пользователя, с microG вместо Google Play. Оба решают проблему слежки со стороны Google.

Но ни один из них не решает задачу, которую решает GuardDo Pixel: что происходит, когда телефон уже не в ваших руках.

GrapheneOS в этом сценарии даёт вам хорошо закрытую дверь с видимой вывеской «здесь что-то спрятано». CalyxOS — примерно то же самое, просто вывеска чуть более заметная. GuardDo строит другое: дверь, которую не видно, плюс кнопку, которая уничтожает всё за ней за секунды, плюс второй вход, который выглядит как обычная квартира.

Это разные задачи. GrapheneOS и CalyxOS отвечают на вопрос «как сделать Android приватным». GuardDo Pixel отвечает на вопрос «как сделать так, чтобы данные принадлежали только вам в любой момент времени — включая момент, когда телефон изымают». Таким образом, по совокупности защитных механик, ориентированных на сценарий изъятия разблокированного устройства, GuardDo предлагает уникальный набор инструментов, отсутствующий в GrapheneOS и CalyxOS.

Самое трудное в статье — как её закончить

Код открыт: git.guarddo.net/opensource. Сборки прозрачные — вы всегда можете видеть что собираться у вас в прошивке jenkins.guarddo.net Аудит возможен. Вопросы про «джентльменам верят на слово» — туда.

Архитектура, которую я описал выше, не существует ни в AOSP, ни в GrapheneOS, ни в CalyxOS.

GrapheneOS остаётся крепким стандартом противостояния Google и сетевой слежке. Но анонимных ОС — GuardDo Pixel на текущий момент на вершине: они предлагают инструменты, которых нет больше нигде, к тому же они улучшают детали, с которыми ни одна другая кастомная ОС не работает. 

Если остаются технические вопросы — разработчики читают комментарии.