¿Escaneo de Bluetooth LE como no root?

13

Para realizar un escaneo en busca de dispositivos bluetooth LE, hcitool aparentemente requiere privilegios de root. Para usuarios normales, el resultado es el siguiente:

$ hcitool lescan
Set scan parameters failed: Operation not permitted

¿Por qué hcitool necesita privilegios de root para un escaneo LE?

¿Es posible realizar de alguna manera un escaneo LE como no root?

kassiopeia
fuente

Respuestas:

21

La pila de protocolos Bluetooth para Linux verifica dos capacidades. Las capacidades son un sistema aún no común para administrar algunos privilegios. Podrían ser manejados por un módulo PAM o mediante atributos de archivo extendidos. (ver http://lxr.free-electrons.com/source/net/bluetooth/hci_sock.c#L619 )

 $> sudo apt-get install libcap2-bin

instala herramientas de manipulación de capacidades de Linux.

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

establece las capacidades faltantes en el ejecutable como el bit setuid.

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

así que estamos bien para ir:

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

Sí, su adaptador BT no es compatible con BLE

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

Este sí, continúa y presiona un botón en tu dispositivo.

Schnippe
fuente
1
Gracias cuatro señalando las capacidades faltantes. ¡También me ayudó a usar bluetoothctl como usuario no root en un Raspberry Pi con Raspbian Stretch! pero en mi caso agregué la capacidad a /lib/systemd/system/bluetooth.service.
Stefan Wegener
7

Ok, al menos descubrí parcialmente por qué hcitool requiere privilegios de root para un escaneo LE pero no para un escaneo normal. Parcialmente significa que localicé la llamada del sistema que falla debido a privilegios insuficientes al ejecutar el escaneo LE como un usuario normal.

El error "Operación no permitida" es generado por una llamada al sistema writev , con la pila de llamadas bloqueada de la siguiente manera (todas las funciones implementadas en hci.c , vea el código fuente de bluez):

hci_le_set_scan_parameters -> hci_send_req -> hci_send_cmd -> writev

El escaneo normal ("escaneo hcitool") aparentemente no necesita enviar ninguna solicitud al controlador, pero usa una solicitud ioctl dedicada , llamando:

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

Parece que el acceso de escritura al controlador bluetooth está restringido, pero ¿por qué y cómo puedo desactivarlo?

kassiopeia
fuente
0

No tengo esto instalado, pero un subsistema de dispositivo bien escrito generalmente tiene un grupo asociado. Agregue un usuario al grupo y podrá acceder al dispositivo (por ejemplo, el diskgrupo permite el acceso al disco duro sin formato). Sólo hacer ls -len /devcomprobar esto. Si ese no es el caso y el dispositivo pertenece al rootgrupo, puede cambiar esto ajustando las udevreglas que rigen los nombres, los permisos y las acciones en el hardware en el momento de la detección (no me pregunte cómo).

Esto se aplica al acceso directo al dispositivo que probablemente necesite en este caso. La funcionalidad normal de bluetooth generalmente se maneja a través de un demonio con su propia configuración, grupos, permisos, etc. Consulte su documentación de distribución, los grupos pueden variar ligeramente.

Orión
fuente