21 puntos por xguru 2023-01-16 | 2 comentarios | Compartir por WhatsApp

Han pasado 5 años desde que NYCTrainSign cerró

  • Un letrero LED personal que muestra los tiempos de llegada del metro de Nueva York (basado en Raspberry Pi)
  • Investiga por qué fracasó la empresa y escribe un exploit para tomar control de su fleet
  • En ese momento fue enormemente popular en Instagram/Facebook, pero también hubo mucha gente que nunca recibió su producto
  • Lo consiguió a través de un vendedor de segunda mano y, al desarmarlo, descubrió que por dentro era de muy baja calidad y que era un negocio no sostenible
    • El BOM (Bill of Materials) era demasiado alto, es decir, el costo de fabricación en sí era muy elevado
    • Normalmente calculo el precio minorista estimado multiplicando el costo del BOM por 4

Precios de los componentes

  • Raspberry Pi 3 - $35
  • Adafruit LED Matrix Hat - $25
  • LED Matrix * 2 - $60
  • Fuente de poder 5V 2A - $5
  • Tarjeta MicroSD de 4GB - $7
  • Carcasa de madera - $15
  • Además de eso, cables, botones, tornillos, empaque, etc. - $3
  • Es decir, incluso calculándolo solo así da $150, así que debieron haber cobrado $600

Ellos no conocían el truco

  • Viendo su sitio web en Web Archive, parece que intentaron venderlo a $599
  • Pero al principio también lo vendieron a $299 o incluso a $100 (versión beta)
  • Parece que también intentaron alquilarlo por $30 al mes (como el hardware requiere un costo inicial, este modelo también habría sido difícil)

¿Quién vendió las palas?

  • “En una fiebre del oro, vende palas”. Entonces, ¿quién ganó dinero vendiendo las palas aquí? Adafruit
  • Al usar el "Adafruit LED Matrix HAT", el precio aumentó en $25 (aprox. 20%)
  • Esto se podría haber reducido con un poco de esfuerzo de ingeniería, porque no era algo estrictamente necesario
    • Se pudo haber cableado directamente. O usar HATs baratos de $2
  • La mayoría de los productos de Adafruit se usan solo para prototipado inicial y luego se reemplazan por opciones más baratas en producción real
  • También se podría pensar que Raspberry Pi fue quien vendió las palas, pero usar Arduino o ESP32 para esto parece un poco excesivo
  • Cree que empezar con Pi 3 y luego cambiar a Pi Zero W habría sido lo correcto

Revisando el código

  • Revisó el código en Python y NodeJS que estaba dentro de la MicroSD
  • Hay 2 componentes principales: un servidor en Python (servidor LED) y un servidor en NodeJS (servidor de configuración)

Servidor LED

  • Se encarga de dibujar en la LED Matrix y de obtener la información de los trenes desde la API de la empresa
  • Se comunica con el servidor de configuración para obtener las preferencias del usuario
  • Recibe los datos de los trenes, genera imagen/texto y los renderiza en la LED Matrix

Servidor de configuración

  • Guarda la información del usuario en JSON y actualiza ese archivo al recibir solicitudes de cambio
  • Al arrancar, el servidor de configuración obtiene la información más reciente
  • Se conecta a AWS IoT Core y recibe cambios de configuración en tiempo real desde el servidor MQTT

Calidad del código

  • Hay varios problemas con la calidad del código
  • La API de tránsito no considera que cada estación puede tener múltiples líneas de tren
  • No existe un proceso de actualización de firmware
  • Mucho del código en Python simplemente usa llamadas al sistema para hacer cambios en el sistema
  • El servidor LED en Python obtiene información comunicándose con el servidor de configuración en NodeJS; probablemente porque AWS IoT Core era más fácil de programar en NodeJS y Python facilitaba el manejo de la pantalla
  • Mezclan tabs y espacios (probablemente por una mala configuración del editor)
  • Todo el historial de git estaba guardado en la micro sd
  • También estaba guardado el historial de bash
  • Casi no hay reutilización de código

Resurrección del Sign

Obtener shell

  • Como la mayoría de las Raspberry Pi no tienen la MicroSD cifrada, fue fácil obtener root shell
  • Solo había que arrancar en modo de usuario único y resetear la contraseña del usuario pi
  • La API de la empresa ya no existe, y el dispositivo está hecho para usar datos locales hardcodeados cuando no tiene conexión a internet

Recrear el servidor

Obtener control del Sign

  • Como otros dispositivos IoT, el Sign usa muchas llamadas al sistema
  • Una de ellas usa directamente el Sign ID concatenándolo en un comando de shell
  • Como controlaba directamente el servidor de la API, era posible controlar remotamente todos los Signs
  • Después de varios intentos, escribió un exploit
    • Cuando el dispositivo Sign se enciende, obtiene su configuración y hace una solicitud por el logo de imagen
    • En ese momento se envía el Sign ID
    • Guarda ese ID y, en la siguiente solicitud del logo de imagen, le envía el exploit al Sign
    • Si el usuario reinicia el Sign, el exploit se ejecuta al arrancar
    • El exploit actualiza el código necesario y hace que se empareje con su servidor
  • Ahora esos dispositivos funcionan bien con el nuevo servidor de API

¿Qué fue lo que pasó?

  • El problema fueron demasiadas ventas con descuento
    • No se puede fabricar algo por $150 y venderlo a $117
    • Incluso $300 era demasiado barato. Desde el inicio debieron haber cobrado $600
  • Para ser una startup, tenían demasiada gente de marketing y demasiado gasto en publicidad
  • Tampoco lograron fabricar suficientes unidades para la demanda (todo era manual)
    • Aun así, siguieron aceptando pedidos y terminó pareciendo un esquema Ponzi: usaban el dinero de pedidos nuevos para fabricar las unidades anteriores que habían vendido con descuento
    • Tampoco lograron mover la producción a China
  • En LinkedIn se veía que había 4 fundadores y luego crecieron a 11, llegando a 15 personas en cierto momento
    • Incluso calculando solo $60k por fundador, tendrían que vender al menos 600 dispositivos con una ganancia de $400 cada uno
  • Según una captura compartida por los fundadores, hicieron $250k de ingresos en dos meses, pero
    • como descontaron demasiado el producto, no se sabe cuánta ganancia real hubo
  • Los fundadores no aclararon qué pasó, por qué se enviaron tan pocos productos ni a dónde fue todo el dinero
  • Uno de los fundadores dijo que personalmente no recibió nada de dinero
  • Cree que NYCTrainSign habría tenido éxito si al menos hubieran hablado con alguien con conocimientos de electrónica
    • En cambio, su asesor principal era un profesor universitario de ciencias de la computación
  • NYCTrainSign era un proyecto que el CEO hizo en su tiempo libre y luego intentó vender por $300~$600 sin considerar lo que vendría después
  • En conclusión: "Good Idea, Good Timing, Bad Team, Bad Product"

What Happens Now

  • Al principio, cuando empezó con esto, soñaba con vender su propio Sign
  • Lo hizo con ESP32 y todavía lo sigue usando
  • Pero cuanto más lo piensa, más siente que no es la persona adecuada para fabricar y vender esto
  • El mercado de los LED Sign ya es muy competitivo: existen Tidbyt y muchísimas empresas en Amazon
  • Así que decidió dejarlo solo como proyecto personal de aprendizaje
  • Publicó como open source todo lo relacionado con NYCTrainSign
    • Incluyendo el servidor de API con el código del exploit
  • También planea seguir alojando el nuevo servidor de NYCTrainSign (el costo de hosting es muy bajo)
  • No va a agregar funciones nuevas, pero sí tiene ideas para un firmware mejorado
  • Si tienes un Sign, ya dejó hecho un sitio para administrarlo de forma remota, así que pruébalo
  • "Si no tienes un Sign, no compres uno nuevo"

2 comentarios

 
loblue 2023-01-18

Está interesante jaja
Pero si consideran que esto puede ser rentable y lo convierten en negocio, ¿no habría problemas legales?

 
kloty 2023-01-16

Se siente como estar viendo un juego de magnate

Code Quality > Creo que hay un error tipográfico y donde dice "ninguno" en los diversos problemas de calidad de código.