Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Ostatnio na niebezpieczniku pojawił się [url=https://niebezpiecznik.pl/post/usbharpoon-kablom-usb-tez-nie-mozna-ufac/]artykuł na temat badUSB[/url], który przypomniał mi, że kiedyś w przeszłości miałem się zając urządzeniami podłączanymi do portu USB, a konkretnie chodziło o to by tylko określone urządzenia mogły być obsługiwane przez system, a reszta powinna być zrzucana domyślnie. Tego typu rozwiązanie po części z urządzeń USB (pendrive, karty sd, zewnętrzne dyski twarde, etc) można było ogarnąć za pomocą udisks2 i policykit. Niemniej jednak, pozostawała kwestia całej masy innych urządzeń, np. myszy, klawiatury, telefony, które po podłączeniu do kompa mogły wejść z nim w interakcję nawet bez świadomej i dobrowolnej zgody użytkownika.
Szukając jakiegoś sensownego rozwiązania tego problemu natrafiłem na coś co nazywa się [url=https://www.kernel.org/doc/Documentation/usb/authorization.txt]USB device authorization[/url]. Krótko rzecz ujmując, jest to mechanizm kernela, który umożliwia autoryzacje urządzeń USB podłączanych do kompa. xD Działa on w niższej warstwie niż udisks2 w połączeniu z polkit'em.
W systemie są dwa pliki, które sterują autoryzacją:
/sys/bus/usb/devices/usb2/authorized /sys/bus/usb/devices/usb2/authorized_default
Ten usb2 w ścieżce to może być również usb1, usb3, itd. [url=https://morfikov.github.io/post/struktura-plikow-urzadzen-usb-w-katalogu-sys/]Każde urządzenie USB ma swoją osobną ścieżkę[/url], więc można także skorzystać z indywidualnego pliku zamiast bawić się wszystkimi urządzeniami USB. W tym jednak przypadku, ja chciałem sobie zablokować dostęp domyślnie dla wszystkich nowo podłączanych urządzeń do systemu. I do tego celu właśnie jest potrzebny wyżej widoczny plik authorized_default, Można go zapisać standardowo:
# echo 0 > /sys/bus/usb/devices/usb2/authorized_default
Po wydaniu tego polecenia, wszystkie urządzenia usb2, które są podłączone do kompa, będą działać jak przedtem ale wszystkie nowe sprzęty (czy nawet replug tych już podłączonych) już z systemem nie będą mieć możliwości komunikacji. Poniżej jest log z podłączenia pendrive:
kernel: usb 2-1.3: new high-speed USB device number 47 using ehci-pci
kernel: usb 2-1.3: New USB device found, idVendor=0951, idProduct=1666, bcdDevice= 1.00
kernel: usb 2-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
kernel: usb 2-1.3: [b]Product: DataTraveler 3.0[/b]
kernel: usb 2-1.3: Manufacturer: Kingston
kernel: usb 2-1.3: SerialNumber: 0019E06B9C8ABE41C7A2C3EC
kernel: usb 2-1.3: [b]Device is not authorized for usage[/b]
mtp-probe[35953]: checking bus 2, device 47: "/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3"
mtp-probe[35953]: bus: 2, device: 47 was not an MTP device[/quote]
Widać wyżej, że do kompa został podłączony pendrive, oraz, że urządzenie nie ma autoryzacji. Nie pojawił się też żaden nowy nośnik w systemie (np. /dev/sdc1) i nie można z nim wejść w żaden sposób w interakcję.
Tak samo jest w przypadku smartfona:kernel: usb 2-1.3: new high-speed USB device number 48 using ehci-pci
kernel: usb 2-1.3: New USB device found, idVendor=2357, idProduct=0365, bcdDevice=ff.ff
kernel: usb 2-1.3: New USB device strings: Mfr=3, Product=4, SerialNumber=5
kernel: usb 2-1.3: [b]Product: Neffos X1 Max[/b]
kernel: usb 2-1.3: Manufacturer: MediaTek
kernel: usb 2-1.3: SerialNumber: OFHENBYTVGOJ4STS
kernel: usb 2-1.3: [b]Device is not authorized for usage[/b]
mtp-probe[37552]: checking bus 2, device 48: "/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3"
mtp-probe[37552]: bus: 2, device: 48 was not an MTP device[/quote]
Nawet nie da rady się połączyć ze smartfonem via ADB. xD
Ważne, że logi z podłączania urządzeń są zapisywane, więc jakby ktoś coś chciał podłączyć bez naszej wiedzy, to będzie to widoczne.
I to w zasadzie działa całkiem nieźle, choć przydałaby się jeszcze biała lista urządzeń, które mogłyby być podłączane do kompa, by tego typu autoryzacje można było założyć jak najwcześniej przy starcie systemu i tylko zezwolić na dostęp urządzeniom o określonych numerach seryjnych. Póki co nie wiem jak to zrobić. xD
No i też jeśli ktoś wie czym się różni interface_authorized_default od authorized_default to też byłbym wdzięczny za wyjaśnienie. xDOffline
Czyli jakby lapek szedł w uśpienie czy blokadę ekranu w hotelu, to przy wejściu w [b]pm_suspend[/b] albo blokadę ekranu można wyłączyć dostęp nowych urządzeń USB?
Żeby nie dalo się obejść logowania przez podłaczenie pendraka, ktorego Nautilus albo Dolphin automatycznie zamontuje włączajac przy tym aktywną sesję?
Dosyć dawno powstał DENY_NEW_USB w Grsecurity, był właśnie w tym celu zrobione, zarządzalny przez interfejs sysctl grseca.
W Andku do połączenia USB ADB też musisz autoryzować urządzenie na cegłofonie.
Tylko tam zapamiętuje jakiś klucz kryptograficzny urządzenia.
Ostatnio edytowany przez Jacekalex (2018-08-21 15:09:16)
Offline
[quote=Jacekalex]Czyli jakby lapek szedł w uśpienie czy blokadę ekranu w hotelu, to przy wejściu w [b]pm_suspend[/b] albo blokadę ekranu można wyłączyć dostęp nowych urządzeń USB?[/quote]
Napisz to tak bym zrozumiał. xD
[quote=Jacekalex]Żeby nie dalo się obejść logowania przez podłaczenie pendraka, ktorego Nautilus albo Dolphin automatycznie zamontuje włączajac przy tym aktywną sesję?[/quote]
Jeszcze uśpienia i hibernacji nie sprawdzałem, będę wieczorem patrzył to zobaczę jak to działa ale raczej powinno zablokować. Chyba, że te wartości się zresetują po odhibernowaniu/wybudzeniu, wtedy pewnie trzeba by je tuż po tej akcji wpisać na nowo, tak jak to miało/ma miejsce z wartościami w sysctl.
[quote=Jacekalex]W Andku do połączenia USB ADB też musisz autoryzować urządzenie na cegłofonie.
Tylko tam zapamiętuje jakiś klucz kryptograficzny urządzenia.[/quote]
Tak wiem, tylko nawet przy zezwoleniu system odmawia. :]
Ostatnio edytowany przez morfik (2018-08-21 15:29:14)
Offline
Fajnie by bylo wykombinowac, tak zeby jakis demon systemowy sprawdzal czy jest wlaczona blokada i kiedy zostanie podpiete nowe urzadzenie na usb to zeby wysylal monit w postaci powiadomienia: "hej masz wlaczona blokade usb a zostalo podpiete nowe urzadzenie, czy deaktywowac blokade na czas jego podpiecia? Tak/Nie?" Po odmontowaniu urzadzenia blokada samoczynnie powinna byc wlaczana.
Offline
Jak w Debianie mając kontrole nad klawiaturą można w sposób niewidoczny wywołać polecenie z uprawnieniami użytkownika ?
Offline
Kilka linków, które póki co znalazłem i zawierają ciekawe info.
Prezentacja na temat USB i ataku BadUSB:
https://www.youtube-nocookie.com/embed/JLhcE0O4bt0?rel=0&wmode=transparent
Kawałek appki, która ma za zadanie whitelistować urządzenia:
https://github.com/USBGuard/usbguard
I jeszcze dwa artykuły:
https://codedump.net/blog/using-the-linux-kernels-usb-authorization-support-to-lockdown-usb
https://www.beyondlogic.org/usbnutshell/usb5.shtml#DeviceDescriptors
To tak by mi nigdzie nie zginęło to. xD
Jeszcze jedno zagadnienie, które się wiąże pośrednio z urządzeniami podłączanymi do kompa, to ograniczenie ilości urządzeń typu INPUT (klawiatura, mysza) bezpośrednio w ustawieniach Xserver'a. Póki co, to ten temat mi lekko obił się o oczy i nic jeszcze nie szukałem ale na pewno coś znajdę. xD
Offline
Z tego co widzę [url=https://www.kernel.org/doc/Documentation/usb/authorization.txt]tutaj[/url], to można na bazie regułek UDEVA naskrobać coś na kształt FW dla USB, do filtrowania urządzeń.
echo 0 > autorized_default i UDEV wpuszcza na podstawie cech urządzenia.
Ostatnio edytowany przez Jacekalex (2018-08-21 20:22:33)
Offline
Nie trzeba się bawić udev'em. Ten usbguard jest całkiem zajebistą zabawką (jest w repo). To co on potrafi, to jest w zasadzie to czego ja oczekiwałem od tego mechanizmu. W zasadzie to jest to zwykły demon, który patrzy na urządzenia podłączane do portów USB. I po ich wykryciu (wszystko jedno czy dopiero podłączone czy już obecne) uzupełnia odpowiednio pliki od autoryzacji. Ten demon ma konfigurację w postaci tego typu reguł:
allow id 046d:c30f serial "" name "Logitech USB Keyboard" hash "AeboMPFm0qeQNL+6ww7irtu8VKDsn9h09OoUYahjoR8=" parent-hash "xe96rjr8V53Jw+g7q/yi0C1czVxatehiq7r4gn2dH6s=" with-interface { 03:01:01 03:00:00 }
Można dopasowywać w zasadzie po wszystkim co się chce (komunikaty są w logach systemowych, więc można wyciągnąć).
Do tego, ten usbguard ma graficzną appkę usbguard-applet-qt (też w repo). W ustawieniach demona, można określić użytkowników który mogą się za pomocą tej appki łączyć z usbguard, i w ten sposób zarządzać polityką urządzeń, co wygląda mniej więcej tak:
[img]https://i.imgur.com/Lyndvok.png[/img]
I tutaj już można sobie wyklikać co ma być blokowane i zezwolone, a jeśli się zaznaczy permanent, to reguła powędruje do konfiguracji i w zasadzie plik z regułami się może w ten sposób automatycznie uzupełnić. Można pododawać określone urządzenia i odebrać możliwość połączenia appce z demonem albo ją wywalić zupełnie. Trzeba też pamiętać, że przy bardziej restrykcyjnych regułach ma znaczenie nawet do którego portu się wepnie myszę czy klawiaturę i jak się wepnie ją do innego, to nie będzie ona działać i trzeba będzie się przepiąć. Także można sobie poczarować jeśli się ma sporo portów USB. xD
No i oczywiście politykę domyślną demona można też ustawić w jego pliku konfiguracyjnym, by domyślnie blokował wszelkie urządzenia nowe. Są także notyfikacje powiadamiające usera o tym, że nowe urządzenie zostało wykryte i jaką akcję podjąć.
Tak, ten mechanizm jest iście zacny i "approved by morfik". xD
-----
A i jeszcze jak coś jest:
# usbguard generate-policy > rules.conf
Co generuje reguły zezwalające na dostęp wszystkim aktualnie podłączonym do portów USB urządzeniom. To tak by szybciej sobie reguły napisać. xD
Ostatnio edytowany przez morfik (2018-08-21 22:54:39)
Offline
Sprawdziłem też hibernację i uśpienie maszyny i wygląda, że działa bez zarzutu i nic nie trzeba się dodatkowo bawić.
Ja tylko sobie jeszcze dodałem ekstra blokadę wszystkich urządzeń USB domyślnie podczas pracy systemu za pomocą takiej usługi:
[Unit] Description=Block USB devices by default after repluging them Requires=usbguard.service After=usbguard.service Documentation=man:usbguard(8) [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/bin/usbguard set-parameter InsertedDevicePolicy block ExecStop=/usr/bin/usbguard set-parameter InsertedDevicePolicy apply-policy [Install] WantedBy=basic.target
W takim przypadku, po starcie systemu wszystkie urządzenia, które są podpięte do kompa przechodzą weryfikację w oparciu o reguły i te, które nie są dodane, to będą blokowane, no i dodatkowo każdy replug któregoś z działających urządzeń będzie powodował, że już drugi raz w systemie się ono nie pojawi. xD To taki miły mechanizm, który ma na celu dbanie o to by nikt czasem czegoś nie podłączył między wtykę USB (np. klawiatury) a port USB (np. gdy ekran kompa jest zablokowany, a my poszliśmy se do kibla na 30s), bo wtedy klawiatura wysiądzie i będzie można mieć uzasadnione podejrzenia popełnienia czynu nieskazanego i moralnie nieakceptowalnego, przynajmniej z punktu widzenia administratora systemu. xD
No a by urządzenia móc podpiąć pod kompa, to trzeba pierw te usługę dezaktywować ale to nie powinno być problemem. xD
Ostatnio edytowany przez morfik (2018-08-22 00:18:20)
Offline
Usbguard jest dobry tak dlugo, jak długo się nie popsuje np z powodu aktualizacji jakieś biblioteki, od której zależy.
Jeżeli da się to zmontować w Udevie, to wolę porzeźbić w Udevie, troszkę pewniejsza opcja, bo Eudev sam z siebie jest bardziej powszechnie używany i bardziej niezawodny.
W przypadku awarii UDeva aktualizacja z poprawką to kwestia niemal minut.
Chociaż widzę, że Usbguard w Debianie już jest w repo, w Gentoo na razie tylko w overlayu Pentoo.
Offline
Nie wiem czy się da w udev, na pewno można przepisać sobie autoryzacje w oparciu o subsystem usb ale raczej ciężko by było osiągnąć samym udev'em taką konfigurację jaką ja u siebie machnąłem. Pamiętaj też, że usbguard to w zasadzie tylko kawałek demona, a ta graficzna nakładka jest w pełni opcjonalna, także zależności to tu nie ma za wiele znowu.
Offline
Jak tak dalej pójdzie to ten usbguard wyleci z debiana:
https://tracker.debian.org/pkg/usbguard
Bo ten mój zgłoszony bug https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=908037 dostał parę dni temu status grave. xD
Offline
Udeva do autoakceptacji myszki i klawiatury próbowałeś zatrudnić?
Czy w udevie są takie same problemy, jak z usbguardem?
Ostatnio edytowany przez Jacekalex (2018-09-19 14:14:53)
Offline
No sam udev nie zrobi takiej konfiguracji co ja sobie zrobiłem na pstryk przy pomocy usbguard. :] Mógłbyś sprawdzić to rozwiązanie z udev, i zobaczyć jako ono jest użyteczne dla przeciętnego kowalskiego. Bo usbguard jest dość miły dla usera, udev nie jest. xD
Offline
[quote=morfik]No sam udev nie zrobi takiej konfiguracji co ja sobie zrobiłem na pstryk przy pomocy usbguard. :] Mógłbyś sprawdzić to rozwiązanie z udev, i zobaczyć jako ono jest użyteczne dla przeciętnego kowalskiego. Bo usbguard jest dość miły dla usera, udev nie jest. xD[/quote]
Nie za bardzo mi się chce, zwłaszcza, ze Morfik ma owsiki w d..., także w ciągu tygodnia porobi regułki dla wszystkich urządzeń USB i jeszcze pewnie zgłosi przy okazji ze dwa bugi w systemd-udev. xD
Offline
Time (s) | Query |
---|---|
0.00011 | SET CHARSET latin2 |
0.00004 | SET NAMES latin2 |
0.00098 | SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='3.146.152.119' WHERE u.id=1 |
0.00072 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '3.146.152.119', 1732188796) |
0.00048 | SELECT * FROM punbb_online WHERE logged<1732188496 |
0.00045 | SELECT topic_id FROM punbb_posts WHERE id=320743 |
0.00021 | SELECT id FROM punbb_posts WHERE topic_id=30594 ORDER BY posted |
0.00058 | SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=30594 AND t.moved_to IS NULL |
0.00005 | SELECT search_for, replace_with FROM punbb_censoring |
0.00259 | SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=30594 ORDER BY p.id LIMIT 0,25 |
0.00143 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=30594 |
Total query time: 0.00764 s |