Ciężko sobie wyobrazić pracę przy komputerze bez myszki i klawiatury. Jeśli masz komputer stacjonarny, to prawdopodobnie podłączasz te urządzenia za pośrednictwem portu USB. Jednak urządzeń mogących współpracować z naszym komputerem jest znacznie więcej. Mogą to być zewnętrzne karty sieciowe, dyski, telefony, pendrive’y, a także płytki rozwojowe, na których mamy mikrokontrolery takie jak np. Arduino. Jak to się dzieje, że pomimo takiej różnorodności urządzeń komputer dość dobrze radzi sobie z ich obsługą? W tym artykule postaram się wyjaśnić ciąg zdarzeń zachodzących na komputerze z systemem operacyjnym Windows, prowadzący do uruchomienia i sprawnej obsługi urządzenia peryferyjnego. A przykładem będzie konwerter USB↔UART CP2102 od Silicon Labs umieszczony na płytce rozwojowej ESP32-DevKitC, której używam w projekcie stacji pogodowej.

Fizyczne wykrycie
Na początku zaczyna się od wykrycia, że w ogóle coś zostało podłączone. W porcie USB mamy linie D- oraz D+. Urządzenie podciąga jedną z nich (pull-up) do linii 3.3V po swojej stronie. Host (czyli kontroler USB) stale monitoruje napięcia na tych liniach. Gdy wykryje zmianę, resetuje podłączone urządzenie i rozpoczyna kolejny krok.
Enumeracja USB
Po fizycznym wykryciu urządzenia host wysyła do niego serię żądań kontrolnych. W odpowiedzi otrzymuje:
Device Descriptor – informacje takie jak id producenta (VENDOR_ID) i id produktu (PRODUCT_ID). VID i PID są kluczowe, ale są tu również inne informacje takie jak wersja obsługiwanego USB (np. 2.0).
Configuration Descriptor – informacja o interfejsach i endpointach urządzenia. Interfejsy często są elementami określającymi, z jakich sterowników ma korzystać urządzenie.
String Descriptor (opcjonalnie) – niektórzy producenci zaszywają w swoich produktach nazwy, które można odczytać i wyświetlić w menedżerze urządzeń, gdy nie ma jeszcze zainstalowanego sterownika.
Dopasowanie sterownika
Dzięki VID i PID otrzymanym podczas enumeracji USB można zidentyfikować urządzenie oraz zainstalować lub pobrać dla niego sterowniki. Po otrzymaniu tych identyfikatorów host buduje tzw. Hardware ID w formacie USB\VID_10C4&PID_EA60. W pierwszej kolejności system operacyjny sprawdza, czy sterownik do takiego urządzenia jest w lokalnym magazynie sterowników (C:\Windows\System32\DriverStore). Dopasowanie polega na sprawdzeniu w pliku INF, czy sterownik obsługuje urządzenie o danym Hardware ID. Jeśli nie ma takiego sterownika w Driver Store, to Windows Update może pobrać go automatycznie. Jeśli korzystanie z Windows Update nie jest możliwe, użytkownik może sam pobrać sterownik, np. ze strony producenta urządzenia lub poszukać go na https://catalog.update.microsoft.com/. Instalacja sterownika polega na skopiowaniu plików INF, SYS oraz innych plików towarzyszących sterownikowi do lokalnego Driver Store (jeśli wcześniej ich tam nie było), utworzeniu wpisu w rejestrze, który wiąże tę konkretną instancję urządzenia ze sterownikiem oraz załadowaniu do pamięci plików sterownika i uruchomieniu go. Od tej pory urządzenie staje się w pełni funkcjonalne.
Sterownik umożliwia komunikację z urządzeniem
Działający sterownik umożliwia komunikację OS (Operating System) ↔ urządzenie (w naszym przykładzie CP2102). Ponieważ CP2102 to konwerter USB↔UART, sterownik emuluje port szeregowy (w przeszłości prawdziwy port szeregowy RS-232 był fizycznie obecny w komputerze i komunikował się z UART-em). Windows otwiera wirtualny port COM (port komunikacji szeregowej), przez który będzie się komunikował z urządzeniem. W menedżerze urządzeń będzie to widoczne np. jako COM4 i będzie to unikalny identyfikator tego konkretnego urządzenia, które podpięliśmy oraz którego sterowniki zostały zainstalowane. System operacyjny nie musi znać wewnętrznej struktury działania podłączonego urządzenia. To właśnie sterownik umożliwia komunikację systemu operacyjnego z urządzeniem. Dla systemu operacyjnego sterownik wystawia standardowy interfejs, przez który OS może się komunikować z urządzeniem. Z kolei dla urządzenia sterownik tłumaczy standardowe polecenia systemu operacyjnego na język konkretnego mikrokontrolera, który przesyła i odbiera informacje.
Gdzie są słabe punkty
W powyższym ciągu zdarzeń są punkty, które mogą okazać się słabe z punktu widzenia bezpieczeństwa i o których warto pamiętać.
USB Spoofing
Na etapie enumeracji USB może dojść do tzw. USB Spoofingu, czyli podłączenia fizycznego urządzenia, które tylko udaje np. pendrive, a w rzeczywistości fałszywie przedstawia się systemowi operacyjnemu jako coś innego i może wykorzystać przydzielone przez system dostępy do wykonania podejrzanych operacji.
Złośliwe lub podatne sterowniki
Sterowniki są ładowane do pamięci jądra systemu operacyjnego i mają wysoki stopień uprzywilejowania. Gdyby ktoś dostarczył nam złośliwe sterowniki, mogłoby to prowadzić do poważnych konsekwencji dla bezpieczeństwa. Od kiedy Microsoft wymaga sterowników podpisanych cyfrowo przez producenta, zainstalowanie złośliwych sterowników jest mniej prawdopodobne. Jednak wciąż realnym tematem są sterowniki podatne – z jakąś luką, która może być wykorzystana przez atakującego. I w takim kontekście sterowniki również mogą stać się słabym punktem, jeśli chodzi o bezpieczeństwo systemu.
Port szeregowy COM
W przypadku naszego CP2102, który jest częścią większego systemu – płytki rozwojowej ESP32-DevKitC – możemy mieć do czynienia z dodatkową powierzchnią ataku. Interfejs UART z założenia ma zastosowanie diagnostyczne i jest wykorzystywany w trakcie developmentu. Jeśli nie zostanie wyłączony, może stać się narzędziem w rękach hakera, umożliwiając komunikację z urządzeniem przez wysyłanie komend (jeśli UART ma włączoną taką obsługę) lub może umożliwiać odczyt logów systemu (jeśli nie zostało to wcześniej zablokowane). Taki niezabezpieczony port może być źródłem informacji umożliwiającej znalezienie potencjalnych luk w urządzeniu.
Wszystkie powyższe elementy są dobrymi materiałami na osobne artykuły. Gdy powstaną, wrzucę do nich linki. Jeśli któryś z powyższych tematów was interesuje i chcielibyście taki artykuł szybciej, dajcie znać w komentarzach.
To tyle, jeśli chodzi o to, jak działają urządzenia peryferyjne w systemie operacyjnym Windows. Jak zapewne się domyślacie – temat został przedstawiony dość prosto, ale mam nadzieję, że teraz będzie trochę łatwiej wyobrazić sobie, dlaczego urządzenia podpięte do komputera działają. Dajcie znać w komentarzach, czy chcecie wchodzić głębiej w temat.

