惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Full Disclosure
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
S
Secure Thoughts
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Security Latest
Security Latest
Project Zero
Project Zero
Apple Machine Learning Research
Apple Machine Learning Research
Cyberwarzone
Cyberwarzone
V
Visual Studio Blog
S
SegmentFault 最新的问题
月光博客
月光博客
Cisco Talos Blog
Cisco Talos Blog
Simon Willison's Weblog
Simon Willison's Weblog
NISL@THU
NISL@THU
Security Archives - TechRepublic
Security Archives - TechRepublic
Webroot Blog
Webroot Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
量子位
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
P
Privacy & Cybersecurity Law Blog
博客园 - 叶小钗
博客园 - 聂微东
O
OpenAI News
有赞技术团队
有赞技术团队
V2EX - 技术
V2EX - 技术
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
阮一峰的网络日志
阮一峰的网络日志
小众软件
小众软件
博客园 - 司徒正美
S
Security Affairs
J
Java Code Geeks
WordPress大学
WordPress大学
Schneier on Security
Schneier on Security
S
Security @ Cisco Blogs
Jina AI
Jina AI
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
GbyAI
GbyAI
M
MIT News - Artificial intelligence
T
Tailwind CSS Blog
腾讯CDC
Help Net Security
Help Net Security
Know Your Adversary
Know Your Adversary
N
News and Events Feed by Topic
T
Troy Hunt's Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
B
Blog
云风的 BLOG
云风的 BLOG
IT之家
IT之家
T
Threat Research - Cisco Blogs
罗磊的独立博客

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Пишем универсальную глитч-машину
Андрей · 2026-05-27 · via Все публикации подряд на Хабре

Пишем универсальную глитч-машину

Средний

6 мин

7.8K

Вы — всюду: некий призрак вещий,
Что встарь вставал из лунных мшин!
На всех путях, на каждой вещи —
Клеймо познанья, след машин.
В. Брюсов

Предпосылки

Voltage Glitching (также известный как Power Glitching или VCC Glitch) — это метод аппаратного взлома (класс Fault Injection, FI), при котором намеренно создаются кратковременные искажения (провалы/импульсы) в линии питания процессора.

Цель такой атаки — вызвать просчет в работе внутренней логики чипа на аппаратном уровне. Даже если прошивка или ОС запрещают чтение памяти программно, Voltage Glitching заставляет процессор физически ошибиться и выдать данные, которые он не должен выдавать.

Не очень давно мы уже публиковали статью, в которой решалась проблема с преодолением защиты от чтения на процессоре V850E2, используя данный метод. Уже тогда была написана небольшая программа для Raspberry Pi Pico, которая часто используется для этих задач в силу высокой частоты своего GPIO, ну и, конечно же, стоимости.

В данном эксперименте мы стали заниматься процессором Renesas RH850, подход к преодолению защиты которого отличается от того, что мы делали ранее, при этом хотелось написать что-то условно универсальное, что можно было бы использовать от проекта к проекту. К тому же схема, использованная для чтения процессора V850E2 содержала два устройства, одно из которых работало как USB2UART, а второе - занималось непосредственно glitch атакой.

Мы решили избавиться от USB2UART адаптера и перенести этот функционал также в Pico, таким образом схема упростится, и всё, что нам надо это: транзистор для управления питанием, Raspberry Pi Pico и скрипт на python, реализующий атаку и UART программатор в режиме загрузчика.

Реализация двух портов

Для того чтобы Pico работал как USB2UART устройство, получая команды от программатора, написанного на python, а также получал управляющие команды по другому serial интерфейсу, необходимо было создать двух-портовое устройство. Библиотека TinyUSB обеспечивает эмуляцию двух COM-портов через один USB-соединение, а аппаратный UART Pico используется для физического интерфейса с целевой системой.

Код создает два независимых CDC (Communication Device Class) порта через TinyUSB:

  • CDC0 (интерфейс 0) - “глитч-порт” для управления и команд

  • CDC1 (интерфейс 1) - “UART-мост” для передачи данных к целевому процессору

  • Скорость: настраиваемая (по умолчанию 9600 бод)

Архитектура “моста” между USB CDC и UART Ключевой принцип - создание двухстороннего моста:

  1. CDC1 → UART1: Данные от хоста (компьютера) через CDC1 передаются в целевой процессор через UART1

  2. UART1 → CDC1: Ответы от целевого процессора через UART1 передаются обратно хосту через CDC1

  • process_cdc0_command() - обрабатывает команды управления глитчем от CDC0

  • process_cdc1_data() - передает потоковые данные от CDC1 в UART1 с поддержкой триггеров

  • Скорость UART может меняться на лету через tud_cdc_line_coding_cb() при изменении настроек в хосте

  • Триггерные паттерны для UART позволяют детектировать специфичные последовательности байт

  • Буферизация предотвращает потерю данных при высоких скоростях

  • Использование tud_task() для обработки USB событий

  • Проверка доступности буферов перед записью (tud_cdc_n_write_available())

  • Ожидание готовности UART перед отправкой (uart_is_writable())

  • Прерывания для приема UART данных (on_uart1_rx())

Блок для испытаний

От теории - к практике, необходимо было проверить машину в действии.

Под рукой был блок SRS от VOLVO 32246116 с закрытым процессором R7F701330. Блоки достаточно старые, их все уже давно читают и пишут, поэтому было понятно, что проблем с ним не будет.

Штатная система питания ядра (1,2V) построена на основе импульсного стабилизатора с ШИМ-контроллером. В установившемся режиме он обеспечивает низкий уровень пульсаций благодаря замкнутому контуру обратной связи и высокочастотной фильтрации выходными конденсаторами.

Демонтаж сглаживающих конденсаторов приводит к довольно жёсткой “пиле”, которая сама порождает glitch, и приводит к сбою в работе процессора.

Voltage glitch

Для получения чистого, управляемого глитча предлагается полное шунтирование штатного контура питания. Напряжение 1,2V формируется низкошумящим линейным стабилизатором (LDO), включенным последовательно с нагрузкой. В разрыв цепи питания (или на путь GND) устанавливается высокоскоростной МОП-ключ (в наличии имелся IRLML2030). LDO обеспечивает низкое выходное сопротивление и мгновенное восстановление напряжения после спада, что позволяет формировать прямоугольные провалы питания с крутыми фронтами без эффекта «звона» и послесвечения, характерного для дросселей ШИМ.

В наличии имелся LDO LD3985M122R (фиксированный 1.22V).

Сначала попробовали разрыв. В принципе, рабочий (и более безопасный для схемы) вариант, однако есть ньюанс. После закрытия ключа напряжение на ядре падает до уровня ёмкостного делителя (0.6–0.7В) и далее разряжается очень медленно (током ядра). Резистор 10к на землю не помогает, так как разрядка происходит очень медленно, а glitch длится 1-2 микросекунды или менее.

glitchbreak

glitchbreak

Необходимо всё же “сажать” на землю. Это можно сделать двумя мосфетами:

Глитч с двумя мосфетами:

glitch2nmos

glitch2nmos

Но и один транзистор, который сажает на землю, при условии подачи питания от LD3985M122R, работает уж очень эффективно, и глитч, даже в 560нс настолько силён, что “валит” проц, не давая опомниться. Пришлось даже вернуть сглаживающий конденсатор. Хотя запас в 300МГц, до которых удалось разогнать Pico, все ещё позволял увеличивать делитель WIDTHS_DIVIDOR, определяющий какую долю микросекунды считать нашим “тиком”:

uint32_t t_delay = system_status.glitch_delay *
                     (sysclock / MICROSECOND_SCALE) / WIDTHS_DIVIDOR;
uint32_t t_width = system_status.glitch_width *
                     (sysclock / MICROSECOND_SCALE) / WIDTHS_DIVIDOR;

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

Как выяснилось для разных вариантов нужен как обычный, так и инвертированный сигнал, в случае с двумя транзисторами (такой вариант тоже может быть нужен), и то, и другое. Поэтому прошивка была доработана и повяилось два вывода glitch (GP2, GP1).

Финальная схема для этого процессора была такой:

scheme

scheme

Триггерный паттерн

Так как флеш процессора закрыт на чтение (bitlock или 0x3F), то и “глитчить” необходимо именно команду чтения. Так как ответ от команды чтения об ошибке (код 0xDA) приходит через 11мкс, окно уязвимости очень невелико. Однако, как понять что сообщение уже послано?

window

window

Для этого передаём нашей машине триггерный паттерн, на который “заряжать” глитч. Поскольку весь трафик по UART идёт через наш второй UART интерфейс (CDC1), сделать это не так уж сложно. Однако, дьявол кроется в мелочах.

В частности, пришлось доработать прошивку pico чтобы убедиться, что байты уже отосланы. За это отвечает uart_tx_busy(). К тому же проверять все байты пакета зачастую не требуется, достаточно проверить часть байт, однако отсчёт необходимо вести от последнего байта, поэтому при установке паттерна, мы посылаем два значения: сам паттерн и реальную длину сообщения, на которое мы будем реагировать.

Использовение двух ядер

Так как в Pi Pico есть два ядра, логично процесс работы моста и работу glitch положить в разные ядра. Поэтому процедуру работы glitch запускаем посредстовм multicore_launch_core1().

Назначение пинов для работы с RH850

Пин Pico

Назначение

Описание

GP4

UART1_TX

Передача данных к процессору RH850 (через FTDI или напрямую)

GP5

UART1_RX

Прием данных от процессора RH850

GP6

RESET_PIN

Сброс процессора (активный низкий уровень)

GP3

TRIGGER_PIN

Вход триггера для запуска глитча (GPIO или UART)

GP2

GLITCH_PIN

Выход глитч-импульса

GP1

GLITCH_PIN

Инвертированный выход глитч-импульса

Создание скрипта для работы с UART Bootloader

Из открытых источников можно почерпнуть принципы работы протокола загрузчика похожего процессора и написать скрипт для выполнения основных команд на python. Затем вписываем в него обращения ко второму порту и получаем скрипт для глитчинга.

class RH850Command(IntEnum):
    CMD_INQUIRY = 0x00        # Запрос состояния
    CMD_ERASE = 0x12          # Стирание
    CMD_WRITE = 0x13          # Запись
    CMD_READ = 0x15           # Чтение
    CMD_DLM = 0x2C            # Проверка защиты
    CMD_FREQ = 0x32           # Установка частоты
    CMD_BAUDRATE = 0x34       # Установка скорости UART
    CMD_DEVTYPE = 0x38        # Получение типа устройства
    CMD_SIGNATURE = 0x3A      # Чтение Silicon Signature
...    

Команда 0x21 возвращает байт состояния защиты. Интерпретация:

  • 0x3F = “Read / Write Disable” (чтение и запись запрещены)

  • 0x7F = “Read Disable” (чтение запрещено)

  • 0xBF = “Write Disable” (запись запрещена)

  • 0x1F = “Erase Disable” (стирание запрещено)

Побочные эффекты

Глитчинг этих процессоров может иметь “побочные эффекты”. Например, один из процессоров имел защиту Serial Disable, при которой протокол по UART частично заблокирован (позволяет выполнить информационные команды). При попытке “прохождении” этой защиты, процессор полностью закрылся 0x1F.

Дальнейшие перспективы

Дальнейшие перспективы проекта - подключение триггера на протоколе JTAG. Этот протокол также часто встречается в различных процессорах, и было бы небезинтересно попробовать подключить глитч-атаку на команды этого протокола. Например, проверку DEBUG password (ADKP). Если получится доработать эту машину до такого состояния, будем писать продолжение этой статьи.

Где код

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