Een gedeactiveerde Cricut Maker uit e-waste ontgrendelen

Zo bleek inderdaad dat deze machine was geblokkeerd, wat eigenlijk wel te verwachten was. Met wat hacking was ik echter in staat om de volledige functionaliteit te herstellen. Het is zeer waarschijnlijk dat de vorige gebruiker een vervangend apparaat onder garantie heeft ontvangen of korting heeft gekregen op een nieuwer model.

Alex deed wat kort onderzoek en ontdekte dat vervangende rollers gemakkelijk verkrijgbaar waren voor een klein bedrag. Zelfs toen de machine werd gevoed met 12V in plaats van de schijnbaar vereiste 18V, vertoonde het apparaat tekenen van leven; de zelftest werd doorstaan en de machine communiceerde met de software, hoewel er bij verbinding de gevreesde melding "Machine deactivated" verscheen.

De eerste pogingen

De eerste aanpak die ik wilde onderzoeken, was of er een EEPROM op het moederbord zat waarin ik het serienummer kon herschrijven. Het demonteren van het apparaat is niet voor mensen met zwakke zenuwen — het is een intensief proces — maar ik moest dit sowieso doen om de rollers te vervangen. Ik vond echter geen EEPROM en voor de gebruikte MCU had ik geen debugger.

Mijn tweede idee was om de netwerkverbinding te onderscheppen en het serienummer te vervangen of een succesmelding terug te sturen. Diverse beveiligingsmaatregelen in de applicatie maakten het echter lastiger dan ik wilde om certificate pinning uit te schakelen. Dat is niet om te zeggen dat het onmogelijk is, maar ik heb niet uitgevonden hoe dit triviaal kon worden gedaan.

De oplossing: USB-interceptie

Mijn focus verschoof naar het onderscheppen van de communicatie tussen de snijmachine en de computer. Ik startte Wireshark om de USB-berichten tussen de Cricut en mijn machine vast te leggen. Het apparaat maakt gebruik van USB CDC voor communicatie en ik vond al snel de pakketten die verantwoordelijk zijn voor het verzenden van het serienummer. Er leek geen sprake te zijn van checksums of cryptografie. Daarom heb ik een Raspberry Pi RP2040 geleend, die zowel als USB-host als USB-client kon fungeren.

Met behulp van de TinyUSB Arduino-voorbeelden voor USB-host en CDC simple echo, kon ik een eenvoudige proxy/herschrijf-unit samenstellen. Er was niets bijzonders aan, hoewel het even duurde voordat ik erachter kwam dat de USB-host niet correct werkt tenzij deze wordt overgeklokt naar 240MHz. Ook heb ik alle USB-metadata, zoals het vendor- en product-ID en de beschrijvingen, aangepast zodat deze overeenkwamen met de unit. Wanneer het apparaat een pakket van de snijmachine detecteert dat de juiste lengte heeft en het commando/serienummer bevat, wordt dit vervangen door een ander serienummer. Serienummers lijken sequentieel te worden uitgegeven en de status van alle units is in te zien op de eigen webpagina van Cricut.

Doordat het herschrijfapparaat het serienummer op hardwareniveau vervangt, merkt de software er niets van. De unit verschijnt in mijn account. Ik kon zelfs serienummers registreren die niet bestonden op de statuspagina van Cricut. Dit roept overigens wel de vraag op of willekeurige vreemden de serienummers van andere gebruikers kunnen blokkeren of aan hun eigen accounts kunnen toevoegen.

Resultaat

Na het schoonmaken van de unit, het vervangen van de rollers (tip: gebruik warm water om de nieuwe rollers zacht te maken voor de installatie), het opnieuw assembleren van de Cricut en het printen van een klein kastje voor de RP2040, kon ik het apparaat gebruiken alsof het gloednieuw was.

Alternatieve methoden

De aanpak die ik heb gebruikt om deze Cricut weer werkend te krijgen is waarschijnlijk de minst gebruiksvriendelijke methode, aangezien ik geloof dat er softwarematige oplossingen bestaan. Enkele alternatieven die in me opkomen zijn:

  • Het netwerkverkeer onderscheppen of de applicatie patchen om een ander serienummer te rapporteren.
  • Een driver schrijven die zich voordoet als een Cricut USB CDC-verbinding en het serienummer proxy't.
  • Een driver schrijven die zich voordoet als een Cricut USB CDC-verbinding, maar via Bluetooth verbinding maakt met de Cricut.
  • Het proces van firmware-updates uitzoeken en dit gebruiken om het serienummer als onderdeel van de update te patchen.
  • Een apparaat maken dat fungeert als een Bluetooth-proxy.
  • Een extra MCU plaatsen tussen de Bluetooth-chip en de Cricut MCU om het serienummer te herschrijven voordat het naar de Bluetooth-chip gaat.

Ik ga deze opties niet verder onderzoeken omdat ik nu iets heb dat voor mij werkt, maar het zijn allemaal levensvatbare mogelijkheden. Daarnaast zal ik de code die nodig is voor het wijzigen van het serienummer niet delen, omdat dit mogelijk niet is vrijgesteld onder de Australische auteurswet (ik ben geen advocaat), maar het komt zeer dicht bij de meegeleverde voorbeelden in de TinyUSB Arduino-bibliotheek.