¿Escaneo Bluetooth LE como no root?

¿Escaneo Bluetooth LE como no root?

Para realizar una búsqueda de dispositivos bluetooth LEhcitoolaparentemente requiere privilegios de root. Para usuarios normales, el resultado es el siguiente:

$ hcitool lescan
Set scan parameters failed: Operation not permitted

Por quehcitool¿Necesita privilegios de root para un escaneo LE?

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

Respuesta1

La pila de protocolos Bluetooth para Linux comprueba 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. (verhttps://elixir.bootlin.com/linux/v5.8.10/source/net/bluetooth/hci_sock.c#L1307)

 $> 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 que faltan en el ejecutable de forma muy parecida al bit setuid.

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

entonces estamos listos para comenzar:

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

Sí, tu adaptador BT no es compatible con BLE

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

Este lo hace, continúa y presiona un botón en tu dispositivo.

Respuesta2

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

El error "Operación no permitida" se genera por unescribirvllamada al sistema, con la pila de llamadas bloqueándose de la siguiente manera (todas las funciones implementadas enhci.c, consulte el código fuente de bluez):

hci_le_set_scan_parameters -> hci_send_req -> hci_send_cmd -> writev

El escaneo normal ("hcitool scan") aparentemente no necesita enviar ninguna solicitud al controlador, pero utiliza unioctlsolicitar, 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?

Respuesta3

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, diskel grupo permite el acceso al disco duro sin formato). Sólo ls -lentra /devpara comprobar esto. Si ese no es el caso y el dispositivo pertenece a rootun grupo, puedes 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 preguntes 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. Consulta tu documentación de distribución, los grupos pueden variar ligeramente.

información relacionada