Alles wat ik bezit, is 'owned'
De afgelopen weken heb ik agent-gestuurde reverse engineering uitgevoerd op randapparatuur die toevallig binnen handbereik was. Het resultaat van deze sessies is een volledige plaintext-command shell in mijn microfoon, een webcam waarvan ik het activiteitslampje kan uitschakelen terwijl hij opneemt, en een key light die geheugenschrijfacties toestaat aan iedereen op het wifi-netwerk. Randapparatuur is een ideaal doelwit voor agentische RE (reverse engineering): het zijn kleine computers die verbonden zijn met mijn computer, met een dataconnectie naar de host en meestal een mechanisme voor firmware-updates, waardoor een agent iets heeft om tegen te itereren. Het netto resultaat is een betere controle over en begrip van mijn machine.
Mijn proces was voor elk van deze apparaten vrijwel hetzelfde: ik haalde een kopie van de firmware van het apparaat en de bijbehorende update-tool bij de fabrikant, plaatste deze in mijn reverse engineering-omgeving, vertelde Claude Opus 5 wat mijn doelen waren en liet het proces lopen. Afhankelijk van het apparaat verschilden de doelen enigszins, maar ze zagen er meestal als volgt uit:
"In deze directory staan de firmware en de update-utility voor ___. Het apparaat is ook verbonden met deze computer, en je kunt er op niet-muterende wijze mee communiceren. Documenteer en valideer de volledige firmware uitputtend, inclusief de volgende doelen:
* reverse engineer het firmware-updateformaat en het updateprotocol;
* implementeer onze eigen update-utility;
* bepaal de beveiligingseigenschappen van het updateprotocol, inclusief checksums, signatuurvalidatie en secure boot;
* gebruik statische en dynamische analyse om alle protocoloppervlakken te bepalen en de functionaliteit volledig in kaart te brengen;
* zoek naar verborgen of debug-functionaliteit in het product en hoe deze te benaderen."
Afhankelijk van de resultaten volgden verschillende vervolgstappen. Elk apparaat is gekoppeld aan een GitHub-repo met gegenereerde documentatie en scripts, waarvan de meeste live zijn gevalideerd op echte hardware. In totaal kostten de vijf apparaten ongeveer 13 uur aan "churn" (de tijd dat Claude daadwerkelijk werkte) en 98 prompts, verspreid over twee weken.
Overzicht van de apparaten
Insta360 Link webcam
GitHub repo - 3,7 uur Claude churn, 33 prompts
Ik gebruik een Insta360 Link webcam, een gimbal-camera met pan-tilt-zoom die gezichtsherkenning gebruikt voor automatische kadrering. Ik wilde weten of het mogelijk was om het activiteitslampje te omzeilen.
Het bleek direct duidelijk dat er veel binnen deze camera gebeurt. Hij draait op een volledig RTOS (ThreadX) van de SoC-leverancier Ambarella. Dit RTOS host verschillende kleine vision-modellen voor gezichtsherkenning en gebarenherkenning. Deze complexiteit biedt een interessante aanvalsoppervlakte.
Via de USB Video Class-interface is er een XU (Extension Unit) commando dat het apparaat in "mass storage"-modus zet. Hiermee kan een firmware-update worden overgebracht naar het interne FAT-bestandssysteem van het apparaat, die na een reboot wordt toegepast. Hoewel dit een fysieke reboot vereist, is er een ander commando-kanaal via de USB vendor class dat willekeurige lees- en schrijfacties van bestanden en een reboot-commando mogelijk maakt. Hiermee kan het apparaat volledig worden geflasht zonder tussenkomst van de gebruiker. Er is in feite geen anti-tamper beveiliging; er wordt enkel een MD5-hash toegevoegd om de integriteit te waarborgen.
Het indicator-LED-lampje heeft in de firmware een goed gestructureerde set "patronen" die kleur en knippergedrag bepalen. Ik liet Claude een tool schrijven om de tabelvermelding voor camera-activiteit te patchen, de integriteits-hash te corrigeren en dit naar de camera te flashen. Een test wees uit dat het groene LED-lampje, dat normaal brandt tijdens het opnemen, niet langer aanging. Omdat de gimbal bij dit apparaat naar beneden buigt wanneer hij niet opneemt, is het niet volledig stealth, maar het resultaat is ongemakkelijk.
ASUS ROG Swift PG42UQ monitor
GitHub repo - 1,2 uur Claude churn, 13 prompts
Ik begon bij deze monitor omdat ik geërgerd was door een pop-up overlay die me af en toe vraagt om "pixel cleaning" uit te voeren. Ik heb dit nooit gedaan en wil dat de overlay definitief verdwijnt.
Claude ontdekte dat de firmware vrijwel geen beveiliging heeft: er is een A/B-schema met twee slots en een simpele checksum, maar in essentie kunnen we alles wegschrijven wat we willen. Firmware-updates verlopen via een I2C-bus die via USB is overbrugd.
De waarschuwing voor pixel cleaning kan niet op een native manier worden uitgeschakeld; hij verschijnt altijd na 8 uur runtime. Claude vond echter wel het juiste gebied in de firmware om deze functionaliteit via een patch te verwijderen. Vanwege de hoge prijs van de monitor ben ik nog niet durven overgaan tot het schrijven van de gemodificeerde firmware.
Daarnaast heb ik de DDC/CI-interface onderzocht. Dit is het controlekanaal via de displaykabel waarmee de host instellingen kan wijzigen. ASUS biedt dit aan via hun Windows-utility (DisplayWidget), maar dat werkt niet op Linux. Ik heb nu een shell-script waarmee ik DDC/CI-functies kan bedienen, zoals het hardware-crosshair, zoom-overlays, de FPS-teller en de countdown-timer.
Shure MV7 microfoon
GitHub repo - 4,2 uur Claude churn, 32 prompts
Uit pure nieuwsgierigheid heb ik mijn Shure MV7 microfoon onderzocht. Deze verbindt via USB en heeft on-device digitale volumeregelaars.
De firmware zat verborgen in de Windows-software MOTIV Mix. Claude installeerde deze via Wine, vond de updateserver en downloadde de firmware. De firmware bevat zowel DSP- als MCU-firmware en is relatief eenvoudig. Ook hier is er geen echte beveiliging bij het flashen.
Het updateprotocol onthulde echter dat het geheel draait op een USB HID vendor class-protocol dat een volledige plaintext-command shell implementeert met 48 verschillende commando's. Omdat het HID is, kan dit via WebHID vanuit een Chrome-webpagina worden aangestuurd; Claude bouwde hiervoor een webinterface.
Er zijn diverse interessante instellingen, waaronder DSP-knoppen, willekeurige geheugenlees- en schrijfoperaties, LED-besturing en een systeem met vier gebruikersprivileges. De authenticatie hiervan bestaat enkel uit een string-vergelijking met de naam van het privilege-niveau. Het commando su sup werkt simpelweg. Het hoogste niveau kan het touchpaneel uitschakelen (zodat je niet op het apparaat zelf kunt muten) en de mute-LED onafhankelijk aansturen van de werkelijke mute-status.
Elgato Cam Link 4K video capture
GitHub repo - 1,5 uur Claude churn, 10 prompts
De Elgato Cam Link 4K is een HDMI-video capture-apparaat. Bij dit apparaat liet ik het proces volledig autonoom verlopen; ik startte het proces voordat ik ging slapen en werd wakker met een volledige analyse en een functionele firmware-updater. De firmware bevat een MCU-image en een FPGA-bitstream voor de HDMI-afhandeling. Er is geen beveiliging op het firmware-updatepad.
Ik kon alle EDID-informatie extraheren die wordt gebruikt voor het onderhandelen over videoparameters, waardoor we precies weten welke resoluties, verversingssnelheden, kleurruimtes en chroma subsampling-opties worden aangeboden. Het vendor HID-protocol bevat bovendien getunnelde toegang tot de interne I2C-bus, waarmee de interne HDMI-ontvangerregisters kunnen worden aangepast.
Elgato Key Light Mini
GitHub repo - 2,4 uur Claude churn, 10 prompts
Tot slot heb ik de Elgato Key Light Mini onderzocht, die via wifi in plaats van USB werkt. Dit bleek interessanter dan verwacht: het is het enige apparaat met betekenisvolle firmware-integriteitsbeveiliging. Elgato ondertekent firmware-updates met Ed25519 over een SHA-512 hash en weigert firmware die niet valideert. Dit is logisch, aangezien het apparaat verbinding maakt met een wifi-netwerk en ongeauthentiseerde toegang biedt aan iedereen op dat netwerk.
Deze beveiliging beschermt de firmware echter slechts op één moment: tijdens de update. Het is geen controle bij het opstarten (secure boot). De updater draait terwijl de rest van het apparaat operationeel is, wat een groot aanvalsoppervlak creëert. Claude vond een exploit: een HTTP POST-verzoek dat een payload rechtstreeks in de interne UART plaatst, inclusief een geheugen-poke commando.
Een enkele HTTP POST met ATSE=0200ED94,0E001009 verandert de signatuurcontrole in een "no-op", waardoor we vrij kunnen updaten naar een firmware-image zonder legitieme signatuur. Ik heb dit succesvol getest met een patch die de naam van het apparaat wijzigde. Plaats deze apparaten dus niet op een onvertrouwd netwerk.
Reflecties
Ik heb gemengde gevoelens over deze resultaten. Enerzijds is dit fantastisch voor interoperabiliteit en het repareren van zaken die niet werken zoals we willen. Hardware is tegenwoordig bijna universeel "open" voor tinkering, mits men een paar uur aan machine-gestuurde arbeid investeert.
Anderzijds is dit als security professional beangstigend. Ik ga er nu vanuit dat elk apparaat dat aan een computer is gekoppeld, een maliciueuze firmware-implant kan bevatten. Voorheen vereiste dit een aanzienlijke investering per model en werd het toegeschreven aan "state actors". Besturingssystemen zijn niet uitgerust om te garanderen dat een microfoon ook echt een microfoon blijft, en niet spontaan verandert in een toetsenbord dat Win+R indrukt en een payload downloadt wanneer de kamer stil genoeg is. De aanwezigheid van WebUSB, WebHID en WebBluetooth betekent dat een moment van onoplettendheid bij het accepteren van een permissie-prompt een apparaat permanent kan compromitteren.
Netwerkverbonden apparaten lijken op dit moment vrijwel universeel onbeveiligd. Ik heb in andere projecten (niet gedocumenteerd hier) een root shell gekregen op een commercieel Dell-display en RCE (Remote Code Execution) op een Eaton UPS. De snelheid en schaal waarop dit nu kan worden uitgevoerd, verhoogt het risico aanzienlijk.
Tot slot denk ik aan wat een AI-uitgeruste, automatisch reverse-engineering worm vandaag de dag zou kunnen doen. Het is een kleine stap naar malware die zichzelf repliceert, zijn omgeving scant en via een slim command-and-control centrum probeert door te dringen tot accessoires, IoT-apparaten en industriële apparatuur in de nabijheid van een geïnfecteerd doelwit. Twee zaken hielden dit tegen: elk model vereist eigen reverse engineering, en validatie vereist de fysieke hardware. De eerste barrière is nu weggenomen door agents; de tweede barrière is irrelevant voor malware die al op een geïnfecteerde host staat. Ik zou niet verbaasd zijn als dit al bestaat. De komende jaren zullen uiterst interessant worden. 🫠
Groetjes,