
Привет, Хабр! На связи Иван Глинкин, руководитель отдела аппаратных исследований из команды Бастиона.
Иногда для вскрытия сейфа не нужны никакие отмычки, болгарки и заклинания вроде «Алохомора» — достаточно деревянной палочки из набора для суши. И это еще не самая опасная уязвимость, найденная нами при тестировании российского «ящика с электронным замком для хранения ценностей». Мы заказали его на синем маркетплейсе почти за шесть тысяч рублей, а потом вскрыли за пару минут. О том, как нам это удалось, читайте под катом.
Предварительный осмотр
Для начала внимательно осмотрим нашего «пациента». Снаружи всё выглядит довольно убедительно: сталь, размеры 20 × 31 × 20 сантиметров и масса около четырех с половиной килограммов. Металл здесь настоящий, вовсе не крашеная фольга. Правда, «внутренний мир» не обязательно соответствует внешности, но об этом чуть позже.
С точки зрения покупателя, устройство кажется продуманным. На передней панели находится клавиатура для ввода кода. Под откидной крышкой скрывается личинка механического замка на случай, если владелец забудет комбинацию или электроника перестанет работать. В комплекте идут два ключа.
Рядом с клавиатурой расположена пара латунных контактов аварийного питания. Если внутренние батарейки разрядятся, к ним можно приложить девятивольтовую батарейку типа «Крона», запитать электронику и открыть дверь штатным кодом.

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

Волшебная палочка… для суши
Теперь откроем дверцу. На ее внутренней стороне видим крышку отсека для батареек, на которых работает электроника, и красную кнопку самоуничтожения для сброса кода (на плате она предусмотрительно подписана SET). Вдруг это и есть наша лазейка для взлома?

Если владелец забудет пароль, то нужно сделать следующее:
открыть дверцу аварийным ключом;
нажать на красную кнопку сброса пароля;
ввести новый код длиной от 4 до 8 цифр;
подтвердить комбинацию нажатием #;
проверить установленный код при открытой дверце сейфа.
Когда сейф закрыт, между дверцей и верхней стенкой корпуса остается небольшой зазор, но к заветной кнопке сброса через него не подобраться. А что если зайти с тыла, то есть через те самые технологические отверстия в задней стенке?
Бинго! Отверстия достаточно велики, чтобы просунуть внутрь эндоскоп. Дальше открытие сейфа превращается в несложное упражнение на координацию.
Находим кнопку SET с помощью эндоскопа.

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

Нажимаем ее, сбрасываем код и пошагово выполняем описанные выше действия по установке новой комбинации. После этого «сим-сим» открывается.
Здесь внимательный читатель справедливо возразит, что такой фокус сработает только с незакрепленным сейфом. И вправду, добросовестно прикрученный к стене «ящик для ценностей» палочкой для суши, скорее всего, не откроешь. Вот только за последний год я не встретил в отелях ни одного зафиксированного сейфа. Обычно металлическая коробка просто стоит на полке в шкафу. В общем, имейте в виду риски, прежде чем оставлять там золото-бриллианты ценности.
Ладно, допустим, за ошибки в установке производитель сейфа не отвечает. Но что с остальными элементами конструкции?
Вскрытие покажет
Внутри сейфа всё оказалось далеко не так основательно, как снаружи: пластиковые детали, две платы и соленоидный запорный механизм.

При подаче питания электромагнит втягивает язычок, после чего дверь можно открыть. Без питания язычок фиксируется в закрытом положении.
Электроника собрана на плате с маркировкой SY-860-A, установленной с внутренней стороны дверцы, а клавиатура подключена к ней шлейфом. Причем часть этой платы вообще не разведена. Ее явно делали унифицированной, сразу под несколько моделей сейфов. Так что все найденные в этом исследовании уязвимости (спойлер: их окажется несколько) вполне могут всплыть и в других линейках «ящиков для ценностей».

Пока складывается впечатление, будто все внутренности сейфа защищены лишь вышеупомянутыми цепями управления замком, пользовательским кодом и сбросом настроек, а периметр безопасности проходит по внешней клавиатуре. Что же, проверим.
Код открытым текстом
Для начала взглянем на плату. У главного контроллера на плате стерта маркировка: опознать модель с ходу нельзя. Однако это ничего не меняет. Меня интересует микросхема памяти AT24C02A — обычная I²C EEPROM 24-й серии на 2 килобита, то есть 256 байт, которую любой опознает по даташиту за минуту. В подобных устройствах такая память часто используется для хранения пользовательских настроек, в том числе кодов. Посмотрим, как именно они записаны в нашем сейфе.
Сначала я попытался прочитать память, не выпаивая микросхему. Подключил SOIC-прищепку непосредственно к чипу на плате, но при каждом чтении получал новый набор случайных данных. Остальная электроника мешала работе с шиной, поэтому добиться стабильного дампа не удалось. Программатор на базе CH341 вместе с flashrom микросхему тоже не распознал.
Пришлось взяться за термофен и выпаять EEPROM, установить в SOIC-адаптер и подключить к программатору T48.

Его софт minipro поддерживает эту модель:
minipro -r firmware.bin -p "T24C02A" hexdump -C firmware.bin
Получился дамп размером 256 байт. Почти всё пространство было заполнено значениями ff, однако первые строки выглядели гораздо интереснее…
Здесь сделаем шаг назад и для ясности оговоримся, что мы установили для сейфа тестовые пароли: 1234 (пользовательский) и 4321 (админский). Второй нужен на случай, если пользователь забудет свою комбинацию.
Итак, посмотрим на получившийся дамп.

По адресу 0x00 лежат байты 34 12, а по адресу 0x10 — 21 43. Внутри каждой пары цифры записаны в обратном порядке. Меняем их местами и получаем знакомые нам нехитрые комбинации: 12 34 и 43 21, то есть 1234 и 4321. Следовательно, никакого шифрования, хеширования или хотя бы простейшей обфускации здесь нет. Комбинации записаны в EEPROM практически в том же виде, в котором их набирает пользователь.
Само по себе это еще не позволяет открыть стоящий перед нами закрытый сейф: чтобы выпаять память, сначала придется получить доступ к внутренней стороне дверцы, но такой способ хранения хорошо показывает общий подход разработчиков к защите секретов.
Тупик, о котором тоже стоит рассказать
Раз EEPROM позволяет записывать данные, было бы странно не попробовать оставить в памяти сейфа собственный бэкдор. Речь об известном только мне дополнительном коде, который впоследствии нельзя было бы изменить без прямого вмешательства в микросхему и перепрошивки устройства. Я модифицировал соответствующие области кода через редактор Hex Edit. После сохранения правок убедился, что изменения корректно записались в файл.

Затем я загрузил прошивку замка на микросхему с помощью софта для программатора minipro. Для надежности я снова выгрузил прошивку с микросхемы и повторно сравнил ее с исходным модифицированным файлом — как бы избито ни звучало, но семь раз отмерь…

Словом, я добавил в дамп третий и четвертый код и записал модифицированный файл обратно:
minipro -w firmware.bin -p "T24C02A"
Программатор сообщил:
Writing... OK Verification... OK
Повторное чтение подтвердило, что данные действительно сохранились, записаны правильно и полностью соответствуют внесенным изменениям.
Всё это отлично, но замок новый код не принял. Судя по поведению устройства, прошивка обращается только к двум фиксированным областям памяти — основной и дополнительной комбинациям. Значения из остальных областей она просто не читает.
Что ж, бывает, не всё, что удается записать в память, обязано работать. Посмотрим на другой вектор атаки.
Шоковая терапия
Для начала отрисуем схему электросети нашего сейфа.

В верхнем правом углу схемы видим семь контактов (пинов) клавиатуры. Что касается резисторов, то все их серии, к нашему удобству, имеют подписанные номиналы:
102 — 1 кОм.
103 — 10 кОм.

Мы не стали отображать на схеме еще и резисторы с нулевым сопротивлением («нулевики»), которые лишь выполняют функцию перемычек (джамперов) для соединения разных участков платы и не несут никакой другой смысловой нагрузки.
На плате также установлены транзисторы с маркировкой J3Y. Кажется, что изначально на схеме была указана неверная маркировка транзисторов, но это требует дополнительного уточнения.
Взглянем и на диоды: все они одинаковые, причем маркировка на них отсутствует.
Аналогичная ситуация наблюдается и с основной платой — повторимся, что маркировка контроллера на ней стерта. Поэтому для дальнейшего исследования плату требуется извлечь и как следует изучить под микроскопом.
Теперь изучим характерное поведение устройства — его токовую сигнатуру. Я подключил плату к лабораторному источнику питания. В состоянии покоя она почти не потребляла ток. При вводе неверного кода картина практически не менялась, но после правильной комбинации потребление скачком возрастало: даже без подключенного внешнего электромагнитного замка плата съедала около ста миллиампер, а вместе с ним — примерно пол-ампера. Соленоид втягивал язычок. Эта информация нам еще пригодится.
Что же, вернемся к клавиатуре. Она приклеена к корпусу двусторонним скотчем и снимается за несколько секунд практически без следов. Под ней находятся уже упомянутые семь пинов клавиатурной матрицы и еще два контакта аварийного питания. То есть все линии оказываются доступны снаружи, без вскрытия металлического корпуса.

Двенадцать клавиш собраны в матрицу на этих семи линиях, так что, замкнув нужную пару контактов, можно эмулировать нажатие любой кнопки. Я подключил лабораторный источник питания и начал последовательно проверять контакты клавиатуры щупом. На одном из них обнаружилось знакомое поведение: при соединении положительной линии питания с шестым контактом потребление резко возрастало.
Это была та же токовая сигнатура, которую я наблюдал при штатном открытии замка. Следовательно, шестой контакт каким-то образом связан с цепью управления соленоидом.
Я продолжил эксперимент. При шести вольтах плата реагировала. При семи и восьми — нет. Затем я подал девять вольт и соединил положительную линию с шестым контактом.
После этого электроника начала постоянно подавать питание на замок, и соленоид втянул язычок. Дверь открылась, однако плата получила повреждения. Теперь при любом питании — от внутренних батареек или от внешней девятивольтовой «Кроны» — замок срабатывал автоматически. Устройство перешло в постоянно открытое состояние.

Как я написал тогда коллегам, новостей было две. Хорошая: сейф поддался. Плохая: он поддался окончательно, и теперь его вряд ли можно сдать назад в магазин.
Способ разрушительный, но эффективный: код не требуется, металлический корпус повреждать не нужно. Теоретически клавиатуру даже необязательно полностью снимать. Достаточно получить доступ к нужным точкам с помощью тонких игл, и вскрытие займет считаные секунды.
Почему это возможно
Описанные три вектора атаки выглядят как несвязанные уязвимости, но все они указывают на одну ошибку: производитель неверно определил границу доверия. Условно, он провел ее по клавиатуре и оставил непосредственно за ней:
доступ к кнопке сброса;
линии клавиатуры и управления;
контакты аварийного питания;
незащищенный пароль в плейнтексте;
цепи, связанные с работой соленоида;
В результате прочный корпус защищает не те элементы, от которых в действительности зависит безопасность замка. Особенно показательно поведение после повреждения платы. При отказе управляющей электроники система должна переходить в безопасное состояние: запорный механизм должен оставаться закрытым. В этом сейфе отказ платы, напротив, перевел управление замком в постоянно активное состояние.
Причина — в самой топологии. Соленоид замка коммутируется маломощным транзистором SS8550 через базовый резистор на килоом, и никаких супрессоров или ограничителей тока на этом пути нет. Замок открывается подачей питания, поэтому стоило выходу драйвера залипнуть во включенном состоянии, а именно это и обеспечили девять вольт по шестой линии, и питание на соленоид пошло постоянно.
При этом некоторая защита в конструкции всё же присутствует. На плате питания установлен диод Шоттки SS14, по сути, единственный защитный элемент во всей схеме.

Он защищает от переполюсовки: если владелец приложит «Крону» к контактам наоборот, электроника не пострадает. А о том, что девять вольт могут намеренно подать на соседние доступные линии, разработчики, судя по всему, не подумали.
Грубо, но действенно
А что насчет старого доброго брутфорса? После нескольких неудачных попыток ввести пароль сейф на минуту уходит в защитный режим. Однако если подать электричество, попробовать несколько комбинаций, потом обесточить и снова подать питание, счетчик сбрасывается. Милости просим: можно снова брутфорсить.
Подобную атаку сильно облегчил бы аппаратный брутфорсер, который легко можно собрать на Raspberry Pi или Arduino. Так или иначе, это вполне рабочий вектор атаки для тестируемого сейфа.

Что вы на самом деле покупаете
Металлическая часть этого сейфа вполне добротная, корпус действительно сделан из стали и выполняет свою базовую задачу, не позволяет открыть коробку руками и может на какое-то время защитить от распространенных инструментов. Покупатель платит за ощущение, что документы, деньги и другие ценности защищены кодовым замком, но это, скорее, иллюзия. Поэтому надпись «продукция не подлежит обязательной сертификации» остается самой честной строчкой на коробке. Вся остальная защита держится на предположении, что никто не полезет внутрь с эндоскопом, щупами и лабораторным источником питания.
Проблемы с безопасностью этого сейфа несложно было бы исправить:
Внешние линии необходимо защищать от перенапряжения и инъекций питания с помощью супрессоров, ограничителей тока, резисторов и предохранителей. Доступные контакты клавиатуры не должны иметь прямой или косвенной связи с силовой цепью замка.
Кнопку сброса нужно размещать так, чтобы до нее было невозможно добраться через вентиляционные или технологические отверстия.
Пользовательские комбинации не следует хранить в EEPROM открытым текстом. Даже если физический доступ к памяти уже означает серьезную компрометацию устройства, подобное хранение заметно упрощает анализ и модификацию данных.
Наконец, цепь управления соленоидом должна быть спроектирована так, чтобы отказ управляющей платы не приводил к постоянному открытию замка.
Ничего особенного в этом нет, проблема лишь в том, что каждая дополнительная защитная мера увеличивает себестоимость товара. Впрочем, для покупателя сейф всё равно стоит почти шесть тысяч рублей, и куда уходят эти деньги, вопрос открытый.
Напоследок приглашаю всех в свой Telegram-канал, где вас ждет масса интересного по теме реверс-инжиниринга: https://t.me/glinkinivan

PURP — Telegram-канал, где кибербезопасность раскрывается с обеих сторон баррикад
t.me/purp_sec — инсайды и инсайты из мира этичного хакинга и бизнес‑ориентированной защиты от специалистов Бастиона

