Skanowanie Bluetooth LE jako root?

13

Aby wykonać skanowanie w poszukiwaniu urządzeń Bluetooth LE, hcitool najwyraźniej wymaga uprawnień roota. Dla zwykłych użytkowników dane wyjściowe są następujące:

$ hcitool lescan
Set scan parameters failed: Operation not permitted

Dlaczego hcitool potrzebuje uprawnień roota do skanowania LE?

Czy możliwe jest wykonanie skanowania LE jako użytkownika innego niż root?

kassiopeia
źródło

Odpowiedzi:

21

Stos protokołu Bluetooth dla systemu Linux sprawdza dwie możliwości. Możliwości nie są jeszcze powszechnym systemem do zarządzania niektórymi uprawnieniami. Mogą być obsługiwane przez moduł PAM lub poprzez rozszerzone atrybuty pliku. (patrz http://lxr.free-electrons.com/source/net/bluetooth/hci_sock.c#L619 )

 $> sudo apt-get install libcap2-bin

instaluje narzędzia do manipulacji możliwościami systemu Linux.

 $> sudo setcap 'cap_net_raw,cap_net_admin+eip' `which hcitool`

ustawia brakujące możliwości w pliku wykonywalnym podobnie jak bit setuid.

 $> getcap !$
 getcap `which hcitool`
 /usr/bin/hcitool = cap_net_admin,cap_net_raw+eip

więc możemy iść:

$>hcitool -i hci0 lescan
Set scan parameters failed: Input/output error

Tak, twój adapter BT nie obsługuje BLE

$>hcitool -i hci1 lescan
LE Scan...

Ten robi, kontynuuj i naciśnij przycisk na urządzeniu.

Schnippe
źródło
1
Dzięki cztery wskazując brakujące możliwości. Pomogło mi to również w korzystaniu z bluetoothctl jako użytkownik root, na Raspberry Pi z Raspbian Stretch! ale w moim przypadku dodałem tę możliwość do /lib/systemd/system/bluetooth.service.
Stefan Wegener
7

Ok, przynajmniej częściowo odkryłem, dlaczego hcitool wymaga uprawnień roota do skanowania LE, ale nie do normalnego skanowania. Częściowo oznacza to, że zlokalizowałem wywołanie systemowe, które kończy się niepowodzeniem z powodu niewystarczających uprawnień podczas uruchamiania skanowania LE jako zwykły użytkownik.

Błąd „Operacja niedozwolona” jest generowany przez wywołanie systemowe writev z blokowaniem stosu wywołań w następujący sposób (wszystkie funkcje zaimplementowane w hci.c , patrz kod źródłowy bluez):

hci_le_set_scan_parameters -> hci_send_req -> hci_send_cmd -> writev

Normalne skanowanie („skanowanie hcitool”) najwyraźniej nie musi wysyłać żadnych żądań do kontrolera, ale używa dedykowanego żądania ioctl , wywołując:

ioctl(dd, HCIINQUIRY, (unsigned long) buf);

Wydaje się, że dostęp do zapisu do kontrolera Bluetooth jest ograniczony, ale dlaczego i jak mogę to wyłączyć?

kassiopeia
źródło
0

Nie mam tego zainstalowanego, ale do dobrze napisanego podsystemu urządzeń zwykle jest powiązana z nim grupa. Dodaj użytkownika do grupy, aby uzyskać dostęp do urządzenia (na przykład diskgrupa umożliwia dostęp do surowego dysku twardego). Wystarczy zrobić ls -lw /devcelu sprawdzenia tego. Jeśli tak nie jest, a urządzenie należy do rootgrupy, możesz to zmienić, dostosowując udevreguły dotyczące nazewnictwa, uprawnień i działań na sprzęcie w momencie wykrycia (nie pytaj mnie, jak to zrobić).

Dotyczy to bezpośredniego dostępu do urządzenia, którego prawdopodobnie potrzebujesz w tym przypadku. Normalna funkcjonalność bluetooth jest zwykle obsługiwana przez demona z własną konfiguracją, grupami, uprawnieniami i tak dalej. Sprawdź dokumentację dystrybucji, grupy mogą się nieznacznie różnić.

orion
źródło