Поднимаем зомби: перехват контроля над мёртвым IoT-производителем

в 5:23, , рубрики: Adafruit, internet of things, IoT, Raspberry Pi, Интернет вещей, Производство и разработка электроники, реверс-инжиниринг, светодиодная матрица
Поднимаем зомби: перехват контроля над мёртвым IoT-производителем - 1

В 2017 году появилась компания NYCTrainSign, которая изготавливала реплики таймеров обратного отсчёта, показывающие, сколько осталось до прибытия следующего поезда Нью-Йоркского метро.

Поднимаем зомби: перехват контроля над мёртвым IoT-производителем - 2

Однако этот таймер не вешался на потолок, а ставился на стол в качестве стильного украшения дома.

Человек, отвечавший за маркетинг, успешно смог привлечь интерес к проекту. Помню множество постов в Facebook* и Instagram*, демонстрирующих потенциальную пользу вывески для кафе и пиццерий, посетители которых могли видеть, когда им нужно выходить, чтобы попасть на поезд.

Однако под флёром Instagram* скрывались посредственные технические решения и недопустимо высокие затраты на производство. [* Запрещены в России.]

В начале 2018 года компания перестала отвечать под постами в соцсетях, а приобретённые таблички получили очень немногие покупатели. Компания порекомендовала покупателям оспорить платёж, чтобы попробовать вернуть свои деньги.

Сегодня даже новые компании, входящие на этот рынок, вынуждены учитывать последствия провала NYCTrainSign.

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

Покупаем табличку

Примерно в 2021 году я увидел, что на Reddit кто-то продаёт NYCTrainSign. Это был один из тех немногих людей, кто получил товар от компании, и стремился избавиться от него.

Поднимаем зомби: перехват контроля над мёртвым IoT-производителем - 3

Как ни удивительно, первоначальный владелец сохранил даже упаковку.

Поднимаем зомби: перехват контроля над мёртвым IoT-производителем - 4

Коробка

Поднимаем зомби: перехват контроля над мёртвым IoT-производителем - 5

Сама табличка

Поднимаем зомби: перехват контроля над мёртвым IoT-производителем - 6

Включённая табличка

Разборка

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

Поднимаем зомби: перехват контроля над мёртвым IoT-производителем - 7

Задняя панель таблички. Непонятно, что чего нужно отверстие.

Для меня, не имеющего практически никакого плотницкого опыта, корпус выглядит довольно неплохо. У него есть несколько плохих углов, но он вполне неплохо смотрелся бы в моём доме.

Внутри табличка состояла из следующих компонентов

  • Две панели из матрицы светодиодов
  • Одна плата Raspberry Pi 3
  • Одна карта MicroSD на 4 ГБ
  • Один HAT матрицы светодиодов Adafruit
  • Провода для подключения к источнику питания
  • Провода для панелей матриц
  • Небольшая кнопка, подключенная к GPIO на Pi

Поднимаем зомби: перехват контроля над мёртвым IoT-производителем - 8

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

С корпусом всё неплохо, но, взглянув внутрь, сразу можно понять, что табличка сделана не очень качественно.

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

Слишком высокая стоимость материалов

BOM (bill of materials) — это список компонентов, используемых для создания продукта. У большинства проектов, связанных с электроникой, особенно у серьёзных, существует подробный BOM, в котором есть комплектующие и цена, за которую их продают.

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

Чтобы получить розничную цену, я обычно умножаю стоимость BOM в четыре раза.

Получив доступ к табличке, мы можем прикинуть гипотетические затраты на BOM:

  • Raspberry Pi 3 — $35
  • Adafruit LED Matrix HAT — $25
  • Матрица светодиодов * 2 — $60 (минимум $30 каждая)
  • Блок питания 5 В, 2А — $5 (наиболее вероятно)
    • Подозрительно, что такой силы тока недостаточно для питания всех комплектующих в полную силу. В большинстве руководств рекомендуется от 4 до 10 А.
  • Карта MicroSD на 4 ГБ — $7 (наиболее вероятно)
  • Деревянный корпус — $15 (наиболее вероятно)
  • Прочие детали
    • Провода, кнопки, кабели, винты, упаковка (табличка продавалась в картонной коробке с листом бумаги, в пузырчатой плёнке и пенопласте) — $3 (наиболее вероятно)

То есть приблизительные затраты на BOM составили $150. Если прикинуть по моей методике, то рекомендуемая розничная цена должна быть не меньше $600.

Владельцы компании не знали этого трюка

Судя по архивам веб-страниц команда NYCTrainSign продавала таблички по $600 но были и статьи, где упоминались цены примерно $300. Кто-то говорил, что покупал таблички примерно за $200 и даже всего за $100.

Поднимаем зомби: перехват контроля над мёртвым IoT-производителем - 9

Учитывая стоимость BOM, $299 — это практически грабёж

Похоже, у компании были планы и сдавать таблички в аренду по $30 в месяц.

Очевидно, что исходя из BOM, $300 — это слишком низкая цена, но $600 — это, наверно, уже перебор. В конце концов, это просто табличка.

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

Кто продавал лопаты

Есть такая поговорка: «Во время золотой лихорадки продавай лопаты».

В нашей истории лопаты продавала Adafruit. Из-за использования Adafruit LED Matrix HAT затраты на BOM подскочили на $25 или примерно на 20%. Без HAT вполне можно было бы обойтись благодаря простым инженерным решениям.

Поднимаем зомби: перехват контроля над мёртвым IoT-производителем - 10

Та самая лопата

Причины:

  1. Без HAT можно обойтись. В библиотеке rpi-rgb-led-matrix, которую использовали в табличке, есть инструкции по прямому подключению и архитектуры для пассивной адаптерной платы. Эти инструкции и платы в 2017 году уже были в библиотеке.
  2. В 2017 существовал и более дешёвый HAT. При цене $2,10 он был бы гораздо дешевле Adafruit HAT за $25. Кроме того, несмотря на использование более дорогого Adafruit HAT, табличка по какой-то причине постоянно мерцает.
  3. Чаще всего детали Adafruit используются для прототипирования, а при переходе к производству заменяются на что-то более дешёвое. Вероятно, это отразилось и на схеме ценообразования Adafruit.

Возможно, вы подумаете, что Raspberry Pi Foundation тоже оказался продавцом лопат. Цена $35 слишком велика, это самый дорогой пункт BOM.

Эта плата может показаться излишне мощной, и я не рекомендую её использовать, однако поразмыслив, можно прийти к выводу, что выбор Pi был не таким уж плохим решением по сравнению с использованием Arduino или ESP32. Он обеспечил компании бесплатный маркетинг и дал простую среду разработки.

На мой взгляд, если команда NYCTrainSign не хотела вкладывать время в разработку на основе микроконтроллера наподобие ESP32, то было бы логично начать с Raspberry Pi 3, а затем перейти на Pi Zero W после её выпуска.

В конечном итоге им бы нужно было нацеливаться на ESP32 или что-то подобное, и ещё больше снижать затраты на BOM, но мне не кажется, что начав с Pi, они так уж ошиблись, если в долговременной перспективе эту плату хотели заменить чем-то другим.

Читаем код

Так как устройство создано на базе Raspberry Pi, можно легко создать резервную копию копию MicroSD, чтобы изучить файловую систему и внести нужные изменения.

Кодовая база таблички состоит из самописного кода на Python и NodeJS плюс из множества опенсорсных частей.

На Pi выполняется два основных самописных компонента:

  • Python-сервер (LED Server)
  • NodeJS-сервер (Config Server)

LED Server

Написанный на Python LED Server отвечает за отрисовку на матрице светодиодов и за получение данных о поездах от API компании. LED Server общается с Config Server, чтобы определить, какие параметры сконфигурировал пользователь, а затем отправляет частые HTTP-вызовы удалённому серверу, чтобы получить данные (например, время прибытия поездов и погоду).

Получив данные о поездах, LED Server локально генерирует изображение или текст, а затем рендерит их на матрице светодиодов.

Config Server

Написанный на NodeJS Config Server отвечает за хранение пользовательской конфигурации в файле JSON и получение запросов на передачу и обновление этого файла. Во время запуска Config Server получает самую новую конфигурацию с HTTP-сервера. Кроме того, Config Server подключается к конечной точке AWS IoT Core для получения обновлений конфигурации в реальном времени от MQTT-сервера.

Другие компоненты

  • При первом запуске выполняется raspberry-wifi-conf (опенсорсное приложение, заставляющее Pi создать беспроводную сеть, к которой должен подключаться пользователь; также оно передаёт ему сведения о подключении WiFi).
  • Кнопка сброса Reset управляется небольшим скриптом на Python, работающим в фоновом режиме. При нажатии на кнопку скрипт удаляет параметры Wifi, сбрасывает имя хоста, удаляет функциональность удалённого мониторинга и перезагружает сервер.
  • Похоже, компания могла удалённо подключаться к терминалу каждой таблички. Оказалось, что в моей табличке установлено ПО для удалённого контроля, созданное https://www.dataplicity.com/.

Качество кода

Изучая код, я заметил различные проблемы с качеством:

  • Похоже, API перевозок не способен учитывать, что на станции может быть несколько линий поездов. Две линии на одной станции отображаются как заканчивающиеся на одной остановке.
  • Отсутствует чётко выраженный процесс обновления прошивки. Возможно, для обновления пользователям нужно было просто прошивать карту MicroSD новым образом Pi.
  • Большая часть кода на Python просто использует системные вызовы, чтобы вносить изменения при помощи системы
  • Написанный на Python LED Server для сохрания/получения конфигурации обменивается данными с написанным на NodeJS Config Server. Подозреваю, что так было сделано, потому что команде было проще взаимодействовать с AWS IoT через NodeJS, а с дисплеем было проще взаимодействовать через Python.
  • Часто попеременно используются табы и пробелы из-за неправильно настроенных редакторов кода
  • На карту MicroSD сохранена вся git history
  • На карту MicroSD сохранена Bash history
  • Код очень редко используется многократно

Возрождение таблички

Получаем шелл

На большинстве Raspberry Pi получить рутовый шелл относительно просто, потому что на карте MicroSD отсутствует шифрование. Мы просто можем запуститься в однопользовательском режиме и сбросить пароль для пользователя pi.

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

Воссоздаём сервер

Разумеется, мы можем изменить домен, с которым общается табличка, но, к счастью, домен, с которым она коммуницирует по умолчанию, можно было купить.

Итак, я его купил.

Поднимаем зомби: перехват контроля над мёртвым IoT-производителем - 11

Кто знал, что взлом окажется таким простым

Имея полный контроль над доменом, мы можем создать новый API, которого ждёт табличка, и вернуть к жизни все таблички, которые всё ещё используются. Потенциально мы даже можем выполнить некий апдейт, чтобы обновить в табличках ПО.

Я воссоздал конечные точки для времени прибытия поездов (по крайней мере, для Нью-Йорка) и данных о погоде. Для получения времени прибытия поездов я решил использовать API сайта https://wheresthefuckingtrain.com/. Для данных о погоде я использовал OpenMeteo API.

Получаем контроль над табличкой

Как и большинство IoT-устройств, табличка выполняет множество системных вызовов. Один вызов напрямую конкатенирует ID таблички в команду шелла. Имея контроль над сервером, мы теоретически можем напрямую получить удалённый контроль над любой табличкой.

Поднимаем зомби: перехват контроля над мёртвым IoT-производителем - 12

IoT во всём своём великолепии

Так как мы контролируем домен, то теоретически можем передать любой табличке злонамеренный ID таблички и выполнить произвольную команду. Затем можно использовать её для регистрации таблички на новом сервере управления и снова вернуть людям контроль над их табличками.

Если не брать в расчёт разные скучные подробности обработки данных, наш эксплойт выглядит так:

  1. Табличка включается и пытается получить конфигурацию. Это действие происходит в бесконечном цикле, пока табличка что-нибудь не получит.
  2. Далее табличка отправляет запрос логотипа. Запрос содержит два ID, уникальных для каждой таблички. Мы сохраняем эти ID и создаём конфигурацию эксплойта таблички.
  3. При следующем запросе конфигурации таблички мы передаём табличке наш эксплойт.
  4. Мы просим пользователя перезагрузить табличку, и после перезапуска запускается наш эксплойт
  5. Эксплойт обновляет весь код, который необходим для его сопряжения с нашим новым сервером

Вот видео с запущенным эксплойтом

Получив возможность удалённой передачи произвольных данных табличек, мы можем официально заявить, что восстановление таблички завершено!

Обладая полным контролем над доменом, мы стали новыми капитанами NYCTrainSign.

Поднимаем зомби: перехват контроля над мёртвым IoT-производителем - 13

Что же случилось с компанией?

Слишком много скидок

Думаю, основная проблема — слишком высокие затраты на BOM, а также продажа множества табличек со скидкой.

Поднимаем зомби: перехват контроля над мёртвым IoT-производителем - 14

В данном контексте $117 — это практически бесплатно

Я не думаю, что даже во время беты можно производить продукт за $150, а продавать за $117, не имея поддержки венчурного капитала.

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

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

Переизбыток рекламы

У компании NYCTrainSign какое-то время имелся главный директор по маркетингу, менеджер по соцсетям (SMM) и ассистент по соцсетям.

Поднимаем зомби: перехват контроля над мёртвым IoT-производителем - 15

Поднимаем зомби: перехват контроля над мёртвым IoT-производителем - 16

Поднимаем зомби: перехват контроля над мёртвым IoT-производителем - 17

Резюме трёх бывших сотрудников компании на LinkedIn

Для только что зарождающегося стартапа это кажется перебором.

В то время у MTA (компании, занимающейся перевозками в Нью-Йоркском метрополитене) часто случались задержки поездов, активно освещавшиеся в медиа. Похоже, NYCTrainSign быстро и бесплатно привлекла к себе большой интерес. Вероятно, было бы достаточно и бесплатного маркетинга.

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

Нехватка продукта

Однако несмотря на спрос, команда не могла обеспечить выпуск в нужных объёмах. Не говоря уже о том, что каждую табличку вручную собирали в Бруклине, а это при низкой розничной цене было очевидно невыгодным. Кроме того, маловероятно, что у компании было на руках достаточно комплектующих, поэтому ей приходилось ждать поставок.

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

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

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

Слишком много поваров

Судя по информации на Linkedin, изначально у компании было четыре основателя. Со временем она разрослась до 11 человек, а в какой-то момент суммарно в работе компании принимало участие 15 человек.

Поднимаем зомби: перехват контроля над мёртвым IoT-производителем - 18

Если даже каждому основателю досталось бы всего 60 тысяч долларов, то учитывая прибыль на каждую табличку примерно в $400, нужно было бы продавать в год около 600 табличек по полной цене, чтобы заработать достаточную выручку для выплаты зарплат.

Один из основателей как-то опубликовал скриншот их продаж: примерно за два месяца компания достигла выручки в 250 тысяч долларов.

Поднимаем зомби: перехват контроля над мёртвым IoT-производителем - 19

Выручка — это, скорее, показатель популярности, а не предпринимательского успеха

Однако непонятно, какую часть этой суммы составляла прибыль, ведь многие таблички продавались по огромной скидке. Стоимость $600 кажется чрезмерной. Гораздо разумнее выглядит цена в $200 или $300.

Мне кажется, что в городе с населением примерно 8,5 миллиона было бы не особо сложно продавать 600 табличек хотя бы в первый год. Но в следующий год вам пришлось бы снова продавать примерно 600 табличек. И это не включая затраты на всех других сотрудников, подрядчиков и так далее.

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

Хорошая идея, подходящий момент, плохая команда, плохой продукт

После смерти компании её основатели и сотрудники по какой-то причине попытались создать некую консалтинговую фирму.

Поднимаем зомби: перехват контроля над мёртвым IoT-производителем - 20

Интервью с основателями о том, как им не удаётся справиться с выполнением заказов

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

Поднимаем зомби: перехват контроля над мёртвым IoT-производителем - 21

Скорее всего, это правда, но деньги должны были куда-то деваться

Это отсутствие прозрачности превратило любимую когда-то публикой компанию во что-то типа мема.

Сегодня компания полностью развалилась, и трое из четырёх основателей публично заявили, что занялись другими делами. Многие из бывших сотрудников по-прежнему указывают компанию в своём резюме на LinkedIn. Один основатель (CEO) пропал с радаров, и его не найти в Интернете.

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

Меня крайне расстраивает то, что я искренне верю: если бы команда NYCTrainSign пообщалась с кем-нибудь, имеющим познания в электронике, то она была бы гораздо успешнее. Однако, похоже, что главным консультантом основателей компании был их профессор computer science из колледжа.

Кажется, NYCTrainSign просто взяла проект, который в свободное время разрабатывал её CEO, и попыталась продавать его за $300-$600, не сделав из него готовый продукт и не продумав то, что может произойти потом.

Поднимаем зомби: перехват контроля над мёртвым IoT-производителем - 22

Итог: хорошая идея, хорошо выбран момент, плохая команда, плохой продукт.

Основатели и сотрудники кажутся мне достаточно честными людьми. Не думаю, что у них были какие-то коварные намерения.

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

Однако CEO Тимоти Ву должен был честно рассказать, что произошло со всеми средствами покупателей и что пошло не так.

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

Что происходит сегодня

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

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

Поднимаем зомби: перехват контроля над мёртвым IoT-производителем - 23

Буквы G и R в правом верхнем углу обозначают дни уборки мусора и перерабатываемых отходов. На самом деле, это самая полезная функция таблички.

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

Не говоря уже о том, что рынок светодиодных табличек переполнен и на нём множество готовых решений. Светодиодных вывесок много не только на Amazon, есть и более сложные таблички, например, Tidbyt или эта, найденная мной на Etsy.

Поднимаем зомби: перехват контроля над мёртвым IoT-производителем - 24

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

Поднимаем зомби: перехват контроля над мёртвым IoT-производителем - 25

Для сообщества я выложу в опенсорс исходный код таблички NYCTrainSign, а также воссозданный сервер API с кодом эксплойта.

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

Поэтому если у вас есть табличка NYCTrainSign, попробуйте сайт, который я создал для удалённого управления табличками.

Если инструкции не помогли, отправьте отчёт. Ну а если у вас нет NYCTrainSign, то её точно не стоит покупать.

Автор:
PatientZero

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js