Bluetooth LE als nicht root scannen?

12

Um einen Scan für Bluetooth LE-Geräte durchzuführen , benötigt hcitool anscheinend root-Rechte. Für normale Benutzer ist die Ausgabe wie folgt:

$ hcitool lescan
Set scan parameters failed: Operation not permitted

Warum benötigt hcitool Root-Rechte für einen LE-Scan?

Ist es irgendwie möglich, einen LE-Scan als Nicht-Root durchzuführen?

kassiopeia
quelle

Antworten:

21

Der Bluetooth-Protokollstapel für Linux überprüft zwei Funktionen. Funktionen sind ein noch nicht alltägliches System zur Verwaltung einiger Berechtigungen. Sie können von einem PAM-Modul oder über erweiterte Dateiattribute verarbeitet werden. (siehe http://lxr.free-electrons.com/source/net/bluetooth/hci_sock.c#L619 )

 $> sudo apt-get install libcap2-bin

Installiert Werkzeuge zur Manipulation von Linux-Funktionen.

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

Setzt die fehlenden Fähigkeiten der ausführbaren Datei wie das setuid-Bit.

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

Wir können also loslegen:

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

Ja, Ihr BT-Adapter unterstützt BLE nicht

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

Dies ist der Fall, fahren Sie fort und drücken Sie eine Taste auf Ihrem Gerät.

schnippe
quelle
Vielen Dank für die fehlenden Fähigkeiten. Es hat mir auch geholfen, bluetoothctl als Nicht-Root-Benutzer auf einem Raspberry Pi zu verwenden, auf dem Raspbian Stretch ausgeführt wird! aber in meinem Fall habe ich die Funktion /lib/systemd/system/bluetooth.service hinzugefügt.
Stefan Wegener
7

Ok, zumindest habe ich teilweise herausgefunden, warum hcitool Root-Rechte für einen LE-Scan benötigt, aber nicht für einen normalen Scan. Teilweise bedeutet dies, dass ich den Systemaufruf gefunden habe, der aufgrund unzureichender Berechtigungen fehlschlägt, wenn der LE-Scan als normaler Benutzer ausgeführt wird.

Der Fehler "Operation not allowed " wird durch einen writev- Systemaufruf generiert , wobei der Aufrufstapel wie folgt gesperrt wird (alle in hci.c implementierten Funktionen , siehe den bluez-Quellcode):

hci_le_set_scan_parameters -> hci_send_req -> hci_send_cmd -> writev

Der normale Scan ("hcitool scan") muss anscheinend keine Anforderungen an den Controller senden, sondern verwendet eine dedizierte ioctl- Anforderung, die Folgendes aufruft:

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

Es scheint, dass der Schreibzugriff auf den Bluetooth-Controller eingeschränkt ist, aber warum und wie kann ich das deaktivieren?

kassiopeia
quelle
0

Ich habe dies nicht installiert, aber einem gut geschriebenen Gerätesubsystem ist normalerweise eine Gruppe zugeordnet. Fügen Sie der Gruppe einen Benutzer hinzu, und Sie können auf das Gerät zugreifen (beispielsweise diskermöglicht die Gruppe den Zugriff auf unformatierte Festplatten). Tun Sie einfach ls -lin /devdas zu überprüfen. Wenn dies nicht der Fall ist und das Gerät zur rootGruppe gehört, können Sie dies ändern, indem Sie die udevRegeln anpassen, die die Benennung, Berechtigungen und Aktionen der erkannten Hardware regeln (fragen Sie mich nicht, wie).

Dies gilt für den direkten Gerätezugriff, den Sie in diesem Fall wahrscheinlich benötigen. Die normale Funktionalität von Bluetooth wird normalerweise über einen Daemon mit eigener Konfiguration, eigenen Gruppen, Berechtigungen usw. abgewickelt. Überprüfen Sie Ihre Distributionsdokumentation, die Gruppen können leicht variieren.

orion
quelle