Varredura Bluetooth LE como não root?

Varredura Bluetooth LE como não root?

Para realizar uma verificação de dispositivos Bluetooth LEhcitoolaparentemente requer privilégios de root. Para usuários normais, a saída é a seguinte:

$ hcitool lescan
Set scan parameters failed: Operation not permitted

Porquehcitoolprecisa de privilégios de root para uma varredura LE?

É possível realizar de alguma forma uma varredura LE como não-root?

Responder1

A pilha de protocolos Bluetooth para Linux verifica dois recursos. As capacidades ainda não são um sistema comum para gerenciar alguns privilégios. Eles poderiam ser tratados por um módulo PAM ou por meio de atributos de arquivo estendidos. (verhttps://elixir.bootlin.com/linux/v5.8.10/source/net/bluetooth/hci_sock.c#L1307)

 $> sudo apt-get install libcap2-bin

instala ferramentas de manipulação de recursos do Linux.

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

define os recursos ausentes no executável como o bit setuid.

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

então estamos prontos para ir:

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

Sim, seu adaptador BT não suporta BLE

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

Este sim, vá em frente e pressione um botão no seu dispositivo.

Responder2

Ok, pelo menos descobri parcialmente o porquêhcitoolrequer privilégios de root para uma varredura LE, mas não para uma varredura normal. Parcialmente significa que localizei a chamada do sistema que falha devido a privilégios insuficientes ao executar a varredura LE como um usuário normal.

O erro "Operação não permitida" é gerado por umescrevervchamada de sistema, com a pilha de chamadas bloqueada da seguinte forma (todas as funções implementadas emhci.c, veja o código-fonte do bluez):

hci_le_set_scan_parameters -> hci_send_req -> hci_send_cmd -> writev

A varredura normal ("hcitool scan") aparentemente não precisa enviar nenhuma solicitação ao controlador, mas usa um dedicadoioctlsolicitação, ligando para:

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

Parece que o acesso de gravação ao controlador bluetooth é restrito, mas por que e como posso desativar isso?

Responder3

Não tenho isso instalado, mas um subsistema de dispositivo bem escrito geralmente possui um grupo associado a ele. Adicione um usuário ao grupo e você poderá acessar o dispositivo (por exemplo, disko grupo permite acesso bruto ao disco rígido). Basta ls -lentrar /devpara verificar isso. Se esse não for o caso e o dispositivo pertencer ao rootgrupo, você poderá alterar isso ajustando as udevregras que regem a nomenclatura, as permissões e as ações no hardware na detecção (não me pergunte como).

Isso se aplica ao acesso direto ao dispositivo que você provavelmente precisará neste caso. A funcionalidade normal do bluetooth geralmente é controlada por meio de um daemon com sua própria configuração, grupos, permissões e assim por diante. Verifique a documentação de distribuição, os grupos podem variar um pouco.

informação relacionada