Чужой компьютер: почему ваш телефон вам не принадлежит — и что с этим делать

—

от автора

Чужой компьютер

Чужой компьютер

Вы держите в руках устройство, в котором прямо сейчас исполняется код по меньшей мере восьми разных авторов. Ваш — один: операционная система и приложения. Он же самый бесправный. Мы выяснили это не из презентаций, а на практике: написали свою ОС на Rust, загрузили её на обычный планшет Samsung Galaxy Tab S6 и полгода разбирались, кто ещё живёт внутри чипа и чьи правила там действуют. Эта статья — про то, как современное устройство устроено на самом деле, почему «мой телефон» — неточное выражение, и что с этим можно сделать, а что — честно нельзя.

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

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

Что сделали. Загрузили собственную ОС на Snapdragon 855, подняли Wi‑Fi с нуля — 32 000 строк вместо 950 на макетке — и составили карту всех, кто исполняется рядом с нами и что каждый из них может.

Что получилось. Восемь исполняющихся сущностей, семь — чужие; почти каждая может нас убить, мы — ни одну. Модель угроз, которая переносится на любой телефон, ноутбук и «умную» лампочку.

Восемь жильцов в одном чипе

Кто исполняется в телефоне, кроме вашей ОС — и что каждый может сделать с вами.

Школьная модель — «процессор исполняет операционную систему, ОС управляет железом» — устарела лет пятнадцать назад. Современная система-на-кристалле — это многоквартирный дом, и операционная система в нём — не хозяин, а один из жильцов. Причём не на верхнем этаже. Вот кто живёт в типичном флагманском Android на Qualcomm (у других вендоров имена другие, роли те же).

Кто

Что может с вами

Что можете вы

TrustZone (EL3, Qualcomm)

Проверяет подписи и запускает прошивки, ставит заборы в памяти, перезагружает чип без объяснений. Лог — зашифрован.

Просить: smc-вызовы по документированному списку.

Гипервизор (EL2, Samsung)

Владеет IOMMU — единственным забором между DMA чипов и вашей памятью. Наложил вето на наш запрет DMA для Wi‑Fi: мы записали bypass, прочитали обратно fault.

Ничего. Записи в его регистры молча переписываются.

Контроллер питания (AOP)

Держит все рельсы и такты. Наш неверный голос за один уровень напряжения обесточил цифровую логику всего SoC.

Голосовать. Не приказывать.

Загрузчик (S‑Boot)

Решает, что загрузится: ваша ОС, recovery или режим прошивки — по байту в микросхеме питания.

Ничего до момента, когда он передал вам управление.

Модем (80 МБ подписанной прошивки)

Сотовая связь, GNSS и вся логика Wi‑Fi. Требует четыре сервера от хоста; хранит свои файлы на вашем диске в разделах, которые переживают factory reset. Отказ на один запрос — смерть через 23 мс.

Обслуживать. Мы научились обслуживать так, чтобы он ничего не получал.

DMA‑каналы Wi‑Fi (12 штук)

Читают и пишут вашу RAM по физическим адресам — ядро, ключи, переписку. В стоковом Android — без трансляции (qcom,smmu-s1-bypass).

Отдать им ровно 4 МиБ и надеяться, что забор поставит кто-то другой.

Дисплейный контроллер

Свой DMA‑поток в память. Показывал логотип, пока мы не подменили содержимое.

Подменить кадр.

Микросхема питания (PMIC)

Единственная память, которая переживает сброс. Мы сделали её свидетелем: 72 байта «последних слов» перед каждым опасным шагом.

Читать и писать 1,5 КиБ.

Вы (EL1: ОС, приложения)

—

Просить, голосовать, обслуживать, валидировать, запирать то, до чего дотягиваетесь. Ни одного «запретить». Ни одного «проверить их код».

Планшет Galaxy Tab S6, Snapdragon 855. Адреса и регистры для каждой строки — в наших логах загрузки; в этой статье они не нужны.

Карта власти в устройстве: держатели ключей, жильцы с DMA, вы, внешний мир

Карта власти в устройстве: держатели ключей, жильцы с DMA, вы, внешний мир

Все стрелки из вашего блока — просьбы и обслуживание. Все стрелки в него — власть.

Заметьте направление стрелок. Всё, что исходит от вас, — просьбы, голоса, ответы на запросы. Всё, что входит, — власть: право перезагрузить, право прочитать память, право не загрузить. Это нормально для современного SoC. Ненормально — не знать об этом.

Четыре факта, которые мы проверили руками

Не из документации — из логов, регистров и десяти перезагрузок.

  • 32 000 — строк кода, чтобы Wi‑Fi‑чип заработал на планшете. На макетке с ESP32 та же задача — 950 строк. Разница — не сложность радио, а обслуживание привилегированного жильца: четыре сервера, загрузчик подписанных образов, семь рельс питания.

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

  • ∞ — живут файлы модема на вашем диске: разделы modemst1/2 не трогает ни factory reset, ни переустановка ОС. Linux и Android отдают их модему настоящими. Мы подсунули тень в RAM — и он не заметил.

  • 0 — заборов между Wi‑Fi‑прошивкой и памятью ядра в стоковом Android: «bypass» там оформлен как трансляция с выключенной трансляцией. Единственный, кто мог бы это изменить, — гипервизор. Он сказал «нет».

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

Wi‑Fi‑прошивка как жилец с ключами арендодателя

Wi‑Fi‑прошивка как жилец с ключами арендодателя

«Wi‑Fi‑чип» на современном SoC — половина модема с DMA, файловым сервером и своим радио.

Это не Samsung и не Qualcomm

Тот же принцип — в ноутбуке, в iPhone, в лампочке и в вашем браузере.

Соблазн — сказать «это про Android на Snapdragon». Нет. Протокол, который мы обслуживали, — Qualcomm’овский для любого хоста: он же на Windows‑ноутбуках с Snapdragon X Elite, он же на x86 с картами QCA (где трансляция DMA — opt‑in свойство драйвера), он же в iPhone с модемом Qualcomm (там перед модемом всегда стоит DART — Apple жильцу не доверяет). У Broadcom, MediaTek, Exynos — свои имена и та же архитектура: подписанная прошивка, DMA, свой uplink.

Спустимся ниже: ESP32 в «умной» лампочке — это блоб Wi‑Fi‑стека в вашем адресном пространстве, с вашими ключами, и три громких уязвимости в нём за пять лет. Поднимемся выше — и увидим то же самое в софте:

  • Расширение браузера с правом «читать и изменять все ваши данные на всех сайтах» — жилец с ключами от всех ваших страниц. Именно так устроено большинство «бесплатных VPN для Chrome», и именно за это магазины их регулярно удаляют.

  • Приложение с доступом к контактам, микрофону и фоновой сетью — процесс, чей код вы не читали, на устройстве, где ОС не может проверить, что он делает с данными после отправки.

  • Облако и чужие API. Каждый запрос к чужой модели ИИ — ваш документ на чужом сервере. «Мы не обучаемся на ваших данных» — это политика, не архитектура. Политику меняют одной строкой в договоре.

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

Общая формула: доверенная база, которую вы не выбирали и не можете проверить. Разница между устройствами — только в том, насколько щедро хост обслуживает жильца: даёт ли настоящий диск, транслирует ли DMA, проверяет ли сертификат сервера, к которому ходит сам.

Это не паранойя. Это модель угроз

Что документировано, что продемонстрировано, что структурно возможно.

Честно разложим по тому, что нужно атакующему. Ничего, кроме сети: местоположение по соте, законный перехват, SS7, IMSI‑catcher — документировано десятилетиями, модем делает то, для чего создан. Уязвимость в прошивке по воздуху: Project Zero в 2023 нашёл 18 zero‑day в baseband Exynos, четыре из них — RCE, зная только номер телефона; Broadpwn в 2017 — RCE в Wi‑Fi‑прошивке Broadcom одним кадром и дальше в хост через DMA там, где нет IOMMU. Уязвимости Hexagon DSP (CVE‑2023‑33063, CVE‑2024‑43047) Qualcomm описал как «ограниченно, целенаправленно эксплуатируемые»; по отчёту Amnesty International последнюю использовала сербская полиция через Cellebrite.

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

Модель угроз, в которой всё закрыто, — не модель угроз. Честный список «не можем» — часть результата.

Три этажа ответа

Понять, кто хозяин. Защититься там, где платформа чужая. Заменить платформу там, где это возможно.

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

Этаж 1 — понять. Почти всё из этой статьи проверяется на своём устройстве без разборки. Кто обслуживает модем, транслируется ли DMA Wi‑Fi, какие разделы переживают сброс:

for d in /sys/class/net/*/device; do  echo "$(basename $(dirname $d)): $(cat $d/iommu_group/type 2>/dev/null || echo 'no IOMMU')"done# DMA / DMA-FQ — транслируется; identity — физические адреса; нет файла — IOMMU нет

На Android (нужен adb shell или root):

# разделы модема, которые переживают factory resetls -l /dev/block/by-name/ | grep -E 'modemst|fsg|fsc'# нашлось — Wi‑Fi‑прошивка пишет в RAM по физическим адресамfind /proc/device-tree -name 'qcom,smmu-s1-bypass' | grep -iE 'icnss|wifi|wlan'

На Windows — Диспетчер устройств → Wi‑Fi‑адаптер → Сведения → «DMA Remapping Policy»: 2 — DMA транслируется, 0/1 или отсутствие свойства — физические адреса. На iPhone проверять нечего: DART перед модемом всегда, а какой модем внутри — по номеру модели и разборкам iFixit. В масштабе компании «понять» — это та же карта, только для парка устройств, агентов и сервисов: кто и до чего дотягивается, и какой риск остаётся после всех мер.

Этаж 2 — защититься там, где платформа чужая. Если жильца нельзя выселить, конфиденциальность строится выше него. Три правила, которые мы вывели, ломая собственный код:

  1. Шифруйте выше канала. Ключ от вашего Wi‑Fi‑трафика лежит в модеме — так у всех: у Linux, Android и у нас. Значит, содержимое защищает только TLS с проверкой сертификата и сквозное шифрование. Мы нашли у себя HTTPS без проверки сертификата на всех трёх платах — «зачем ломать забор, если дверь не заперта». Проверьте свои IoT‑устройства: там это норма.

  2. VPN — замок на канал, не шапка‑невидимка. Он закрывает трафик от провайдера и чужого Wi‑Fi и больше ничего не обещает: отпечаток браузера, часовой пояс, аккаунты и собственный uplink модема остаются. Хороший VPN не требует персональных данных (утечь может только то, что собрано), работает на семействе WireGuard и честно пишет, чего не делает.

  3. Согласованность сигналов. Если адрес говорит «Амстердам», а часы браузера — «Москва», вас выдали не туннель, а Intl.DateTimeFormat. Приватность — это не один инструмент, а непротиворечивая история всех сигналов устройства. Часовой пояс, язык, шрифты и часы должны рассказывать ту же историю, что и адрес.

Этаж 3 — заменить платформу. Там, где вы выбираете железо, можно выбрать и то, сколько жильцов в нём живёт. Мы пошли этим путём дважды:

Своя ОС. Наша написана с чистого листа на Rust. Одна и та же система загружается на флагманском планшете и на контроллере с 512 КБ памяти. Чужому жильцу — модему — отдаётся ровно столько, сколько нужно, чтобы он работал и ничего не получал: тень вместо диска, пустой список вместо отказа, 4 МиБ вместо всей RAM. Та же логика работает в умном доме: контроллер без облака и панель, прошивку которой обновляет владелец, а не бренд.

Свой ИИ. Собственный движок инференса на Rust (Vulkan и Metal), собственный рантайм агентов с постоянной памятью и capability‑песочницей, ночной цикл дообучения с A/B‑гейтом. Документы, которые обрабатывает ИИ, не покидают ваш периметр — потому что модель стоит у вас, а не потому, что кто-то обещал.

Свои инструменты. Редактор с браузером внутри для аудита веба, агенты, которые не могут вызвать то, на что нет гранта, супликант WPA в safe Rust без unsafe. Не потому что «своё лучше», а потому что чужое нельзя проверить — а мы обязаны знать, что делает каждый слой, за который отвечаем.

Это дорогой этаж, и мы не будем притворяться, что он для всех. Но он единственный, на котором список «не можем» становится короче, а не длиннее.

Что мы не можем

Список, который мы считаем частью результата.

  • Прочитать код TrustZone, гипервизора, модема — он подписан и закрыт. Мы обслуживаем его, валидируем всё, что он присылает, и запираем то, до чего дотягиваемся.

  • Запретить модему излучать. «Авиарежим» — просьба. Измерить можно только снаружи.

  • Закрыть DMA Wi‑Fi‑прошивки на планшете полностью: stage‑1 трансляция возможна (mainline Linux делает её на том же чипе), у нас она в плане и честно помечена «не сделано».

  • Сделать чужую платформу своей. На iPhone, в стоковом Android, в Windows остаётся этаж 2 — защита выше канала. VPN или расширение браузера не решают проблему, описанную выше, — и обещать этого не должны.

Мы — жилец на EL1, который научился не наступать на заборы, обслуживать соседа с DMA так, чтобы он ничего не получал, и честно записывать, до чего не дотягивается. Это меньше, чем хотелось. Это больше, чем есть у любой ОС, которая об этом не знает.

Если вы дочитали до этого места, вы уже на первом этаже: вы знаете, что в устройстве есть жильцы и кто из них главный. Дальше — по ситуации: проверить своё устройство командами выше, перечитать политику безопасности с поправкой на то, что «авиарежим» и «factory reset» — не то, чем кажутся, и в следующий раз, выбирая железо, спрашивать не только про частоту процессора, но и про то, сколько в нём жильцов и кто из них держит ключи. Вопросы по деталям — адресам, регистрам, конкретным прошивкам — задавайте в комментариях, разберём.

ссылка на оригинал статьи https://habr.com/ru/articles/1086340/