V preteklem nadaljevanju smo najprej analizirali grafične vmesnike, s katerimi upravljamo IoT naprave na daljavo. Zanimalo nas je, ali lahko pri upravljanju zagotavljamo zadostno stopnjo varnosti in kdaj moramo v napravo nujno vgraditi lastni prikazovalnik z grafičnim uporabniškim vmesnikom. Nato smo nadaljevali s primeri v razvojnem okolju Arduino chipKIT in povedali, kako Arduino projekte prenesemo v MPLAB X razvojno okolje, kjer jih lažje razhroščujemo.
Tokrat najprej še o nameščanju vtičnikov za uvoz Arduino aplikacij v MPLAB X razvojno okolje, nato se lotimo prebojnega testiranja Arduino IoT aplikacij, ki uporabljajo Wi-Fi komunikacije. Na koncu bomo izdelali še ojačevalnik Wi-Fi signala, ki pride prav predvsem v strnjenih naseljih, v katerih je si dostopne točke pogosto konkurirajo.
Ta vsebina je samo za naročnike
Uvoz Arduino aplikacij v MPLAB- X
Za razhroščevanje Arduino aplikacij v Arduino razvojnem okolju nimamo dobrih orodij, zato je MPLAB X razvojno okolje skoraj edina možnost, a vanj moramo prej namestiti vtičnik Arduino chipKIT Importer. Na chipKITovi strani na GitHubu najdemo dve različici tega orodja. Prva omogoča le uvoz Arduino chipKIT projektov, druga (imenovana tudi Import Arduino Projects) pa tudi AVR, ESP8266 in ESP32 projektov.
Po namestitvi chipKIT Impoter oziroma Arduino Import Plugin vtičnik vidimo kot postavko v meniju: File->Import->Import chipKIT Project, oziroma File->Import->Import Arduino Project. Po kliku nanj in nekoliko daljšem čakanju se odpre okno za uvoz *.ino projekta. Pomembno je, da pred začetkom pretvorbe pravilno izberemo poti in ostale nastavitve: pot do *.ino datoteke, pot mape za nov MPLAB X projekt, tipa razvojne platforme, tip Arduino platforme itn. Naslednji korak je izbira programatorja v MPLAB X razvojem okolju, denimo PICkit 3. Po pretvorbi Arduino kode v MPLAB X projekt, se razhroščevanja lotimo enako, kot bi se ga pri kateremkoli drugem MPLAB X projektu.
Kaj če ne deluje?
Pretvorba v MPLAB X projekt včasih ne deluje. Najprej se splača preveriti, ali lahko projekt prevedemo v izbranem Arduino IDE okolju. Pogosto so težave tudi zaradi nameščenih starejših različic verig orodij za prevajanje v strojno kodo, denimo XC1.xx prevajalniki. chipKIT importer in Importa Arduino Project (chipKIT Importer 2.0) vtičnika pri prevajanju vselej izbereta prvo najdemo različico XC32 prevajalnika in obenem ne preverjata pogoja, ali je ta višja od 2.1, zaradi česar lahko zaideta v težave pri iskanju potrebnih Arduino programskih knjižnic.
Tovrstnih in podobnih težav se lahko rešimo tako, na primer na virtualnem PCju vzpostavimo novo MPLAB X razvojno okolje, v katerem je samo ena veriga XC32 prevajalskih orodij verzije 2.1 ali višje, samo en MPLAB X v5.1 ali več in samo en Arduino IDE 1.8.x, kjer je x večji od 4 manjši 10. Če pa namestimo NetBeans in novejši Arduino pa moramo v izvorni kodi, izključiti preverjanje verzije Arduino IDE, kot bomo videli v nadaljevanju.
Za prevajanje izvorne kode Arduino chipKIT Importer projekta iz GitHuba moramo imeti nameščeno platformo Apache NetBeans IDE, katere zadnjo različico lahko potegnemo s spletne strani apache.org. A ker je ta v zadnjih letih doživela nekaj sprememb uporabniškega vmesnika, navodila za pripravo NetBeans IDE ter nameščanje in prevajanje Arduino chipKIT Importer projekta, ki jih najdemo v priloženi dokumentaciji, niso več povsem ustrezna. Denimo, v NetBeans IDE v meniju Tools tako ne najdemo možnosti za dodajanje platform, dokler ne namestimo potrebne komponente, ki pa jih sreči ni potrebno posebej prenašati iz interneta.
Odprava težav z verzijami
Snovalci chipKIT importerja očitno niso predvideli, da bo danes verzija Arduino IDE 1.8.19, kar je seveda več kot zahtevana verzija 1.8.5, a kaj ko programska koda chipKIT importerja preverja le prvih pet znakov. Potem je 1.8.1 (brez »9«) seveda premalo. Pomagamo si lahko tako, da spremenimo funkcijo isArduinoVersionValid v izvorni kodi chipKIT importerja tako, da vedno vrača vrednost true. Ker zadnja različica orodja 1.2.4 sega v leto 2019, preveč novih različic Arduino IDE, kakor tudi MPLAB X IDE tudi morda vseeno ni dobro uporabljati.
Okoli leta 2020 je nastal Arduino chipKIT Importer 2.0, ki vztrajno trdi, da mora biti različica večja od 1.8.0, čeprav je bila zadnja v času nastajanja članka 1.8.19. Zato se moramo spet zateči k izvorni kodi v NetBeans IDE. Še vedno zasledimo minimalno različico 1.8.5, zato moramo tu spremeniti funkcijo isArduinoVersionValid tako, da vedno vrača vrednost true:
- private boolean isArduinoVersionValid() {return true;}
- Prebojni test lastnega Wi-Fi omrežja
Med poletnimi počitnicami si navdušeni računalničarji in elektrotehniki lažje vzamemo čas za izboljšave Arduino projektov, ki smo se jih lotili med letom. Se vam Wi-Fi povezava med Arduino IoT moduli večkrat dnevno prekinja? Si želite izboljšati vgrajeno programsko kodo?
Starejši Wi-Fi protokoli, kot sta WPA in WPA2, še zdaleč niso dobro zaščiteni, a jih kljub temu še uporabljamo. Med njimi so tudi številne ESP32 Arduino aplikacije, katerih varno delovanje lahko preverimo s taistimi ESP32 moduli, če iz GitHuba potegnemo programsko orodje ESP32 Wi-Fi Penetration Tool. Zip datoteko moramo najprej razpakirati v IDF razvojno okolje, vendar moramo pri tem paziti, da pot ni predolga, saj bomo lahko imeli v nasprotnem težave pri prevajanju programske kode. Za preverjanje varnostni lastnega Wi-Fi omrežja potrebujemo le še en ESP32 modul, v katerega prenesemo programsko opremo za penetracijski test.
ESP32 modul za prebojno testiranje deluje kot Wi-Fi dostopna točka in ga zato upravljamo prek njegove spletne strani iz računalnika ali pametnega telefona prek Wi-Fi povezave. Resnici na ljubo to ni najboljše, saj nas potem lahko kak sosed spremlja, ko izvajamo nastavitve. Druga možnost je, da uporabimo ESP32 razvojno ploščo z vgrajenim Ethernet vmesnikom in nekoliko popravimo izvorno kodo programske opreme za izvajanje prebojnega testa, tako da je kontrolni vmesnik dostopen samo prek Ethernet povezave. Mogoča je tudi predelava orodja, tako da ga upravljamo prek standardnega RS232 vmesnika, prek katerega razvojno ploščo tudi programiramo.
Nameščanje programske opreme za prebojni test
Izvorno kodo programskega orodja ESP32 Wi-Fi Penetration Tool lahko prevedemo le v razvojnem okolju Espressif Systems IDF. Lahko pa orodje namesto tega zgolj namestimo iz priloženih binarnih datotek, ki jih najdemo v GitHub projektu v mapi build. Za slednje potrebujemo zgolj računalnik z nameščenim Espressif Systems Flash Download Tool.
Prevajanje izvorne kode je vseeno veliko boljša možnost, saj med drugim omogoča nastavitev SSID in pristopno gesla Wi-Fi dostopne točke z upravljavsko spletno stranjo. Opozorimo, da mora biti geslo dolgo vsaj 8 znakov. Če izberemo krajšega, dostopne točke ne bo mogoče vzpostaviti, čemur bodo sledili neprestani ponovni zagoni ESP32. Nastaviti moramo tudi shrambo za dolga imena datotek (sam sem izbral stack), saj jih sicer ne moremo uporabljati, programsko orodje pa jih potrebuje za svoje delovanje.
Skratka, po dolgem prevajanju programske kode in njenem nameščanju v ESP32 modul z ukazom: idf all –p COM3 flash, lahko končno zaženemo modul in začnemo preizkušati varnost svojega Wi-Fi omrežja z različnimi tip napadov.
Etično hekanje
Prebojno testiranje smemo izvajati le na svojih dostopnih točkah, zato moramo dobro poznati njihova imena. Ko nam spletna aplikacija v ESP32 prikaže seznam vseh dostopnih točk, moramo zagotovo izbrati pravo, preden nadaljujemo na spodnji meni, v katerem izberemo tip napada in ga izvedemo.
Zaradi varnosti je prebojno testiranje boljše upravljati prek ožičene Ethernet povezave. Me pa vseeno zabava zamisel avtorja ESP32 Wi-Fi Penetration Toola, ki je predlagal, da ESP32 modul napajamo iz majhne litijeve baterije z 200 mAh, ki je sicer namenjena pogonu manjših dronov, saj tako hekanje tako ne more trajati več kot kako uro, prej manj.
Kakorkoli, namen prebojnega testiranja ni toliko v tem, da odkrijemo, kdo blokira naše IoT naprave, ampak predvsem v tem, da izboljšamo njihovo programsko opremo in to preprečimo. Vsekakor je tu na mestu tudi uporabo komunikacijskih protokolov z višjo stopnjo zaščite podatkov tudi na drugem nivoju komunikacij, na primer HTTPS s TLS namesto HTTP.
Potek prebojnega testa
Ker me je na moč zanimalo, ali lahko moji vrli sosedje v bloku vsaj teoretično sesujejo moj krmilnik, sem zagnal ESP32 modul, ki je vzpostavil dostopno točko za prebojno testiranje DA, s katero sem se povezal iz pametnega telefona in začel prebojno testiranje na svoji dostopni točki AP, ki deluje na ESP8266 modulu, z napadom preprečevanja delovanje storitve (DOS, angl. denial of services). Najprej sem povezal dostopno točko AP in odjemalca CL, da sta delovala kot običajno, nato pa sem se s pametnim telefonom sprožil prebojno testiranje iz ESP32.
A zdelo se je kot, da bi me med delom nekdo spremljal, saj sem (kot že pogosto doslej) s pametnim telefonom kar hitro »odletel« dol, čeprav je bil pametni telefon ves čas poleg testnega ESP32. Ali lahko torej upravičeno sklepam, da nekdo nagaja in morebiti celo spremlja moj promet po Wi-Fi? No, tega ne želim ugibati, saj tudi opis v programski kodi navaja, da se to pač lahko običajno zgodi. Enostavno sem se povezal nazaj in test izpeljal do konca, tako da 120 sekund napadal dostopno točko AP, ki se je med delovanjem večkrat sesula in ponovno zagnala. Ubogi ESP8266! Zdi se namreč, da so njegove Arduino programske knjižnice še manj zaščitene od tistih v ESP32. Več kot očitno je tudi, da moja aplikacija v ESP8266 ni najboljša, saj se, ko gre kaj narobe, preprosto ponovno zažene.
Upravljanje Wi-Fi prebojnega testa prek Etherneta
Upravljanje DA prek Ethernet povezave je varnejše in zanesljivejše. Zanj potrebujemo razvojno ploščico, ki ima poleg ESP32 modula še vmesnik za ožičeni Ethernet. V SE290 smo lahko v 9. delu serije WiFi z ESP8266 in ESP32 za domači hardware videli, kako ESP32 modulu dodamo Ethernet povezavo na osnovi LAN8720A ali LAN8740A čipa, ki ga upravlja vgrajeni krmilnik v ESP32 modulu. Namesto tega si lahko omislite tudi kako do številnih že izdelanih razvojnih plošč, na primer kompaktni ESP32-LilyGO modul.
Za dostop do upravljavske spletne strani DA prek Etherneta moramo dopolniti programsko kodo, kakor tudi dopolniti in spremeniti nastavitve aplikacije za izvajanje prebojnega testa. Vzorčno kodo za vzpostavitev povezave prek Ethernet vmesnika najdemo v datotečni mapi examples/ethernet/basic/main v datoteki ethernet_example_main.c. Poleg te potrebujemo še specifikacijo za dopolnitev IDF nastavitev, ki jo najdemo v datoteki Kconfig.projbuild.
Zdaj se lahko lotimo dopolnitev aplikacije ESP32 Wi-Fi Penetration Tool, ki smo jo poprej iz ZIP datoteke razpakirali v poljubno datotečno mapo (sam sem izbral kar ime penetration-tool) v IDF razvojnem okolju. Najprej datoteko Kconfig.projbuild skopiramo v mapo examples/ethernet/penetration-tool/main, s čemer dodamo nov konfiguracijski meni example configuration, v katerem nastavimo še nekatere dodatne parametre za delovanje LAN8720A vmesnika. Nato odpremo konzolo IDF razvojnega okolja, gremo v datotečno mapo penetration-tool in zaženemo ukaz idf fullclean, s katerim izbrišemo vse že ustvarjene binarne datoteke, kar je nujno, saj smo izvorno kodo prenesli v drugo datotečno mapo.
V naslednjem koraku moramo popraviti spletno stran DA, ki v katero je fiksno vgrajen IP naslov 192.168.4.1, ki navadno pripada Wi-Fi vmesniku. Naslov moramo zamenjati s tistim, ki ga bo uporabljal Ethernet vmesnik. Namesto tega, lahko vgradimo dinamično vstavljanje pravega IP naslova s pomočjo funkcije httpd_resp_send_chunk spletnega strežnika, s katero prenašamo podatke v spletno stran DA na spletnem brskalniku. No, avtor programskega orodja se je namesto tega raje odločil za poenostavitev. Tretja možnost je, da ob inicializaciji Ethernet vmesnika le temu vnaprej določimo IP naslov in ne uporabimo DHCP storitve, kot je to v originalnem primeru. Povejmo še, da izvorno kdo spletne strani najdemo v imeniku penetration-toolcomponentswebserverutils v datoteki index.html. Ko jo popravimo, moramo iz ukazne vrstice operacijskega sistema zagnati skripto convert_html_to_header_file.sh, ki ustvari novo datoteko page_index.h v imeniku penetration-toolcomponentswebserverpages.
Nato zaženemo idf menuconfig in začnemo nastavljati opcije. V podrobnosti se ne bomo spuščali, saj so odvisne od uporabljene razvojne plošče, povejmo pa, da moramo nastaviti več skupin parametrov. V Example configuration meniju nastavimo tip Ethernet vmesnika in način njegovega povezovanja z ESP32. V Component config meniju nastavimo opcije v podmeniju Ethernet. Sam sem izbral le Support ESP32 internal EMAC controller in v podmeniju, ki se odpre, zanj izvedel ustrezne nastavitve. Nato v meniju FAT Filesystem support dovolimo dolga imena datotek, ki jih lahko shranjujemo na sistemski sklad (stack) ali na kopico (heap). Sam sem izbral prvo možnost, pri čemer nisem spremenil največje dolžine imen (255 znakov). Zadnji meni, v katerem moramo spremeniti nastavitve, je Wi-Fi controller, v katerem nastavimo možnosti v podmeniju Management AP. Omenili smo že, da je pomembno, da nastavimo SSID (npr. DA) in pristopno geslo.
Zdaj se moramo lotiti še popravkov programske kode za upravljanje Ethernet in Wi-Fi povezave, ki jo najdemo v mapi penetration-toolcomponentswifi_controller v datoteki wifi_controller.c. Iz prej omenjenega primera basic moramo prenesti in vključiti kodo za vzpostavitev delovanja Ethernet krmilnika.
Najprej med vključitve programskih knjižnic na vrhu datoteke dodamo: #include “esp_eth.h”. Nato na konec datoteke ethernet_example_main.c iz examples/ethernet/basic/main prekopiramo še funkcije: eth_event_handler, got_ip_event_handler in app_main, ki jo preimenujemo v connect_ethernet. Zdaj nekoliko spremenim kodo connect_ethernet fukcije tako, da vključimo še inicializacijo Wi-Fija. Poglejmo izsek spremenjene programske kode funkcije connect_ethernet , glej program 1.
program 1
…
ESP_ERROR_CHECK(esp_event_handler_register(ETH_EVENT, ESP_EVENT_ANY_ID, ð_event_handler, NULL));
ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_ETH_GOT_IP, &got_ip_event_handler, NULL));
// Initialize Wi-Fi
wifi_config_t mgmt_wifi_config = {
.ap = {
.ssid = CONFIG_MGMT_AP_SSID,
.ssid_len = strlen(CONFIG_MGMT_AP_SSID),
.password = CONFIG_MGMT_AP_PASSWORD,
.max_connection = CONFIG_MGMT_AP_MAX_CONNECTIONS,
.authmode = WIFI_AUTH_WPA2_PSK
},
};
wifictl_ap_start(&mgmt_wifi_config);
eth_mac_config_t mac_config = ETH_MAC_DEFAULT_CONFIG();
eth_phy_config_t phy_config = ETH_PHY_DEFAULT_CONFIG();
…
Vstavljeni del programske kode je izpisan kurzivno. Zdaj moramo spremeniti še datoteko glave wifi_controller.h, ki jo najdemo v mapi penetration-toolcomponentswifi_controllerinterface. Vanjo preprosto dodamo vse definicije prej omenjenih funkcij, ki smo jih skopirali iz primera basic.
Zdaj lahko v IDF razvojnem okolji programsko kodo v mapi penetration-tool ponovno prevedemo z ukazom idf all, nato pa prenesemo v ESP32 modul z ukazom idf –p COM3 flash. Namesto COM3 vstavite dejansko oznako porta (razen če uporabljate COM3), prek katerega je povezan RS-232 most za programiranje ESP32 modula.
Ojačajmo Wi-Fi signal Arduino vezij!
V strnjenih blokovskih naseljiv ne manjka betonskih preprek, ki ovirajo širjenje Wi-Fi signala, hkrati pa si nepregledna množica Wi-Fi dostopnih točk tudi medsebojno konkurira. Nekateri pametni telefoni, so programirani tako, da v primeru zrušitve povezave s trenutno dostopno točko, poskušajo vzpostaviti novo povezavo s katerokoli druga s seznama shranjenih dostopnih točk, kar pa je smiselno le, če vse dostopne točke omogočajo dostop do interneta, oziroma nudijo enako funkcionalnost, kar pa krmilniki domačih IoT naprav zagotovo ne.
Kaj storiti? Do neke mere si lahko pomagamo, če namesto PCB antene uporabimo Wi-Fi anteno, a ko tudi to ni dovolj, potrebujemo 2,4 GHz močnostni ojačevalnik. Projekt bi bil enostaven, če bi lahko enostavno dodali močnostne izhodne tranzistorje, a pri podatkovnih komunikacijah moramo zagotavljati tudi linearnost ojačenja signala. Zato morajo biti vse komponente kar se da majhne in dobro ozemljene. Skyworksov operacijski ojačevalnik SKY65162-70LF je zato kot nalašč za naš projekt. Na njegovi osnovi lahko izdelamo ojačevalnike antenskega signala med 400 MHz in 2,7 GHz. Čip ima le 3 priključke, antenski vhod, maso in antenski izhod, pri čemer ga napajamo prek izhodnega priključka.
Lotimo se dela!
Proizvajalec v specifikacijah SKY65162-70LF podaja tudi referenčno električno shemo, v kateri poleg čipa potrebujemo samo še nekaj pasivnih elementov, iz katerih izdelamo vhodni filter in izhodni antenski filter. Pri tem za ojačenje v frekvenčnih območjih nad 1,96 GHz nekaterih pasivnih elementov ne potrebujemo in jih nadomestimo, bodisi s kratkostično povezavo, ali izpustimo (kratica DNI v podatkovni poli, pomeni ne nameščaj, angl. do not install). Tako dobimo poenostavljeno shemo ojačevalnika, ki sem jo izrisal za članek. Vezje napajamo z enosmerno napetostjo do največ 5,5 V, pri čemer je največja poraba toka 400 mA. Pri tem je moč oddajanja Wi-Fi okoli 2 W, kar je desetkrat več kot pri običajnih Wi-Fi napravah.
Pomembno je tudi, kako izdelamo tiskanino, pri čemer pri čemer je proizvajalec kot referenčno uporabil 4-plastno tiskanino. No, če se njene izdelave lotimo doma, se je dobro vsaj približno držati razmerij razdalj med posameznimi komponentami. Pri tem je potrebno poudariti, da morajo biti tudi kondenzatorji in tuljava čim manjši, in precej na tesno skupaj, saj bo le tako vezje dobro delovalo pri 2,4 GHz. Dobro je uporabiti vsaj dvoplastno tiskano vezje, pri čemer spodnja plast rabi za ozemljitev, kakor tudi del zgornje plasti, ki ni uporabljen za vezje. Vezje je tako z vseh strani obdano z ozemljitvenim signalom, pri čemer so povezave zgolj po sredinskih vodnikih. Namesto jedkanja lahko za izdelavo tiskanine raje uporabimo PCB rezkalnik ali alfa nožek, s kateri zgolj odrežemo odvečni baker in tako zagotovimo izdelamo povezave.
Povejmo še, da avtorji nekaterih projektov na internetu za vrednost tuljave uporabijo 7 nH. Poleg tega je za dobro delovanje in za preprečevanje motenja drugih elektronskih naprav smiselno vezje vgraditi v kovinsko ohišje, iz katerega gledajo le napajalni priključek ter BNC konektorja za vhodni signal in antenski priključek. Povejmo še to, da lahko SKY65162-70LF vezje kupite pri velikih spletnih trgovcih z elektronskimi komponentami, kot sta Mouser in Farnell.
Še ideja! Ker v Arduino projektih pogosto uporabljamo mikro SMD BNC vtičnico, kakršno najdemo tudi na ESP32 vezjih z antenskimi priključki, lahko ojačevalnik na Wi-Fi anteno priklopimo tudi tako, da antenski kabel prerežemo, pri čemer prvo polovico ene strani priklopimo na Arduino vezje, z druge pa prispajkamo na vhod ojačevalnika Wi-Fi signala, medtem ko drugo polovico kabla z antenskim konektorjem z ene strani prispajkamo na izhod ojačevalnika, z druge pa namestimo anteno.
Prihodnjič
V Arduino programih, ki uporabljajo Wi-Fi, smo odkrili šibke točke in ranljivosti, ki lahko napadalcu omogočijo dekodiranje varnostnega gesla in spremljanje vsebine paketov pa tudi onemogočanje storitev. Zanimalo nas bo, kako lahko to preprečimo, obenem pa tudi, kako zagotovimo drugi in tretji nivo zaščite podatkov. To je pomembno tudi za prihajajočo nadaljevanko o Arduino aplikacijah v oblaku.
https://sites.google.com/site/pcusbprojects
Avtor: dr. Simon Vavpotič