Stuur sensordata via Zoek mijn-netwerk van Apple

© PXimport

Stuur sensordata via Zoek mijn-netwerk van Apple

Geplaatst: 18 november 2021 - 04:03

Aangepast: 25 november 2022 - 11:16

Koen Vervloesem

De functie ‘Zoek mijn’ van Apple is bedoeld om verloren apparaten terug te vinden. Een beveiligingsonderzoeker heeft ontdekt hoe je deze functie kunt misbruiken om álle Apple-apparaten als netwerk in te zetten. Zo kun je van overal willekeurige data doorsturen, zolang er een Apple-apparaat in de buurt is. Wij bouwden hierop voort om apparaten die geen internetverbinding hebben sensordata te laten doorsturen.

Code downloaden

Met de app Zoek mijn van Apple kun je een verloren iPhone, iPad, Mac(Book), Apple Watch of AirPod terugvinden, evenals de AirTag die in april werd aangekondigd. Dat werkt doordat Apple-apparaten bluetooth-signalen uitzenden, die door andere apparaten worden opgepikt en dan naar Apple worden verzonden. Dat gebeurt met respect voor privacy: die bluetooth-signalen bevatten noch je identiteit noch andere persoonsgegevens. Andere Apple-gebruikers en zelfs Apple krijgen dus niet te zien waar je apparaten zich bevinden.

01 OpenHaystack

Onderzoekers van het Secure Mobile Networking Lab van de TU Darmstadt in Duitsland hebben als onderdeel van hun project Open Wireless Link de werking van het Zoek mijn-protocol van Apple gereconstrueerd. Ze hebben op basis hiervan ook hun eigen framework gemaakt om bluetooth-apparaten te traceren via het Zoek mijn-netwerk: OpenHaystack. Op dit project bouwen we voort in deze masterclass.

Voor OpenHaystack heb je macOS 11 (Big Sur) nodig. De installatie is wat omslachtiger dan je gewend bent van Mac-software, omdat de locatierapporten alleen via een niet-publieke API van Apple beschikbaar zijn. De ontwikkelaars hebben toegang tot die gegevens gekregen door een aangepaste plug-in voor Apple Mail te schrijven. De plug-in erft dan de toegangsrechten van Apple Mail over.

Met OpenHaystack maak je je eigen bluetooth-trackers die het Zoek mijn-netwerk van Apple gebruiken.

© PXimport

02 Installeer OpenHaystack

Download de nieuwste release van OpenHaystack van GitHub en open de applicatie op je Mac. Je krijgt de vraag om de plug-in voor Mail te installeren. Daarvoor moet je tijdelijk de beveiligingsfunctie Gatekeeper van macOS uitschakelen. Open een terminalvenster en typ daarin de volgende opdracht:

sudo spctl --master-disable

Open dan in Mail Voorkeuren en klik in het tabblad Algemeen op Beheer plugins. Krijg je die laatste knop niet te zien, voer dan in de terminal de volgende opdracht uit:

sudo defaults write "/Library/Preferences/com.apple.mail" EnableBundles 1

Vink in het venster om de plug-ins te beheren de optie OpenHaystackMail.mailbundle aan en bevestig dat je de plug-in toegang wilt geven tot de data waar Mail toegang tot heeft. Je hoeft dit niet blindelings te vertrouwen: je kunt in de broncode van de plug-in bekijken wat die doet. Je e-mails worden bijvoorbeeld niet bekeken. Herstart daarna Mail. En schakel Gatekeeper weer in met de volgende opdracht:

sudo spctl --master-enable

OpenHaystack krijgt toegang tot het Zoek mijn-netwerk via een plug-in voor Apple Mail.

© PXimport

03 Voeg een apparaat toe

OpenHaystack toont nu een kaart. Als het bolletje rechtsboven groen is, heeft de applicatie toegang tot het Zoek mijn-netwerk. Klik op de plusknop bovenaan om een accessoire toe te voegen. Klik met de Ctrl-toets ingedrukt op het accessoire en kies dan Rename om het een naam te geven. Met een klik op het pictogram ervoor kun je dit pictogram en de kleur aanpassen.

Verbind dan een ondersteund apparaat via usb met je Mac. Dat is voorlopig beperkt tot ESP32-ontwikkelbordjes en de BBC micro:bit v1. Als je op de knop Deploy naast het aangemaakte accessoire klikt, installeert de applicatie de juiste firmware op je apparaat.

Installeer de OpenHaystack-firmware op een ondersteund apparaat.

© PXimport

04 Bouw de firmware

Lukt dit installeren om een of andere reden niet, dan kun je ook zelf de firmware flashen, en dat kan ook op een andere (Mac- of Linux-)computer dan je Mac met de OpenHaystack-applicatie. Voor de ESP32 installeer je eerst ESP-IDF en Python. Download dan het bestand Source code van de nieuwste release van OpenHaystack. Ga in een terminalvenster naar de map Firmware en dan ESP32 met de opdracht:

cd Firmware/ESP32

Bouw dan de firmware met ESP-IDF:

idf.py build

De ESP32-DevKitC V4 is een van de officiële ontwikkelbordjes van Espressif.

© PXimport

05 Flash de firmware

Klik nu weer met de Ctrl-toets ingedrukt op het accessoire in OpenHaystack en kies dan Copy advertisement key (Base64). Keer dan weer terug naar het terminalvenster waar je de OpenHaystack-firmware zojuist gebouwd hebt en flash de firmware met de gekozen sleutel, bijvoorbeeld als volgt:

./flash_esp32.sh -p /dev/tty.usbserial-210 "DwUEQ/a+QCDuKVa+p2H4HIvDz/P1Fs/4D3odsA=="

De tekens tussen de aanhalingstekens zijn de Base64-codering van de sleutel, voer hier in de plaats daarvan de jouwe in. Het apparaatbestand /dev/tty.usbserial-210 heeft ook een aanpassing aan jouw eigen situatie nodig. Je kunt in een terminalvenster op je Mac bekijken welk apparaatbestand het moet zijn:

ls /dev/tty.usbserial-*

Onder Linux heeft het apparaatbestand de vorm /dev/ttyUSB*.

Zodra de firmware is geflasht, reset je het bordje, bijvoorbeeld door de usb-kabel er even uit te trekken en weer aan te sluiten. Klik met de Ctrl-toets ingedrukt dan in de OpenHaystack-applicatie nog eens op je accessoire en kies Mark as deployed. Als je ESP32 zich nu in de buurt van Apple-apparaten bevindt, wordt de locatie van je bordje normaal binnen een halfuur zichtbaar in de OpenHaystack-applicatie.

Schrijf de OpenHaystack-firmware met je sleutel naar het ESP32-bordje.

© PXimport

06 Hoe werkt OpenHaystack?

Wanneer je een accessoire aanmaakt in de OpenHaystack-applicatie, maakt die een sleutelpaar. De geheime sleutel blijft in de sleutelhangertoegang (keychain) op je Mac. De bijbehorende publieke sleutel wordt in de firmware van je accessoire (de ESP32 of de BBC micro:bit) geschreven.

Zodra de firmware op je accessoire staat, stuurt die de publieke sleutel elke seconde uit in BLE-pakketjes (bluetooth low-energy). Als iPhones met iOS 13 (of nieuwer) in de buurt die pakketjes oppikken, versleutelen ze hun huidige locatie met de publieke sleutel van je accessoire en uploaden ze dit locatierapport naar Apple.

Apple ziet alleen versleutelde informatie op zijn servers binnenkomen en weet niet eens welke locatie bij welk apparaat of welke gebruiker hoort. Je kunt dus niet aan Apple vragen om de meest recente locatierapporten van al je apparaten te zien. Maar elke Apple-gebruiker kan elk locatierapport downloaden zolang ze de publieke sleutel ervan kennen.

OpenHaystack downloadt dus de locatierapporten van je ingestelde accessoires op basis van hun publieke sleutels. Daarna gebruikt de applicatie de bijbehorende geheime sleutel (opgeslagen in de keychain van macOS) om het rapport te ontcijferen, waarna ze de locatie van je accessoire op de map kan tonen. Apple laat wel alleen geauthentiseerde gebruikers toe om locatierapporten te downloaden. Daarom moet je Apple Mail openhouden wanneer je de OpenHaystack-applicatie gebruikt: die communiceert met de plug-in in Mail om de rapporten te downloaden.

07 Stuur willekeurige data door

Beveiligingsonderzoeker Fabian Bräunlein van Het Berlijnse bedrijf Positive Security ging nog een stapje verder: hij vond een manier om willekeurige data via het Zoek mijn-netwerk van Apple te versturen. De aanpak noemde hij Send My.

Het idee is dat je bit 0 codeert door één publieke sleutel en bit 1 door een andere publieke sleutel. Je zendt dus een van de twee publieke sleutels door, afhankelijk van de bit in je data. Daarna vraag je beide sleutels bij Apple op. De sleutel die je terugkrijgt, bepaalt of de verzonden bit 0 of 1 is.

Uiteraard ben je niet zeker of er een Apple-apparaat in de buurt je pakketten ontvangt en of ze wel in de juiste volgorde aankomen. Daarom wordt in de publieke sleutel een index gecodeerd (voor het eerste, tweede, derde bit enzovoort), een message-ID (zodat je meerdere boodschappen na elkaar kunt sturen) en een modem-ID (zodat meerdere apparaten hetzelfde systeem kunnen gebruiken). Helemaal achteraan in de sleutel komt dan de bitwaarde. Wil je een boodschap sturen, zend dan voor elk bit een voor een de bijbehorende publieke sleutel uit.

08 Zelf een soort modem maken

Positive Security heeft firmware voor de ESP32 ontwikkeld waarmee het bordje een modem wordt voor het Zoek mijn-netwerk. Via een seriële verbinding vanaf je computer naar de ESP32 typ je boodschappen in en de ESP32 codeert die in de vorm van publieke sleutels die het via bluetooth verzendt. Daarna kun je in de bijbehorende DataFetcher-applicatie op je Mac de gedecodeerde boodschappen inlezen.

Download het bestand Source code (zip) van de laatste release via www.bit.ly/firmsource. Pas in de code in Firmware/ESP32/main/openhaystack_main.c de variabele modem_id aan: vul hier een willekeurig getal van vier bytes in hexadecimale cijfers in, iets als 0x6ecc7c95.

Open daarna een terminalvenster, ga met deze opdrachten naar de map met de firmware en bouw hem met ESP-IDF:

cd Firmware/ESP32

idf.py build

Sluit daarna je ESP32-bordje aan via usb en flash de firmware:

./flash_esp32.sh -p /dev/tty.usbserial-210

Bekijk net zoals in paragraaf 5 eerst welk apparaatbestand je nodig hebt.

Verander de modem-ID naar een willekeurig 32bit-getal.

© PXimport

09 Typ je data in

Als je nu je ESP32 reset (usb-kabel eruit trekken en er weer in steken), begint deze de standaardboodschap TEST MESSAGE rond te sturen via bluetooth low-energy. Je kunt nu via een seriële verbinding via usb vanaf je computer met de ESP32 verbinden. Dat kan bijvoorbeeld in Arduino IDE in het menu Hulpmiddelen / Seriële monitor. Door in het tekstveld bovenaan een nieuwe boodschap te typen en op Verzenden te klikken, wordt deze boodschap verzonden.

Op je Mac heb je ook een applicatie nodig: DataFetcher OFFetchReport. Download het bestand DataFetcher.zip van de nieuwste release op de GitHub-pagina bereikbaar via www.bit.ly/firmsource. Dit programma vereist de plug-in van OpenHaystack voor Apple Mail. Als je het programma start, vul je de acht hexadecimale cijfers van de modem-ID van je ESP32 in, iets als 6ecc7c95. Klik dan op Download data. De boodschap met message-ID 0 wordt dan geladen en je kunt de andere boodschappen ook inladen. Zie je <None> of vraagtekens, dan zijn nog niet alle bits van je boodschap aangekomen. Als er Apple-apparaten in de buurt zijn, duurt het doorgaans een minuut tot een half uur voordat je ze in DataFetcher ziet.

Met de DataFetcher-applicatie krijg je de boodschappen te zien die de ESP32 rondstuurt.

© PXimport

10 Een sensor op het Zoek mijn-netwerk

Het blogartikel van Positive Security waarin ze hun hack aankondigen, spreekt al over het gebruik van de techniek door kleine sensoren. Die kunnen dan in een omgeving zonder toegang tot mobiel internet toch hun sensordata uitsturen, zolang er maar Apple-apparaten in de buurt zijn. Op die manier kun je goedkope sensoren maken die lang op één batterij meegaan.

Maar de code van Positive Security was voor een ESP32, die nog altijd vrij veel energie verbruikt en niet zo compact is. Daarom hebben we de techniek voor andere hardware geprogrammeerd, namelijk de RuuviTag. Dit is een klein sensorbordje met sensoren voor de temperatuur, luchtvochtigheid, luchtdruk en beweging dat de sensordata via bluetooth verstuurt. Met de standaard firmware gaat het apparaatje meerdere jaren mee op een CR2477-batterij. Ons idee was om zelf firmware te programmeren en in ieder geval de temperatuur van de RuuviTag via het Zoek mijn-netwerk rond te sturen met de techniek van Positive Security.

De RuuviTag is een interessant sensorbordje, dat volledig programmeerbaar is.

© PXimport

11 Zephyr

De firmware hebben we geschreven in C en gebaseerd op het besturingssysteem Zephyr, dat ideaal is voor dit soort door batterij gevoede toepassingen. Volg de instructies om een Zephyr-ontwikkelomgeving te installeren. Dat kan op Windows, macOS en Linux.

We hebben onze code getest op de RuuviTag, maar je hebt ook een RuuviTag Development Kit nodig. Daarom hebben we ook een goedkopere oplossing getest, die er wel minder dan een afgewerkt product uitziet: een nRF52840-dongel van Nordic Semiconductor, waarop je een break-outbordje met BME280-sensor aansluit. Je kunt headers op de pingaten van de nRF52840-dongel solderen en dan met jumperdraden de sensor aansluiten. Of je soldeert de sensor rechtstreeks op de pingaten. SDA van de BME280 gaat naar pin 0.31 van de nRF52840-dongel, SCL naar pin 0.29, GND naar GND en VCC naar VDD.

Sluit de BME280-sensor op de pinheader van de nRF52840-dongel aan.

© PXimport

Proof-of-concept

12 OpenHaystack voor Zephyr

Installeer eerst de OpenHaystack-module voor Zephyr. Dat kan (als je de Zephyr-ontwikkelomgeving in paragraaf 11 hebt geïnstalleerd) met de volgende opdrachten in de terminal:

west init -m https://github.com/koenvervloesem/openhaystack-zephyr --mr main zephyr-workspace

cd zephyr-workspace

west update

Als je gewoon je apparaatje wilt volgen via de OpenHaystack-applicatie, volg dan de instructies op de GitHub-pagina van openhaystack-zephyr.

13 Zend mijn sensor

Installeer nu de code voor Send My Sensor, de Zephyr-firmware die we op Send My hebben gebaseerd:

git clone https://github.com/koenvervloesem/send-my-sensor

cd send-my-sensor

Pas eerst in de code in app/src/main.c de variabele modem_id aan: vul hier een willekeurig getal van vier bytes in hexadecimale cijfers in, iets als 0x6ecc7c96.

Bouw dan de firmware voor de nRF52840-dongel met de opdracht:

west build -p auto -b nrf52840dongle_nrf52840 -s app

De firmware om je sensordata door te sturen is klaar.

© PXimport

14 Installeer de firmware

Installeer nu het pakket nrfutil met:

pip3 install nrfutil

Maak dan een installeerbaar firmwarebestand met de opdracht:

nrfutil pkg generate --hw-version 52 --sd-req=0x00 --application build/zephyr/zephyr.hex --application-version 1 send-my-sensor.zip

Steek de dongel in de usb-poort van je computer, druk op het resetknopje (let op: dat is het knopje rechts van het witte knopje zoals te zien op afbeelding 11 en je drukt het vanaf de zijkant in) en flash de firmware met de opdracht:

nrfutil dfu usb-serial -pkg send-my-sensor.zip -p /dev/tty.usbserial-210

Kijk weer zoals in paragraaf 5 welk apparaatbestand je nodig hebt. Onder Linux gebruik je deze keer /dev/ttyACM0.

Als alles goed gaat, staat de firmware nu op je apparaatje en begint het via bluetooth signalen uit te sturen. Eerst een testboodschap en daarna de temperatuur gemeten door de BME280-sensor. Open de DataFetcher-applicatie op macOS, vul de modem-ID in die je in je apparaatje hebt geflasht en dan zou je de sensorwaardes moeten zien binnenkomen.

Met deze firmware stuurt de nRF52840-dongel nu continu sensordata uit naar het Zoek mijn-netwerk van Apple.

© PXimport

15 En verder

In een omgeving met weinig Apple-apparaten is deze manier van data doorsturen niet betrouwbaar. Pas als de signalen van je sensorbordje door talloze apparaten worden opgepikt en naar Apple worden doorgestuurd, kun je de sensordata in DataFetcher lezen. En als ook maar één bit uit een byte niet ontvangen wordt, is het overeenkomende teken onleesbaar en toont DataFetcher het als een vraagteken.

Afbeelding 14 was het resultaat van een test met de RuuviTag in onze broekzak terwijl we in een vol restaurant zaten. Je kunt er nog net uit afleiden dat het in mijn broekzak tussen de 29 en 31 graden was. Al met al is deze techniek dus nog een prototype, maar het toont wel aan dat je met wat creativiteit heel leuke dingen kunt doen met Apples Zoek mijn-netwerk.

Deel dit artikel
Voeg toe aan favorieten
ID.nl logo

ID.nl, onderdeel van Reshift BV, is in 2022 gestart en uitgegroeid tot de meest toonaangevende en complete consumentensite van Nederland. Het doel van ID.nl is om de consument te helpen met alle technologie die hoort bij het dagelijks leven: van smart-health-meters tot e-bikes, van warmtepompen tot zonnepanelen - en alles daar tussenin!

Duidelijk, betrouwbaar en onafhankelijk: ID.nl maakt moeilijke dingen makkelijk.

Contact

ID.nl

Nijverheidsweg 18

2031 CP Haarlem

info@id.nl

Telefoon: 023-5430000