Привет, Хабр! В прошлый раз мы рассказали, каким вышел бейдж международной конференции по кибербезопасности OFFZONE 2019 и с чем его есть. Сегодня мы поделимся закулисными историями: как пришли к его созданию и чего нам стоило изобрести и произвести серию из 2000 устройств. Хронология событий, подводные камни разработки, закупки, монтажа и прочих радостей из мира электроники под катом. Поехали!



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

В прошлом году с этой задачей справилась Java-карта, к которой мы прикрутили немного тасков, игру в танчики и сокобан. Логичным развитием бейджа-2019 казалась та же карта, только теперь с NFC: тут и преемственность, и эволюция, и море идей для заданий. А еще для нее есть все наработки — это важно, если в первую смену ты ищешь уязвимости, а во вторую организуешь конференцию.

Мы неспешно готовились к производству, когда пришла новость из лаборатории анализа аппаратного обеспечения: коллеги представят на OFFZONE свой обзор атак на встраиваемые системы. Фото препарированных плат заполнили рабочие чаты, в коридорах обсуждали типы side-channel, аппаратная тема не захватила разве что наших экономистов. И мы поняли, что для OFFZONE 2019 надо запилить собственный девайс.

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

80 дней


Первое, с чего мы начали, — устроили с коллегами мозговой штурм и нагенерили концепции бейджа. Среди идей были одноплатник с интерпретатором какого-нибудь бейсика на борту, бейдж-визитка с дисплеем E-ink, что-то из мира IoT-девайсов на основе ESP32 или аналогичного модуля и базовая материнская плата, заранее подготовленная к дооснащению дополнительными модулями.

79–65 дней


Ходим, пьем кофе, перевариваем мысли. Взвешиваем за и против. Читаем твитеры и смотрим, что делают другие.

64–60 дней


Провели еще один мозговой штурм.

Идею с одноплатником откинули. Выходило слишком дорого из-за обилия компонентов и монтажа: одних кнопок было бы больше 30. Да и не удивить никого таким устройством — сразу вспоминаются The Supercon Badge и аналогичные поделки.

Визитку с дисплеем E-ink тоже отмели: не смогли найти ей интересное применение и решить, как привязать потенциальные таски к бейджу. А ESP32 выглядела как-то несерьезно — еще подумали бы, что мы начинающие ардуинщики! (Хотя к теме Arduino я еще вернусь.). Осталась идея материнской платы с возможностью доукомплектовать ее модулями для решения тасков.

Пару-тройку дней шлифовали идею. В итоге выбрали форму дискеты 3,5 дюйма, определились с основной функциональностью и обвесами. В качестве последних взяли DIP Switch на 8 переключателей, OLED-дисплей, ИК-приемник, RFID-приемопередатчик 13,56 МГц и отдельные приемник и передатчик диапазона 433 МГц. Управлять этим разношерстным зоопарком назначили микроконтроллер STM32F1, как на популярной плате Blue Pill.

В это же время возникла идея сделать на OFFZONE площадку Craft.Zone, куда каждый желающий сможет прийти нюхнуть канифоли и собственноручно дооснастить свой бейдж электронными компонентами. Зона пайки — тот еще ход конем! Во-первых, это интересно и необычно для отраслевой конференции, во-вторых, увлечет даже новичков, а в-третьих, так мы ускорим монтаж финальной партии устройств. Все стороны в выигрыше!

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

59–50 дней


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

Очевидно, что бейдж должен быть автономным устройством. В качестве гаранта этой автономности так и напрашивался литий-полимерный аккумулятор на 0,5 А*ч и соответствующая система контроля заряда на простом контроллере типа TP4096. Но пробовали ли вы купить без предварительного заказа пару тысяч аккумуляторов в Москве, да еще и от проверенного производителя? Мы пробовали — у нас не получилось. Заказывать из Китая не решились: аккумулятор — слишком ответственный и пожароопасный элемент, а наши гости должны были носить его на шее. Тут-то мы и вернулись к старым добрым батарейкам. Прикинули потребление, провели ряд простых экспериментов и остановились на конфигурации из четырех батареек типоразмера ААА. Они давали 16–20 часов работы устройства в зависимости от активности использования.

Поломали голову и над написанием прошивки. В других обстоятельствах мы бы писали ПО при помощи Eclipse (arm-none-eabi-gcc), Keil, IAR и прочих человеческих и не очень IDE. Однако наша команда волонтеров-разработчиков по большей части состояла из форензиков и пентестеров. Неразумно было надеяться, что они на досуге быстренько освоят написание прошивок для встраиваемых систем.

Я обещал, что без ардуины не обойдется? Я не соврал! Для упрощения процесса разработки ПО мы использовали Arduino IDE. Благо есть неплохой проект STM32Duino, который из коробки реализует ардуиновский бутлоадер для нашего целевого камня STM32F1, и Arduino IDE его поддерживает. В последней есть большая часть необходимых нам библиотек для работы с модулями и прочие радости относительно высокоуровневого программирования. Конечно, с библиотеками не все так гладко, но жить можно. Для адаптации большинства из них под STM32 достаточно переписать платформозависимые функции — и на этом все. А ведь править библиотечный код — это почти как кавычки вставлять!

Интересный факт. Для реализации функциональности бейджа мы использовали следующие библиотеки:

  • Adafruit_SSD1306 для OLED-дисплея,
  • MFRC522 для RFID,
  • RCSwitch для радио 433 МГц,
  • irmp-master для ИК-передатчика.


И вот готова первая версия платы. Она вышла зеленой, без необходимых фрезерованных отверстий и практически не работала.

Интересный факт. Прототипы платы заказывались на «Резоните» по специальной программе «Нам очень нужно это вчера», компоненты закупались в розничных магазинах Москвы, а монтаж провели своими силами.

Большинства проблем первой версии можно было бы избежать, собери мы предварительно основную часть схемы на макетной плате. Мы бы наверняка заметили, что приемник и передатчик требуют разных номиналов входного напряжения питания: 5 В для приемника и 3–12 В для передатчика (в пробной версии оба модуля питались от 3 В). Не прошли бы мимо и спящего USB. Внимательное чтение схем плат типа Blue Pill помогло понять, что USB не будет работать, пока линию USB_P не подтянуть резистором номинала 1,5–10 кОм к питанию 5 В.

Интересный факт. Пытаясь реанимировать USB и тыкая осциллографом в плату, я с удивлением обнаружил: хотя величина напряжения питания на ней составляет 5 В, сами линии данных D+ и D- подтягиваются к 3,3 В. Вот так поворот!

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

Совет. Не пренебрегайте макетированием и внимательно читайте даташиты!

49–40 дней


Пофиксили проблемы и произвели партию бейджей v2.0. Она все еще зеленая, но уже почти работает. Вот что значит рука набита!



Если вы присмотритесь к фото бейджа, то увидите два кривых штрихкода на лицевой стороне (да-да, мы знаем о существовании QR-кодов, но решили, что хотим теплый ламповый штрихкод). Это была неудачная попытка поместить на бейдж ссылку на сайт с информацией о конференции и инструкцией по эксплуатации. В финальную версию штрихкод не попал: мы не смогли решить, как его расположить, чтобы он лаконично смотрелся на плате. В уменьшенном варианте он не считывался приложением на мобильном, а в текущем размере выглядел слишком монструозным.

Интересный факт. Правый штрихкод на фото рабочий и содержит пасхалочку. Желающие могут попытаться его считать.

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

Интересный факт. Пришлось оставить перемычки 0 Ом для дисплея, так как у I2C OLED-дисплеев с диагональю 0,96 дюйма есть две распиновки, различающиеся расположением контактов питания и земли. Мы не могли заранее сказать, какая из версий этого дисплея приедет к нам, и пришлось предусмотреть оба варианта.


Обратите внимание на расположение контактов питания и земли

На этом же этапе приступили к закупке основной части компонентов. Для бейджа требовались только популярные STM32F1, WS2812B и прочий ширпотреб — их дефицита мы не ожидали и потому не спешили. Но оказалось, все решает масштаб. Купить 10 контроллеров в наличии в Москве — легко, 100 — тоже не вопрос. А вот с 1000 и более начинаются сложности. Нам не удалось найти в столице ни одного продавца, который за вменяемый срок и адекватные деньги поставил бы 2000 МК STM32F1. Пришлось заказывать из Екатеринбурга!

Те же трудности возникли и с закупкой 8000 светодиодов WS2812B. Последние летели к нам с европейского склада и задержались на таможне, чем здорово потрепали наши нервы.

Единственное, что досталось малой кровью, — это пассивные SMD-компоненты вроде резисторов и конденсаторов типоразмера 0603. Вот их на складах Москвы было навалом.

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

Забегая вперед, скажу, что все компоненты удалось получить за 3-4 недели. Но это везение, мы так больше рисковать не станем.

Совет. Если вам предстоит закупить компоненты на 100, 500 или более устройств, не откладывайте задачу в долгий ящик. При таких сериях отведите на закупку месяц и более, особенно если речь о микросхемах.

39–30 дней


Партия v3.0. Бейдж уже черный и полностью функционирует! Есть только ма-а-а-аленький нюанс. Каким-то образом с первой версии бейджа дошла ошибка в расположении контактов питания и данных на передатчике 433 МГц.

Из-за этой ошибки чуть не поседел наш коллега, который писал таск на радио. У него на макетке-ардуино передача уверенно работала метров на 30, а вот на бейдже — хорошо если на полметра от платы. Несколько дней, пока не нашли баг в разводке, коллега мучился и не понимал, что происходит. Федор, прости нас! Хотя загадка, почему устройство с перепутанными пинами вообще работало?!

Итак, баг нашли, пофиксили две дорожки на плате, для удобства поменяли miniUSB-разъем на microUSB, перекрестились, заказали финалочку v3.1 на 2000 штук.

29–15 дней


Ходим, волнуемся за поставки компонентов с разных концов света. Попутно ребята допиливают свои таски.

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



14 дней


Платы пришли, компоненты пришли, отдаем в монтаж! Мы работали с «M-платой», которая замонтировала все 2000 девайсов за неделю.

Совет. Если у вас 100 и более устройств, забудьте про ручной монтаж и готовьтесь к автоматическому на сборочной линии. Учтите это при разработке PCB. (Посоветуйтесь с выбранным производителем — они многое могут подсказать. Общие рекомендации есть и на сайте «Резонита».)

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



10 дней


Забираем пробные 12 плат с монтажа, проверяем, выдыхаем: все работает как надо.



9–5 дней


Активно допиливаем таски, попутно готовимся к финальному превозмоганию здравого смысла. Ведь все 2000 устройств нам придется прошивать вручную. Для упрощения боевой задачи написали питонячий скрипт с использованием консольной версии утилиты STM32 ST-LINK Utility и подготовили два десятка дешевых ST-Link v2.



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

96 часов до конференции


Забираем платы с монтажа, отключаем мобильники, запираемся в офисе и заливаем все 2000 устройств за вечер.

Интересный факт. Из 2000 устройств признаков жизни не подало лишь 2. Процент брака на выходе c монтажа — 0,1.



На наших лицах радость, но мысли уже далеко. Каким будет бейдж в следующем году? Докрутим ли идею с E-ink или придумаем что-то совершенно новое? Вернемся к концепции пластиковых карт или вдохновимся Олимпиадой в Токио и запилим бумажный бейдж-оригами? Если у вас есть свежие идеи, го в комменты: возможно, что-то из предложенного через год повесят себе на шеи специалисты по кибербезопасности разных стран мира!

Вместо заключения


OFFZONE 2019 прошел месяц назад, но нам до сих пор задают вопросы «можно ли как-то получить бейдж-плату». Да, можно! 100 бейджей достанутся тем, кто первым успеет написать на почту info@offzone.moscow. Отправляем по России и СНГ. Мероприятие продлится две недели с момента выхода статьи и закроется ровно 2 августа в 13:37 по Москве.

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


  1. dmitryrf
    19.07.2019 14:35

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

    Здорово, что у вас всё получилось хорошо и вовремя. По-моему, количество «сюрпризов» для новичка при серийном производстве может здорово сорвать срок готовности продукта или даже остановить реализацию проекта.


    1. BiZone_team Автор
      19.07.2019 15:39

      На момент разработки мы использовали самые свежие версии библиотек. Если быть точным, то:
      — Adafruit_SSD1306 версии 1.2.8
      — MFRC522 версии 1.4.3
      — RCSwitch 2.52
      — irmp-master 3.0.7

      Первые две ставятся через менеджер библиотек Arduino IDE, а последние две с гитхаба.


  1. bobeg
    19.07.2019 16:38
    +1

    Интересный факт. Правый штрихкод на фото рабочий и содержит пасхалочку. Желающие могут попытаться его считать.

    Ахахаха! :) Не буду писать, что там, но это было смешно. :)


    1. w0lf
      19.07.2019 16:51
      +1

      После окончания рабочей недели — самое оно :)


    1. Apazhe
      19.07.2019 20:20
      -1

      Телефон Московской службы психологической помощи населению.

      Очень смешно.