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

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

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

UPD 2. Два слова о том, кто говорит «мы». Небольшая команда, которая пишет собственную операционную систему на Rust с чистого листа: своё ядро без std, свой планировщик, хранилище, графика; ни Linux, ни его форков внутри нет. Одна и та же система работает процессом на macOS и Linux, в QEMU на ARM64, на микроконтроллере Cortex‑M4 со 128 КиБ памяти и на планшете Galaxy Tab S6.

Зачем планшет, если Android на нём и так работает? Заменять Android мы не собирались; он понадобился как инструмент. Увидеть, что именно чипы требуют от хоста и как реагируют на ответы, можно только одним способом: обслуживать их самому, без вендорских блобов, и всё описанное ниже мы нашли по дороге к работающему Wi‑Fi.

Язык здесь ни при чём: на C или в mainline Linux вы увидите в логах то же самое. Rust упомянут только чтобы было понятно, откуда взялись логи.

Ничего из этого не является свойством нашей ОС. Кто грузит чип, кто владеет IOMMU, где лежат файлы модема, у кого ключ от Wi‑Fi: всё это задано загрузчиком, TrustZone и гипервизором до старта любой операционной системы. Android, Linux, наша или чья угодно на этом железе могут только заметить это или не заметить; наша ОС ничего здесь не меняет и лишь дала возможность посмотреть. Поэтому читайте текст как разбор железа, а не как рассказ о чужой системе.

О чём эта статья. Кто исполняется в вашем устройстве помимо вашей ОС и что каждый из них может (таблица ниже собрана из наших логов загрузки). Как мы это измерили: тайминги, коды ответов, десять перезагрузок. Кто из атакующих на это способен, что каждому нужно и кому это реально грозит. Как проверить своё устройство за десять минут (команды в разделе «Понять, защититься, заменить»). И что с этим делать на трёх уровнях. Где мы чего-то не знаем, сказано прямо.

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

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

Что сделали. Загрузили собственную ОС на 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 такое устройство нормально; проблема начинается, когда владелец о нём не знает.

В таблице восемь строк, а не двадцать, потому что в неё попали только те, с кем мы физически столкнулись по дороге к Wi‑Fi. За кадром остались камера (в бюджетном MediaTek это около 15 миллионов строк кода со своим отдельным IOMMU), GPU, сенсорный контроллер, сканер отпечатка с собственным MCU, NFC, аудио‑DSP, сенсорный хаб (SLPI), контроллер накопителя UFS, SIM‑карта со своей операционной системой и апплетами и чип в кабеле USB‑C. Двадцать было бы точнее восьми.

У двух из них есть задокументированная история злоупотреблений: Simjacker в 2019 году отправлял команды SIM Toolkit через апплет S@T Browser, и карта силами модема отдавала местоположение и IMEI по SMS, без участия ОС, у операторов примерно в 30 странах; а баг прошивки eMMC у Samsung в 2012 году (MAG4FA/VYL00M) превращал обычный wipe в recovery в кирпич.

Полезнее делить жильцов не по объёму кода, а по двум признакам: есть ли у него DMA в память хоста и кто держит перед ним забор. SIM, SD‑карта и чип в кабеле в память не пишут; они разговаривают с хостом через модем, контроллер накопителя и PD‑контроллер, и после их компрометации нужно пробивать ещё один слой. Камера, GPU и Wi‑Fi пишут напрямую.

Почему тогда в статье именно Wi‑Fi, а не GPU? В дереве устройств того же Tab S6 картина у них разная: GPU и камера стоят за SMMU с трансляцией, которую настраивает ядро, а у Wi‑Fi стоит явный qcom,smmu-s1-bypass. Wi‑Fi не опаснее по природе; ему одному в стоковой конфигурации выключили забор. Mainline Linux на том же чипе трансляцию включает; это одна строка в device tree.

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

Четыре наблюдения из логов, регистров и десяти перезагрузок. Тайминги и коды ответов, а не домыслы.

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

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

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

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

Смерть видна по одному биту: слово SMP2P slave-kernel, которое модем выставляет над общей памятью, меняется с 6 («готов») на 7 («fatal»), и remoteproc фиксирует переход running → crashed. Причины в SMEM (SMEM_SSR_REASON_MSS0) нет: модем умирает раньше, чем стартует его собственный сервис ошибок. Таймлайн взят из лога нашего сервера rmtfs, который ведёт по каждому вызывающему список OPEN, RW_IOVEC и отказов:

  1. OPEN /boot/modem_fs1: открыт, прочитан заголовок (один сектор со смещением 512).

  2. OPEN /boot/modem_fs2: открыт, прочитан заголовок.

  3. OPEN /boot/modem_fsg: отказ no such partition. В GPT этого планшета раздела fsg нет вообще.

  4. +23 мс: slave-kernel = 7, running → crashed. Воспроизводится каждый раз.

Контрольный эксперимент и обход: тень вместо диска

Контроль: если сервер rmtfs не поднимать вовсе, модем живёт около 40 секунд и падает с efs sync failed. Почему отказ на fsg фатален мгновенно, а отсутствие сервера убивает только через 40 секунд, мы не знаем, код прошивки закрыт; утверждать можем только тайминг и воспроизводимость.

Обход: отсутствующий раздел открывается пустым, как тень из нулей размером с modemst1. EFS модема знает состояние «стёртая золотая копия»: читает заголовок, выбирает рабочую копию и идёт дальше. В коде остались оба ответа: Refusal::NoPartition, как отвечает rmtfs из утилит qrtr для Linux, и флаг blank_missing, включённый по умолчанию.

«Тень вместо диска» стало общим правилом всех наших серверов для модема. Модем сам до диска не дотягивается: он читает и пишет разделы через хост посекторно (OPEN → ALLOC_BUFF → RW_IOVEC с диапазонами секторов в общий регион RAM). При OPEN раздел один раз читается в RAM, и все дальнейшие RW_IOVEC, чтения и записи, идут в эту копию; пути записи на диск в коде нет.

Модем видит, что его записи «легли», диск не меняется, перезагрузка всё забывает. Цена: часть функций сотового модема без персистентного EFS работать не будет, и мы платим её осознанно. Содержимое modemst* мы не разбирали и ничего о нём не утверждаем; наблюдали только паттерн доступа.

«Авиарежим» — это запрос операционной системы к модему, а не рубильник. Единственный способ убедиться, что радио молчит, это измерить снаружи.

Как убедиться, что радио молчит? Только измерить снаружи: у модема есть собственный uplink в сеть оператора, и он структурно идёт мимо VPN, файрвола и любых ваших настроек. На iOS с 2019 года в авиарежиме Bluetooth и Wi‑Fi намеренно не выключаются; на Android модем уходит в low‑power mode силами собственной прошивки и сам решает, что делать с запросом.

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

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

То же самое в ноутбуке, iPhone и лампочке

Принцип не зависит от вендора; меняются только имена. И не зависит от ОС: Android, Linux, iOS или наша.

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

В ноутбуке жилец с DMA приходит ещё и через порт. Thunderclap в 2019 году показал, что устройство в разъёме Thunderbolt читает память хоста на macOS, Linux и Windows даже при включённом IOMMU, потому что ОС ставила забор слишком широко. Карта памяти пока «проситель» без прямого доступа к RAM, но с приходом SD Express она переезжает на PCIe и становится жильцом с DMA; через пару лет это будет отдельной строкой в таблице выше.

Мобильными SoC дело не ограничивается. На Raspberry Pi первым стартует VideoCore, графический процессор с собственной закрытой прошивкой и собственной ОС; именно он инициализирует память и запускает ARM‑ядра, а Linux общается с ним через mailbox. На Pi арендодатель загружается раньше жильца в самом буквальном смысле.

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

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

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

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

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

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

Есть и архитектурный ответ. Librem 5 и PinePhone выносят модем на USB, где у него нет DMA в память хоста, а аппаратные переключатели рвут питание радио; то самое «проверить можно только снаружи» там превращено в выключатель. Цена: другой класс производительности и стоимости (PinePhone от 150 долларов и Snapdragon‑уровень 2016 года, Librem 5 около 1 000 долларов), и жильцы внутри всё равно чужие.

Можно ли собрать телефон вообще без чужого кода? У PinePhone модем Quectel EG25‑G с закрытым baseband (открытая прошивка есть только для его прикладного ядра, DSP остаётся блобом), Wi‑Fi там Realtek с закрытой прошивкой; у Librem 5 модем на M.2 за USB и тоже закрытый. Единственное известное нам устройство, где код целиком ваш, это Precursor: SoC на FPGA, всё открыто, и ровно поэтому в нём нет сотового модема вообще. Открытого baseband с сертификацией оператора не существует.

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

Модель угроз

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

Сначала про пропорции. Подавляющее большинство задокументированных целевых атак на телефоны идёт через ОС и мессенджеры (Pegasus через iMessage, Predator через ссылки), а не через baseband. Прошивки модема и Wi‑Fi это слой, до которого патчи доходят последними (для не‑Pixel устройств лаг измеряется месяцами) и который не видит ни MDM, ни антивирус, ни сам владелец. Ниже пять классов атакующих по тому, что каждому нужно; всё в таблице задокументировано, без «ружья на стене».

Атакующий

Что ему нужно

Что он получает

Задокументированный случай

Доступ к сети оператора

Ничего: модем делает то, для чего создан

Местоположение, SMS, метаданные звонков

Перехват банковских mTAN через SS7 (O2 Germany, 2017)

Физический доступ

Час с телефоном и криминалистический комплекс

Всё содержимое и постоянный имплант

Сербская полиция и Cellebrite против журналиста, CVE‑2024‑43047 в Hexagon DSP (Amnesty, 2024)

Удалённый RCE в baseband

Номер телефона и эксплойт уровня вендора

Голос, SMS, трафик, выход в основную ОС

18 zero‑day в Exynos, четыре RCE по номеру (Project Zero, 2023)

Wi‑Fi по воздуху

Оказаться в радиусе вашей сети

Прошивка Wi‑Fi, дальше ядро через DMA

Broadpwn (2017), QualPwn (2019)

Персистентность

Однажды записать в разделы модема

Пережить factory reset

Структурно возможно; сброс уже не стирал данные (Cambridge, 2015)

Что реально задокументировано. Чего в списке нет: соседа, взламывающего ваш модем, и массового червя через baseband.

Значит ли это, что вас лично взломают через модем? Скорее всего, нет. Следует другое. Привычная модель безопасности («поставил VPN», «включил авиарежим», «сделал сброс перед продажей») строится на предположении, что эти действия управляют железом. Они управляют запросами к железу, и разница становится важной ровно в тот момент, когда от неё что-то зависит. Кому что грозит, по группам:

  • Обычный человек. Реальная угроза только первая строка таблицы, сеть оператора. Меры: второй фактор не по SMS, мессенджер со сквозным шифрованием, TLS везде. Стоимость: час. Остальные классы для него теория.

  • Журналист, адвокат, админ с ключами от продакшена, любой, у кого телефон могут изъять. Классы со второго по четвёртый применялись против ровно этих групп, есть отчёты с именами. Меры первого и второго уровня из следующего раздела стоят часы; третий уровень (устройство с модемом за забором) стоит денег. Соразмерно.

  • Компания с парком устройств. Практический риск в лаге патчей baseband и в том, что инвентаризация «какой модем, транслируется ли DMA» обычно не ведётся вообще. Мера: провести её один раз командами из следующего раздела.

Чего в реальной опасности нет: соседа, взламывающего ваш модем, массового червя через baseband, слежки через камеру силами прошивки Wi‑Fi. Ничего такого не задокументировано, и статья этого не утверждает. Есть и требование к вендорам, которое не стоит ничего: включить stage‑1 трансляцию SMMU для Wi‑Fi в стоковой прошивке. Это один дефолт в device tree, а не закон об открытом коде модема.

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

Понять, защититься, заменить

Три уровня ответа: первый нужен всем, второй большинству, третий тем, кто выбирает железо. Первый уровень это десять минут и команды ниже.

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

Уровень 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 reset
ls -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. Шифрование канала (WPA, LTE) не защищает содержимое от самого модема. Сессионный ключ Wi‑Fi вычисляет и хранит прошивка модема; так на любой ОС, включая нашу. Содержимое защищено ровно тем, что было зашифровано до попадания в модем: TLS с проверкой сертификата и сквозное шифрование в мессенджере. У себя мы нашли HTTPS без проверки сертификата на всех трёх платах; в IoT это обычная практика, проверьте свои устройства.

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

  3. Сайты сверяют сигналы устройства между собой. IP‑адрес сравнивается с часовым поясом из 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 остаётся второй уровень, защита выше канала. VPN или расширение браузера эту проблему не решают, и обещать этого не должны.

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

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

UPD 24.09: дополнил статью по замечаниям в комментариях: таймлайн смерти модема и механика «тени вместо диска» (спойлер в разделе «Что мы проверили руками»), VideoCore на Raspberry Pi и Librem 5 / PinePhone в разделе про ноутбук, iPhone и лампочку. UPD 2: добавил два абзаца в начале, кто мы и почему описанное не зависит от ОС. UPD 3 (25.09): вычистил текст по чек-листу из комментариев: тире, конструкции «не X, а Y», афоризмы в концовках абзацев, заголовки по одной формуле, жирный на каждом термине. UPD 4 (25.09): по итогам обсуждения в комментариях: абзац «О чём эта статья» в начале, таблица пяти классов атакующих с документированными случаями в разделе «Модель угроз», таймлайн смерти модема вынесен из спойлера в основной текст (в спойлере остались контрольный эксперимент и обход), наблюдение про авиарежим оформлено отдельно и дополнено, убраны подписи под цитатами. UPD 5 (25.09): перенёс в статью то, что разобрали в комментариях: жильцы, не попавшие в таблицу (SIM и Simjacker, eMMC, камера, GPU, USB‑C) и деление их по DMA и забору; Thunderclap и SD Express; что именно закрыто в PinePhone и Librem 5, Precursor; пропорции атак (ОС и мессенджеры против baseband) и кому что грозит по группам; при чём тут Rust (ни при чём). Раздел «Уровень 2» переписан из трёх лозунгов в обычные предложения. UPD 6 (25.09): прошёлся по тексту скриптом проверки стиля: разбил семь абзацев длиннее 80 слов, убрал две конструкции «не X, а Y», добавил вопросы там, где текст на них отвечает, и цены Librem 5 и PinePhone в раздел про архитектурный ответ.

Комментарии (46)


  1. kinoz
    24.09.2026 16:10

    Очень плохой и ленивый ИИ-слоп. Причём тут вообще Rust? Автор, что ты хотел сказать этой статьёй?

    Железо закрытое? Окей.

    Рядом с нашим софтом сидит «Большой брат»? Тоже окей. Но такая ситуация характерна практически для всего массового мобильного железа. Даже в Raspberry Pi есть VideoCore (VPU), на котором работает собственная прошивка с ОС, а взаимодействие с ним осуществляется через mailbox.

    С модемом вообще ничего не понятно:

    • Что значит «модем умирает»? Как именно это проявляется?

    • Где логи? Где вывод dmesg?

    • Каким образом ты запрещал модему доступ к разделам?

    • Где анализ содержимого разделов modemst*?

    И наконец, где разбор существующих свободных смартфонов и планшетов? Где хотя бы сравнение их архитектуры и подходов к обеспечению открытости железа и ПО?

    В итоге вместо технического исследования получился набор общих утверждений без диагностики, доказательств и внятных выводов. А при чём здесь Rust, так и осталось загадкой.

    Автор, ты вроде на Хабре с 2024 года. За это время уже можно было научиться хотя бы на чужих неудачных примерах.




    1. scv9 Автор
      24.09.2026 16:10

      Спасибо за разбор — по существу отвечу по пунктам, часть претензий справедлива.

      Что хотел сказать. Не «железо закрытое» — это все знают. Тезис уже: хостовая ОС на таком SoC не управляет прошивками, а обслуживает их, и направление доверия обратное — прошивка проверяет хост на каждом шаге и на неудачный ответ отвечает не ошибкой, а смертью, а у хоста права вето нет. Из этого следуют практические вещи, которые обычно не проговаривают: «авиарежим» — запрос к модему, factory reset не трогает его разделы, VPN не закрывает его uplink. Статья обзорная, намеренно без дампов — за это упрёк принимаю.

      VideoCore — да, ровно тот же случай, и даже жёстче: на Raspberry Pi VPU ещё и грузит ARM-ядра, то есть буквально арендодатель. Это подтверждает тезис, а не опровергает: так устроено практически всё массовое железо, и ненормально не это, а то, что модель безопасности хоста делает вид, что этого нет.

      При чём Rust. Язык здесь не аргумент, вы правы. ОС написана на нём, хаб выбран по этому признаку — спорно, согласен. Единственное место, где язык имеет значение по делу, — WPA-супликант и серверы для модема без unsafe: весь парсинг того, что присылает прошивка, в safe-коде.

      «Модем умирает» — конкретно. Признак: слово SMP2P slave-kernel над общей памятью меняется с 6 (готов) на 7 (fatal); remoteproc фиксирует running → crashed. Причины в SMEM (SSR reason) нет — модем умирает раньше, чем стартует его сервис ошибок. Таймлайн из лога нашего rmtfs-сервера (он ведёт по каждому вызывающему список OPEN / RW_IOVEC / отказов): OPEN /boot/modem_fs1 — ок; /boot/modem_fs2 — ок; /boot/modem_fsg — отказ no such partition (в GPT этого планшета раздела fsg нет вообще); через 23 мс — fatal. Воспроизводится каждый раз. Для сравнения: если rmtfs не поднимать совсем, модем живёт ~40 с и падает с efs sync failed. Что именно внутри прошивки делает отказ на fsg фатальным — не знаю, код закрыт; утверждаю только тайминг и воспроизводимость.

      dmesg нет — это не Linux, ядро своё; логи — наши. Могу выложить выдержку (состояния remoteproc + лог сервера) отдельным постом, если это интересно.

      «Запрещал доступ к разделам» — неточная формулировка с моей стороны, запретить там нечего: модем сам до диска не дотягивается, он читает и пишет через хост посекторно (OPEN → ALLOC_BUFF → RW_IOVEC с диапазонами секторов в общий регион RAM). Сделано так: при OPEN раздел один раз читается в RAM, все дальнейшие RW_IOVEC — и чтения, и записи — идут в эту копию; пути записи на диск в коде нет. Отсутствующий fsg открывается как тень из нулей — EFS модема знает состояние «стёртая золотая копия», читает заголовок, выбирает рабочую копию и идёт дальше. Модем считает, что его записи легли; диск не меняется; перезагрузка всё забывает. Это осознанная цена — часть функций сотового модема без персистентного EFS работать не будет.

      Содержимое modemst* не разбирал и не утверждал этого. Наблюдал только паттерн доступа: по одному сектору со смещением 512 из fs1, fs2, fsg (заголовки), затем полное чтение выбранной копии. Формат EFS2 публично разобран до меня, это не тема статьи.

      Свободные телефоны — да, это пробел. Librem 5 и PinePhone решают ровно эту проблему архитектурно: модем на USB, без DMA в память хоста, и аппаратные kill-switch — то самое «проверить можно только снаружи», превращённое в выключатель. Но это другой класс по цене и производительности, и прошивка модема там всё равно закрытая. Сравнение подходов к открытости — хорошая тема для отдельной статьи, спасибо за идею.


      1. VsBirdEye
        24.09.2026 16:10

        PinePhone по сути мертворожденный проект - поиграться можно, реально использовать невозможно - глюки, тормоза, отсутствие самых простых вещей.

        GrapheneOS на устройствах Pixel отчасти решает описанную вами проблему без изобретения велосипеда.


        1. scv9 Автор
          24.09.2026 16:10

          Про PinePhone как повседневный телефон спорить не буду — согласен, это игрушка для энтузиастов. Я привёл его и Librem 5 не как рекомендацию, а как пример архитектурного решения: модем на USB без DMA в память хоста и аппаратные выключатели радио. Идея верная, реализация на сегодня — для тех, кто готов терпеть.

          GrapheneOS на Pixel — да, это лучший ответ на массовом железе, и слово «отчасти» тут точное. Что он решает из описанного: свой корень доверия (бутлоадер запирается пользовательскими ключами, verified boot до системы), модем и Wi‑Fi на Pixel стоят за IOMMU — то есть тот самый «забор», которого нет в стоковом Android на WCN39xx, там есть; Titan M2; LTE‑only; и минимум чужого кода в userspace. Для телефона, которым пользуешься сегодня, я бы рекомендовал ровно это.

          Чего он не меняет — и это как раз тема статьи: жильцы остаются жильцами. Baseband на Pixel 6/7 — Exynos, тот самый, в котором Project Zero нашёл 18 zero‑day с RCE по номеру телефона; TrustZone, гипервизор (pKVM, к чести Google, открытый) и загрузчик — не пользовательские; EFS модема лежит на диске по‑настоящему, а «авиарежим» остаётся запросом. GrapheneOS честно так и пишет в документации: они укрепляют то, что контролируют, и полагаются на аппаратную изоляцию для того, что не контролируют. Это второй этаж из статьи, сделанный очень хорошо, — но не третий.

          Насчёт велосипеда: ОС писалась не для того, чтобы починить телефон. Планшет был инструментом — единственный способ увидеть, что именно модем требует от хоста и что он делает с ответами, это обслуживать его самому, а не через вендорские блобы. На GrapheneOS всё то же самое происходит, просто внутри закрытого rmt_storage, и вы этого не видите. А третий этаж — своя платформа — в статье про устройства, где железо выбираете вы: контроллеры, дом, а не смартфон.


        1. Grigo52
          24.09.2026 16:10

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


    1. Grigo52
      24.09.2026 16:10

      Автор руками поднял Wi-Fi на голом чипе Snapdragon и снял реальные дампы, так что не ругайте статью за пару нейросетевых оборотов)


      1. kinoz
        24.09.2026 16:10

        пару... ну-ну, вчера, это был кусок нейроговна, а после ответа в коммента на мою критику мне казалась, что автор тупо отдал руль агенту ;-)

        Автор руками поднял Wi-Fi на голом чипе Snapdragon и снял реальные дампы

        вот тут вообще тема не раскрыта, интересно же как он это слелал


        1. scv9 Автор
          24.09.2026 16:10

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

          Теперь про Wi-Fi, коротко и по этапам, потому что «поднять Wi-Fi на 855» на деле означает «загрузить и обслужить модем». WCN3990 там не отдельный чип: WLAN это protection domain внутри MPSS, одна прошивка modem.mbn, внутри неё WLAN.HL.3.2.0. Поэтому порядок такой.

          1. Питание. Каждая рельса это голос по имени из базы cmd-db через RPMh, командует ими AOP. Семь рельс и два опорных такта, плюс load_state modem on. Один неверный уровень в голосе обесточил цифровую логику всего SoC, узнали по тишине на UART.

          2. Загрузка образа. PAS через SCM: init_image с метаданными, сегменты в carve-out на 160 МиБ, потом auth_and_reset. Метаданные пришлось вынести в отдельное 2 МиБ non-cacheable окно вне кучи: пока они лежали в Vec, аллокатор переиспользовал буфер, запись попадала в защищённую страницу и чип молча перезагружался.

          3. IPC снизу вверх: SMEM (карта общих регионов), SMP2P (тот самый бит slave-kernel 6/7), GLINK поверх SMEM, QRTR как маршрутизатор, QMI как протокол сервисов. Всё, что модем написал в общую память, считается недоверенным и проверяется по окну до разыменования.

          4. Четыре сервера, которые модем требует от хоста и без которых не стартует: rmtfs (сектора modemst1/2/fsg; у нас тень в RAM вместо диска), tqftp (TFTP поверх IPC для файлов прошивки, причём он пишет server_check.txt и без успешной записи не грузится), pd-mapper (карта доменов; без ответа на kernel/elf_loader WLAN не поднимается), memshare (модем просит владение регионами RAM, хост передаёт его через secure world вызовом assign_mem).

          5. Хендшейк wlfw по QMI: регистрация индикаций, cap request, загрузка BDF (board data), M3, wlan_mode mission, ожидание fw_ready. Каждый шаг помечен словом в SDAM микросхемы питания: после тихого ресета следующая загрузка читает, на каком шаге умерли. Второе ядро ARM работает watchdog'ом и именует зависший шаг.

          6. Собственно WLAN: 12 copy engines, кольца дескрипторов в наших 4 МиБ, HTT для данных, WMI для управления. Это то, что в mainline делает ath10k_snoc, переписано на Rust под нашу ОС.

          7. WPA: свой супликант в safe Rust, 4-way handshake, PTK и GTK ставятся в прошивку через VDEV install key. Шифрует hwcrypto внутри модема, отсюда фраза про ключ в модеме.

          Итого около десяти тихих ресетов и 32 000 строк против 950 на ESP32. Если интересен конкретный этап, спрашивайте, разверну с адресами.


  1. DerTosser
    24.09.2026 16:10

    Страшно, очень страшно... (с)


    1. scv9 Автор
      24.09.2026 16:10

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

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


  1. Aeternamens
    24.09.2026 16:10

    Очень интересно и ничего не понятно.

    Кто мы, что за ОСь... Вопросов больше, чем ответов.


    1. scv9 Автор
      24.09.2026 16:10

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

      Мы — небольшая команда, пишем свою ОС на Rust с чистого листа: не Linux и не форк чего-либо, своё ядро, no_std, свой планировщик, стор и графика. Одна и та же система работает как процесс на macOS/Linux, в QEMU virt на ARM64, на Cortex‑M4 с 128 КиБ RAM (экран плюс ESP32 для Wi‑Fi) и на планшете Galaxy Tab S6 (Snapdragon 855) — о нём и статья. Задача планшета была не «заменить Android», а посмотреть, что реально требуется от хоста, чтобы на таком SoC поднять хотя бы Wi‑Fi без вендорских блобов с нашей стороны, — и всё, что описано, вылезло по дороге. Исходники пока не выкладывали; когда выложим, Wi‑Fi‑стек и серверы для модема будут там целиком.

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


    1. scv9 Автор
      24.09.2026 16:10

      И главное, что хочу подчеркнуть отдельно: суть статьи не в том, кто мы и какая у нас ОС. Всё описанное — свойства оборудования, которое по-другому сконфигурировано быть не может: кто грузит чип, кто владеет IOMMU, где лежит EFS модема, кто держит ключ Wi‑Fi, что такое «авиарежим». Это задано загрузчиком, TrustZone и гипервизором до того, как стартует любая ОС, и никакая ОС на этом железе — Android, Linux, наша или чья угодно — изменить это не может, только заметить или не заметить.

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


      1. Aeternamens
        24.09.2026 16:10

        Кто вы, что за ОСь помогает гораздо лучше понять контекст, и дальше всё остальное. Такое лучше в виде пары абзацев в самом начале вставлять. Типа, вот мы, была такая идея, в процессе реализации наткнулись на это, начали копать, а там такое...

        Как-то так читалось бы органичнее и понятнее.

        Кстати, что скажете за Sailfish OS?


        1. scv9 Автор
          24.09.2026 16:10

          Согласен, так читалось бы органичнее — добавлю в начало пару абзацев «кто мы и как на это наткнулись» вторым UPD. Спасибо.

          Про Sailfish OS. Как пользовательская система — самостоятельная и живая (Jolla, Aurora как российский форк), но к теме статьи она относится так же, как GrapheneOS, только с более слабой позицией. Sailfish работает поверх Android‑ядра и вендорского HAL через libhybris: модем, Wi‑Fi, GPU обслуживаются теми же закрытыми блобами, что и в стоковом Android на том же устройстве — rmt_storage, cnss‑драйверы, прошивки из vendor. То есть все «жильцы» из статьи на месте и обслуживаются ровно так же, просто над ними другой userspace. Плюс на большинстве поддерживаемых телефонов бутлоадер разблокирован, а verified boot отсутствует — корень доверия там слабее, чем у Pixel с GrapheneOS.

          Что она даёт реально: отсутствие Google‑сервисов и прозрачный userspace, где видно, какие процессы ходят в сеть. Это ценно, но это этаж «выше канала», а не изменение того, кто в чипе хозяин. Aurora в корпоративном варианте идёт дальше — там есть свой доверенный загрузчик и контролируемая цепочка обновлений на сертифицированных устройствах, — но прошивки модема и TrustZone остаются вендорскими и там.


          1. Aeternamens
            24.09.2026 16:10

            У Jolla есть и своё железо. Я не изучал подробно, но там вроде как не поверх Android работа идёт. И вроде даже какие-то физические кнопочки есть.


            1. scv9 Автор
              24.09.2026 16:10

              Да, у Jolla было своё железо — Jolla Phone (2013), Jolla C, Tablet, потом Jolla C2 в 2024. Но собственный там был дизайн и корпус, а не платформа: Jolla Phone — Snapdragon 400, Jolla C — Snapdragon 212, C2 — MediaTek Helio. И на всех этих устройствах Sailfish работает так же, как на чужих, — поверх Android‑ядра вендора и его HAL через libhybris. Иначе на Qualcomm и MediaTek не бывает: драйверы модема, Wi‑Fi и GPU существуют только в виде вендорских блобов под Android‑ядро, и написать своё для них — ровно то, чем мы занимались на планшете, с описанным результатом. «Своё железо» здесь означает «мы сами заказали сборку», а не «мы контролируем, что в чипе».

              Про кнопки — у Jolla их не было, аппаратные выключатели радио — это как раз Librem 5 и PinePhone. У Jolla был «The Other Half» — сменная задняя крышка с NFC и контактами, которая меняла тему и могла нести дополнительное железо; интересная идея, но к изоляции модема отношения не имеет.


          1. Uglevod
            24.09.2026 16:10

            Видимо и Postmarket OS - что то в этом же духе получается ?


            1. scv9 Автор
              24.09.2026 16:10

              Похоже, но с одним важным отличием от Sailfish. postmarketOS на большинстве поддерживаемых устройств работает на mainline Linux, а не на Android-ядре с libhybris, то есть вендорского HAL там нет. Но жильцы никуда не деваются: прошивки модема, Wi-Fi, GPU и DSP остаются закрытыми блобами, ядро грузит их через remoteproc и тот же PAS в TrustZone, а для модема pmOS поднимает ровно те же четыре сервера из утилит qrtr (rmtfs, tqftpserv, pd-mapper), которые мне пришлось писать самому. TrustZone и гипервизор для него так же недоступны, как для Android.

              Разница в том, как хост их обслуживает. В mainline у Wi-Fi на Snapdragon 845/855 поток DMA идёт через SMMU с трансляцией (dma-iommu), а не с bypass, как в стоковом дереве Samsung. То есть забор, про который статья, там стоит. rmtfs при этом отдаёт модему настоящие разделы modemst, так что EFS персистентный, как и должно быть для телефона.

              Итого по таблице из статьи: сущностей столько же, власть у них та же, но у одного из жильцов забор включён. Это лучше стока, и это ровно то, чего я хотел бы от вендоров по умолчанию. Оговорка: на многих устройствах в pmOS модем или Wi-Fi просто не работают, потому что до этого этапа bring-up ещё не дошли.


  1. zompin
    24.09.2026 16:10

    Если модем имеет доступ к RAM, теоретически он может прочитать любую область и куда-то переслать? /paranoia mode off


    1. scv9 Автор
      24.09.2026 16:10

      Паранойю можно не выключать, но ответ — «зависит от одного забора».

      Между DMA чипа и RAM стоит (или не стоит) IOMMU — на Qualcomm он называется SMMU. Если он транслирует адреса этого устройства, чип видит только те страницы, которые ему явно отдали: буферы под кадры и кольца, на этом планшете это 4 МиБ. Всё остальное — fault, и прочитать «любую область» физически нельзя. Если трансляция выключена (на этом планшете в стоковом Android для Wi‑Fi стоит bypass), чип работает с физическими адресами, и тогда да — вся RAM, включая ядро и ключи, доступна ему на чтение и запись, а хосту об этом даже не сообщается.

      Дальше два «но». Первое: доступ есть у прошивки, а не у злоумышленника — чтобы ей воспользоваться, прошивку нужно скомпрометировать, обычно по воздуху через уязвимость в парсере кадров или baseband. Это делали (Broadpwn 2017 — RCE в Wi‑Fi‑прошивке одним кадром и дальше в хост через DMA именно там, где IOMMU не было), но это целевая работа, а не фон. Второе: канал наружу у модема действительно свой — сотовый uplink мимо ОС, файрвола и VPN, — так что «куда‑то переслать» технически ничем не ограничено.

      Практически: на iPhone и Pixel IOMMU перед модемом и Wi‑Fi стоит всегда; на Linux проверяется в одну строку — cat /sys/class/net/wl*/device/iommu_group/type (DMA — транслируется, identity или нет файла — нет); на Windows это свойство «DMA Remapping Policy» у адаптера. Проверить стоит — ответ у разных устройств разный.


  1. anonym0use
    24.09.2026 16:10

    Спасибо за разбор, удачи в ваших начинаниях.
    С пикселем и 18 RCE можно что то сделать ?)


    1. scv9 Автор
      24.09.2026 16:10

      Спасибо. С Pixel — да, и большая часть уже сделана за вас: те 18 уязвимостей Exynos закрыты патчем в марте 2023, прошивка baseband на Pixel обновляется вместе с ежемесячными обновлениями системы, так что первое и главное — не откладывать их. Пока патча не было, Google советовал отключить Wi‑Fi Calling и VoLTE — четыре RCE шли именно через них.

      Что можно сделать сверх этого: отключить 2G (в настоящих Android это отдельный переключатель, в GrapheneOS ещё и режим LTE‑only) — это убирает самый слабый протокол baseband и поддельные базовые станции; включить обновления модема без вопросов; и держать в голове, что baseband на Pixel 6–9 по‑прежнему Exynos, то есть новые уязвимости этого класса будут, а обнаружить эксплуатацию с телефона невозможно — там нет сенсоров. Убрать сам класс проблемы нельзя: модем с закрытой прошивкой и своим uplink останется в любом телефоне. Можно только сделать так, чтобы между ним и вашими данными стоял IOMMU (на Pixel стоит) и чтобы он не получал того, что не нужно.


  1. denisemenov
    24.09.2026 16:10

    А вы Claude использовали для написания статьи? Просто он единственный, наверное, так непонятно пишет. Люди, не используйте его, пожалуйста, для тестов. Это тяжело читать.


    1. scv9 Автор
      24.09.2026 16:10

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


      1. gotch
        24.09.2026 16:10

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

        Два слова о том, кто говорит «мы». 

        Ну это же просто беспросветный слоп. Зачем вы так? Испанский стыд.


        1. scv9 Автор
          24.09.2026 16:10

          Утром прошёлся по тексту по чек-листу из треда выше (UPD 3 внизу), два процитированных абзаца в том числе. Если режет что-то конкретное, назовите, поправлю.


          1. gotch
            24.09.2026 16:10

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


          1. gotch
            24.09.2026 16:10

            1. Шифруйте выше канала. Ключ от вашего Wi‑Fi‑трафика лежит в модеме, и так у всех: у Linux, Android и у нас.

            2. VPN запирает канал, невидимым не делает. 

            3. Сигналы должны сходиться.  Часовой пояс, язык, шрифты и часы должны рассказывать ту же историю, что и адрес.

            Просто большая часть текста - бесчеловечная ахинея. Можно посмеяться, что надо быть выше шифровальных помыслов, что запор - не повод для невидимости, а вместо звёзд сходятся сигналы, но это и глупо, и кринжово, и все от этого уже давно устали.


  1. ImagineTables
    24.09.2026 16:10

    Вспоминаешь первые PC и плакать хочется.


    1. scv9 Автор
      24.09.2026 16:10

      На первых PC чужой код тоже был — BIOS. Разница в другом: IBM печатала его листинг в техническом руководстве, и любой мог прочитать каждую инструкцию. Прошивка модема сегодня — 80 МБ подписанного кода, который нельзя ни прочитать, ни заменить. Так что плакать стоит не о том, что чужого кода не было, а о том, что он был читаемым.


  1. flancer
    24.09.2026 16:10

    Вот когда ИИ напишет свой "червь Моррисона" и "положит" хотя бы 10% современных устройств, подключенных к интернету, вот тогда мы и оценим по-настоящему необходимость контроля "своих железкок".

    Годная тема и продукт перспективный, IMHO. Но сам текст - дикий нейрослоп. Вот тут - про типовые обороты ИИшечки. Можно прогнать пост по ссылке через ИИ и попросить сделать чек-лист того, чего стоит избегать в текстах. И избегать.


    1. scv9 Автор
      24.09.2026 16:10

      Спасибо за ссылку, по ней пройдусь. Признаю честно (выше в треде уже писал): факты, схема и разбор — наши, но текст причёсывал ИИ, и «типовые обороты» — это его почерк. Чек-лист сделаю и следующий текст буду вычищать руками.

      Про червя — соглашусь только наполовину. Свой «Моррис для железок» уже был: Mirai в 2016-м собрал сотни тысяч камер и роутеров и уронил Dyn, а вместе с ним половину крупных сайтов. И ничего не изменилось — потому что для владельца каждая отдельная камера продолжала работать «нормально». Владелец не видел проблемы, а те, кто видел (провайдеры, жертвы DDoS), не были владельцами. Так что катастрофа сама по себе оценку необходимости контроля не сдвинет, пока контроль над устройством и последствия от его компрометации живут у разных людей.

      Собственно об этом и статья: не о будущей атаке, а о том, что в штатном режиме ключи от модема, TEE и загрузчика лежат не у того, кто держит устройство в руках. Атака только делает это видимым на день-два.


    1. scv9 Автор
      24.09.2026 16:10

      Прошёлся по ссылке и прогнал текст через структурную часть чек-листа. Цифры до правки: тире в 90% абзацев (6,4 на тысячу знаков; в статье по ссылке «корпоративный слоп» набрал 0,95 при 67% и 4,0), конструкций «не X, а Y» десять на пятьдесят абзацев, девять абзацев с афоризмом в конце, три заголовка по формуле «число + метафора». После правки: тире одно на весь текст, антитез две, заголовки переписаны в информативные, жирный снят с половины мест. Факты, цифры и структура не трогал, пометил как UPD 3 внизу.


      1. flancer
        24.09.2026 16:10

        Пробежал взглядом. Да, стало гораздо приятнее читать без этих "честно" и "не ..., а ..." (y) Спасибо :)


        1. scv9 Автор
          24.09.2026 16:10

          Вам спасибо за ссылку, чек-лист теперь в процессе перед публикацией.


  1. StjarnornasFred
    24.09.2026 16:10

    Статья - невычитанный и трудночитаемый поток сознания нейросети (и комментарии автора, видимо, тоже).

    По существу:

    1) Опять эта метафора про устройства, которые вам не принадлежат. Принадлежат они вам, не волнуйтесь. А то, что работают не так, как вам бы хотелось - ну так товар предоставляется как есть со всеми его недостатками. Свои заявленные в инструкции функции выполняет? Выполняет. Нормативные требования ИБ соблюдает? Соблюдает. Что не так?

    2) Что делать-то предлагаете? Принять закон об открытом исходном коде модема? Без шуток - идея хорошая, я надеюсь, что к этому (в широком смысле - к кодификации общественно полезных инициатив в области техники и ПО) человечество придёт. Но для этого тоже пока ничего не сделано.

    3) Какова реальная опасность от описанного? Не гипотетическая, типа "раз висит ружьё, значит, выстрелит, и вероятно в тебя", а реальная. Что требуется для взлома, что можно получить в случае успеха, какова квалификация взломщика и т.д. Соразмерна ли угроза усилиям?


    1. scv9 Автор
      24.09.2026 16:10

      Про стиль принято, текст сегодня утром вычистил по чек-листу из соседнего треда (UPD 3 внизу). По существу, по пунктам.

      1) Юридически принадлежит, спорить не буду. Речь о контроле. Владелец не может прочитать код, который исполняется в его памяти, не может запретить радиомодулю излучать и не знает, какие разделы переживают factory reset. Функции по инструкции устройство выполняет, тут вы правы, и в статье это сказано прямо: это архитектура, а не дефект. Проблема в другом: пользовательская модель безопасности («поставил VPN», «включил авиарежим», «сделал сброс перед продажей») строится на предположении, что эти действия управляют железом. Они управляют запросами к железу. Разница становится важной ровно в тот момент, когда от неё что-то зависит.

      2) Закон об открытом коде модема не предлагаю, хотя идея нравится. Предлагаю три уровня, они в статье. Первый: проверить своё устройство командами из текста, десять минут. Второй: строить конфиденциальность выше канала, то есть TLS с проверкой сертификата и сквозное шифрование, потому что ключ от Wi-Fi лежит у модема на любой ОС. Третий, для тех, кто выбирает железо: модем за IOMMU или на USB. Отдельно есть требование к вендорам, которое ничего не стоит: включить stage-1 трансляцию SMMU для Wi-Fi в стоковой прошивке. Mainline Linux делает это на том же Snapdragon 855, Samsung в стоке оставляет bypass. Это вопрос одного дефолта в device tree, а не закона.

      3) Вопрос правильный, и ответ на него разный для разных атакующих. Разложу по классам: что нужно, сколько стоит, что получают, против кого применялось. Всё ниже задокументировано, без «ружья на стене».

      Класс А: доступ к сети оператора. Эксплойт не нужен вообще, модем делает то, для чего создан. Что получают: местоположение по соте, метаданные звонков, SMS, включая коды подтверждения, нешифрованный трафик. Квалификация: оператор, госорган или арендованный доступ к SS7; IMSI-catcher собирается из SDR за несколько сотен долларов. Реальный случай: 2017 год, O2 Telefónica в Германии, через SS7 перехватывали mTAN и выводили деньги со счетов. Против кого: против любого, у кого 2FA по SMS. Это самый массовый и самый дешёвый класс, и он никак не связан со взломом устройства.

      Класс Б: физический доступ и криминалистический комплекс. CVE-2024-43047 в Hexagon DSP из этой серии. По отчёту Amnesty International (декабрь 2024) сербская полиция разблокировала через Cellebrite телефон журналиста Славиши Миланова во время задержания и установила шпионское ПО NoviSpy. Квалификация: купить комплекс, стоит десятки тысяч долларов, продаётся полиции массово. Получают: всё содержимое плюс постоянный имплант. Против кого: журналисты, активисты, задержанные. Ваш телефон в чужих руках хотя бы на час входит в эту модель.

      Класс В: удалённый RCE в baseband по воздуху. Exynos, март 2023: Project Zero нашёл 18 уязвимостей, четыре из них давали выполнение кода в модеме, зная только номер телефона, без действий жертвы. Затронуты Galaxy S22, Pixel 6 и 7, часть Vivo. Pixel получил патч в марте, остальные позже; Google публично советовал отключить VoLTE и Wi-Fi calling до патча. Квалификация: команда уровня вендора эксплойтов, месяцы работы; на рынке за zero-click цепочки платят миллионы. Получают: голос, SMS, трафик, GNSS, дальше в основную ОС через DMA или общую память, если между модемом и ядром нет забора. Против кого: точечно, дорого, следов почти не оставляет. Для массового пользователя не про него.

      Класс Г: Wi-Fi прошивка по воздуху. Broadpwn, 2017: один кадр в радиусе Wi-Fi, RCE в прошивке Broadcom, около миллиарда устройств от iPhone 5 до Galaxy S8, доклад на Black Hat, эксплойт воспроизводили независимо. QualPwn, 2019, Tencent Blade: CVE-2019-10540 по воздуху в WLAN-прошивку Qualcomm, CVE-2019-10538 дальше в ядро Linux, Pixel 2 и 3 на Snapdragon 835/845. Квалификация: исследовательская команда, публичные детали. Требуется быть в радиусе. Против кого: аэропорт, конференция, отель. Именно здесь IOMMU перед Wi-Fi решает: с трансляцией компрометация прошивки остаётся в прошивке, без неё это память ядра.

      Класс Д: персистентность. Разделы modemst переживают сброс, это мы показали структурно; задокументированных случаев злоупотребления именно ими я не знаю и не утверждаю. Задокументировано другое: исследование Кембриджа 2015 года (Simon, Anderson) восстановило данные, включая токены Google, с 21 подержанного Android-устройства после factory reset. То есть «сброс не стирает всего» уже случалось на практике, просто на другом слое.

      Теперь про соразмерность. Честная картина такая: подавляющее большинство задокументированных целевых атак на телефоны идёт через ОС и мессенджеры (Pegasus через iMessage, Predator через ссылки), а не через baseband. Baseband и Wi-Fi прошивка это слой, до которого патчи доходят последними и который не видит ни MDM, ни антивирус, ни сам владелец. Отсюда ответ по группам.

      Обычный человек: реальная угроза класс А. Меры: 2FA не по SMS, мессенджер со сквозным шифрованием, TLS везде. Стоимость: час. Остальные классы для него теория, и в статье так и написано.

      Журналист, адвокат, админ с ключами от продакшена, человек, чей телефон могут изъять: классы Б, В, Г применялись против ровно этих групп, есть отчёты с именами. Меры первого и второго уровня из статьи стоят часы, третьего (устройство с модемом за забором) стоят денег. Соразмерно.

      Компания с парком устройств: практический риск в лаге патчей baseband (месяцы для не-Pixel) и в том, что инвентаризация «какой модем, транслируется ли DMA» обычно не ведётся вообще. Мера: провести её один раз, командами из статьи.

      Чего в реальной опасности нет: соседа, взламывающего ваш модем, массового червя через baseband, слежки через камеру силами прошивки Wi-Fi. Ничего такого не задокументировано, и статья этого не утверждает.


    1. Grigo52
      24.09.2026 16:10

      Опять эта метафора про устройства, которые вам не принадлежат. Принадлежат они вам, не волнуйтесь.

      Речь идет про реальный контроль над исполняемым кодом, когда чек на покупку уже ничем не помогает


  1. 15432
    24.09.2026 16:10

    Охохо, давайте наброшу на вентилятор. Камера - в дешёвом смартфоне на медиатеке это 15 миллионов строк кода, и это только того, что есть в исходниках. Ещё сотни мегабайт безысходности вендорских библиотек, блобов и прочего. Собственный (sic!) IOMMU, отдельный от процового, DMA в любой кусок памяти, прямой канал в GPU

    да, конечно GPU - те же DMA, практически всегда код без исходников, черный ящик, знающий всё, что происходит на экране

    SIM карта - а это вообще отдельный мир со своей операционкой и приложениями

    eMMC/SD карта - а у неё тоже есть своя прошивка, и вы можете только просить её выдать ваши ценные данные. в любой момент может вам устроить ReadOnly или чего похуже - файл поправить, например

    что забыл? ах да, в USB Type C кабеле тоже может быть чип со своей прошивкой и если он захочет, может сказать блоку питания поджарить ваш телефончик

    сейчас такие штуки на каждом шагу, и от этого никуда не деться


    1. scv9 Автор
      24.09.2026 16:10

      Всё так, и список у вас ещё неполный: сенсорный контроллер со своей прошивкой, сканер отпечатка с собственным MCU, NFC-контроллер, аудио-DSP, сенсорный хаб (SLPI у Qualcomm), UFS вместо eMMC с RPMB и своим планировщиком. В таблице у меня восемь, а не двадцать, потому что туда попали только те, с кем мы физически столкнулись по дороге к Wi-Fi. На камеру и GPU мы просто ещё не дошли.

      Из вашего списка два пункта имеют задокументированную историю злоупотреблений. SIM: Simjacker 2019, через S@T Browser в SIM-апплете отправляли команды SIM Toolkit, и карта силами модема отдавала местоположение и IMEI по SMS, без участия ОС; AdaptiveMobile насчитала операторов в примерно 30 странах. eMMC: у Samsung в 2012 году был баг прошивки (тот самый brickbug на MAG4FA/VYL00M), когда secure erase корёжил чип, и владельцы Galaxy Note получали кирпич при обычном wipe в recovery. То есть «прошивка накопителя может сделать с данными что угодно» это не гипотеза.

      Мне кажется полезным разделять жильцов не по количеству кода, а по двум признакам: есть ли у него DMA в память хоста, и кто держит перед ним забор. SIM, SD-карта и чип в кабеле в память не пишут, они разговаривают с хостом через модем, через контроллер накопителя и через PD-контроллер; скомпрометировать их можно, но дальше надо ещё пробивать следующий слой. Камера, GPU и Wi-Fi пишут напрямую. И тут в дереве устройств нашего же Tab S6 картина разная: GPU и камера стоят за SMMU с трансляцией, которую настраивает ядро, а у Wi-Fi стоит явный qcom,smmu-s1-bypass. Поэтому в статье именно Wi-Fi, а не GPU: не потому, что он опаснее по природе, а потому, что ему одному в стоковой конфигурации забор выключили.

      Про «никуда не деться» соглашусь наполовину. От того, что жильцов много, никуда не деться. От того, что забор перед конкретным жильцом выключен по умолчанию, деться можно, это одна строка в device tree, и mainline её уже поправил.


      1. 15432
        24.09.2026 16:10

        SD карты ещё возьмут своё с приходом SD Express и NVMe протокола, тачскрины и датчики отпечатков проходили, они скучные, каждый раз при включении экрана приходится грузить блоб прошивки, а сообщить что-то наружу им сложно.

        Если всё это выключать и не пользоваться - без GPU жить грустно, получаем слайд-шоу на экране, аналогично с кучей других выключенных вещей. Проще собрать из нужных компонентов себе телефон самостоятельно, где гарантированно весь код ваш крутится, без проприетарных блобов. и такие проекты сейчас существуют


        1. scv9 Автор
          24.09.2026 16:10

          Про SD Express точно: как только накопитель переезжает на PCIe, он из «просителя» становится жильцом с DMA, и дальше всё зависит от IOMMU перед слотом. Прецедент уже есть на ноутбуках: Thunderclap 2019 показал, что устройство в Thunderbolt-порту читает память хоста на macOS, Linux и Windows даже при включённом IOMMU, потому что ОС ставила забор слишком широко. Так что «карточка памяти» через пару лет будет отдельной строкой в такой таблице.

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

          Про собрать телефон без блобов. Проекты есть, и я их в статье упомянул, но «гарантированно весь код ваш» пока не достигает ни один. У PinePhone модем Quectel EG25-G, его baseband закрыт; открытая прошивка есть только для прикладного ядра модема, DSP остаётся блобом. Wi-Fi там Realtek с закрытой прошивкой. У Librem 5 то же самое, модем на M.2 и за USB, но внутри чужой. Единственное устройство, где код целиком ваш, из известных мне, это Precursor: SoC на FPGA, всё открыто, и ровно по этой причине в нём нет сотового модема вообще. Открытый baseband с сертификацией оператора пока не существует. Поэтому мой ответ не «без блобов», а «блобы за забором, который контролируете вы, и обслуживание, при котором они ничего лишнего не получают». Это меньше, чем хотелось бы, зато достижимо на железе, которое уже продаётся.


  1. Grigo52
    24.09.2026 16:10

    Самое смешное, что люди до сих пор верят, будто значок самолетика в шторке реально отрубает питание модема


    1. scv9 Автор
      24.09.2026 16:10

      Причём это не только про сотовый модем. На Android «самолётик» это запрос через RIL, модем сам решает, что с ним делать, и уходит в low-power mode силами собственной прошивки; Wi-Fi и Bluetooth при этом на многих прошивках остаются включёнными или включаются обратно по первому клику. На iOS с 2019 года в авиарежиме Bluetooth и Wi-Fi намеренно не выключаются. Единственные телефоны, где значок соответствует ожиданиям, это те, где переключатель физически рвёт питание, и их два.


  1. smart_alex
    24.09.2026 16:10

    Карта власти в устройстве

    И сверху этого ещё один слой, в котором находятся хомячки, которым искренне (…) на всё изложенное в этой статье :)