Bluetooth LE-Scan als Nicht-Root?

Bluetooth LE-Scan als Nicht-Root?

So führen Sie einen Scan nach Bluetooth LE-Geräten durchAbonnierenerfordert offenbar Root-Rechte. Für normale Benutzer lautet die Ausgabe wie folgt:

$ hcitool lescan
Set scan parameters failed: Operation not permitted

Warum tutAbonnierenBenötigen Sie Root-Rechte für einen LE-Scan?

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

Antwort1

Der Bluetooth-Protokollstapel für Linux prüft zwei Fähigkeiten. Fähigkeiten sind ein noch nicht gängiges System zur Verwaltung einiger Berechtigungen. Sie könnten von einem PAM-Modul oder über erweiterte Dateiattribute verwaltet werden. (siehehttps://elixir.bootlin.com/linux/v5.8.10/source/net/bluetooth/hci_sock.c#L1307)

 $> sudo apt-get install libcap2-bin

installiert Tools 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 ganz ähnlich wie das Setuid-Bit.

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

also kann es losgehen:

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

Ja, Ihr BT-Adapter unterstützt kein BLE

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

Bei diesem ist das der Fall. Fahren Sie fort und drücken Sie eine Taste auf Ihrem Gerät.

Antwort2

Ok, zumindest habe ich teilweise herausgefunden, warumAbonnierenerfordert Root-Rechte für einen LE-Scan, aber nicht für einen normalen Scan. Teilweise bedeutet, dass ich den Systemaufruf gefunden habe, der aufgrund unzureichender Rechte fehlschlägt, wenn ich den LE-Scan als normaler Benutzer ausführe.

Der Fehler „Operation nicht zulässig“ wird erzeugt durchschreibenvSystemaufruf, wobei der Aufrufstapel wie folgt gesperrt wird (alle Funktionen implementiert inhci.c, siehe den Bluez-Quellcode):

hci_le_set_scan_parameters -> hci_send_req -> hci_send_cmd -> writev

Der normale Scan ("hcitool scan") muss offenbar keine Anfragen an den Controller senden, sondern verwendet einen dediziertenioctlAnfrage, Aufruf:

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?

Antwort3

Ich habe das nicht installiert, aber ein gut geschriebenes Gerätesubsystem hat normalerweise eine zugeordnete Gruppe. Fügen Sie der Gruppe einen Benutzer hinzu, und Sie können auf das Gerät zugreifen (die diskGruppe erlaubt beispielsweise den Zugriff auf die Festplatte). Führen Sie einfach ein Update ls -ldurch /dev, um dies zu überprüfen. Wenn das nicht der Fall ist und das Gerät zur rootGruppe gehört, können Sie dies ändern, indem Sie die Regeln anpassen udev, die Benennung, Berechtigungen und Aktionen auf der Hardware bei Erkennung 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, Gruppen, Berechtigungen usw. abgewickelt. Überprüfen Sie die Dokumentation Ihrer Distribution, die Gruppen können leicht abweichen.

verwandte Informationen