A verificação do Bluetooth LE como não raiz?

12

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

$ hcitool lescan
Set scan parameters failed: Operation not permitted

Por que o hcitool precisa de privilégios de root para uma verificação LE?

É possível, de alguma forma, executar uma verificação LE como não raiz?

kassiopeia
fonte

Respostas:

21

A pilha de protocolos Bluetooth para Linux verifica dois recursos. Os recursos ainda não são um sistema comum para gerenciar alguns privilégios. Eles podem ser manipulados por um módulo PAM ou por meio de atributos de arquivo estendidos. (consulte http://lxr.free-electrons.com/source/net/bluetooth/hci_sock.c#L619 )

 $> 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 faz, continue e pressione um botão no seu dispositivo.

schnippe
fonte
Obrigado quatro, apontando as capacidades ausentes. Também me ajudou a usar bluetoothctl como usuário não root em um Raspberry Pi executando o Raspbian Stretch! mas, no meu caso, adicionei o recurso ao /lib/systemd/system/bluetooth.service.
Stefan Wegener
7

Ok, pelo menos eu descobri parcialmente por que o hcitool requer privilégios de root para uma verificação LE, mas não para uma verificação normal. Parcialmente significa que localizei a chamada do sistema que falhou devido a privilégios insuficientes ao executar a verificação LE como um usuário normal.

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

hci_le_set_scan_parameters -> hci_send_req -> hci_send_cmd -> writev

A varredura normal ("varredura hcitool") aparentemente não precisa enviar nenhuma solicitação ao controlador, mas usa uma solicitação ioctl dedicada , chamando:

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?

kassiopeia
fonte
0

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

Isso vale para o acesso direto ao dispositivo que você provavelmente precisa neste caso. A funcionalidade normal do bluetooth geralmente é tratada através de um daemon com sua própria configuração, grupos, permissões e assim por diante. Verifique sua documentação de distribuição, os grupos podem variar um pouco.

orion
fonte