Bluetooth LE scan en tant que non root?

13

Pour effectuer une analyse des périphériques Bluetooth LE, hcitool nécessite apparemment des privilèges root. Pour les utilisateurs normaux, la sortie est la suivante:

$ hcitool lescan
Set scan parameters failed: Operation not permitted

Pourquoi hcitool a- t- il besoin des privilèges root pour un scan LE?

Est-il possible de faire en quelque sorte un scan LE en tant que non root?

kassiopeia
la source

Réponses:

21

La pile de protocoles Bluetooth pour Linux vérifie deux capacités. Les capacités ne sont pas encore un système commun pour gérer certains privilèges. Ils peuvent être gérés par un module PAM ou via des attributs de fichier étendus. (voir http://lxr.free-electrons.com/source/net/bluetooth/hci_sock.c#L619 )

 $> sudo apt-get install libcap2-bin

installe les outils de manipulation des capacités linux.

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

définit les capacités manquantes sur l'exécutable tout comme le bit setuid.

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

nous sommes donc prêts à partir:

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

Oui, votre adaptateur BT ne prend pas en charge BLE

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

Celui-ci le fait, continuez et appuyez sur un bouton de votre appareil.

schnippe
la source
1
Merci à quatre de souligner les capacités manquantes. Cela m'a également aidé à utiliser bluetoothctl en tant qu'utilisateur non root sur un Raspberry Pi exécutant Raspbian Stretch! mais dans mon cas, j'ai ajouté la capacité à /lib/systemd/system/bluetooth.service.
Stefan Wegener
7

Ok, au moins j'ai découvert en partie pourquoi hcitool nécessite des privilèges root pour un scan LE mais pas pour un scan normal. Cela signifie en partie que j'ai localisé l'appel système qui échoue en raison de privilèges insuffisants lors de l'exécution de l'analyse LE en tant qu'utilisateur normal.

L'erreur "Opération non autorisée" est générée par un appel système writev , avec le verrouillage de la pile d'appels comme suit (toutes les fonctions implémentées dans hci.c , voir le code source bluez):

hci_le_set_scan_parameters -> hci_send_req -> hci_send_cmd -> writev

Le scan normal ("hcitool scan") n'a apparemment pas besoin d'envoyer de requêtes au contrôleur, mais utilise une requête ioctl dédiée , appelant:

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

Il semble que l'accès en écriture au contrôleur Bluetooth soit limité, mais pourquoi et comment puis-je le désactiver?

kassiopeia
la source
0

Je ne l'ai pas installé, mais un sous-système de périphérique bien écrit est généralement associé à un groupe. Ajoutez un utilisateur au groupe et vous pouvez accéder à l'appareil (par exemple, le diskgroupe autorise l'accès au disque dur brut). Il suffit de faire ls -ldans /devle vérifier. Si ce n'est pas le cas et que l'appareil appartient au rootgroupe, vous pouvez changer cela en ajustant les udevrègles qui régissent les noms, les autorisations et les actions sur le matériel lors de la détection (ne me demandez pas comment).

Cela vaut pour l'accès direct à l'appareil dont vous avez probablement besoin dans ce cas. La fonctionnalité normale de bluetooth est généralement gérée par un démon avec sa propre configuration, groupes, autorisations, etc. Vérifiez votre documentation de distribution, les groupes peuvent varier légèrement.

orion
la source