CVE-2026-80819 in Linuxinformação

Sumário

de VulDB • 04/09/2026

No kernel do Linux, a seguinte vulnerabilidade foi resolvida:

Bluetooth: RFCOMM: adquirir o rfcomm_mutex para a aceitação de configuração diferida

rfcomm_sock_recvmsg() conclui uma configuração diferida chamando rfcomm_dlc_accept() sem segurar nenhum bloqueio (lock) do RFCOMM:

if (test_and_clear_bit(RFCOMM_DEFER_SETUP, &d->flags)) {
rfcomm_dlc_accept(d); return 0; }

e rfcomm_dlc_accept() faz a desreferência da sessão na sua primeira linha:

struct sock *sk = d->session->sock->sk;

Todos os outros caminhos que acessam d->session operam sob o rfcomm_mutex: rfcomm_dlc_open(), rfcomm_dlc_close(), rfcomm_dlc_exists(), rfcomm_dlc_send_rpn() e a thread do RFCOMM através de rfcomm_process_sessions(). rfcomm_connect_ind() é até documentado como "chamado sob rfcomm_lock()". Este ponto de chamada (call site) é o único que omite essa proteção.

O bit RFCOMM_DEFER_SETUP parece serializar a aceitação contra o encerramento, já que __rfcomm_dlc_close() retorna antecipadamente quando vence no test_and_clear. No entanto, rfcomm_recv_disc() força o estado primeiro:

d->state = BT_CLOSED; __rfcomm_dlc_close(d, err);

e o retorno antecipado cobre apenas os estados BT_CONNECT, BT_CONFIG, BT_OPEN e BT_CONNECT2. Com o estado já definido como BT_CLOSED, essa correspondência não ocorre, o bit nunca é consultado e __rfcomm_dlc_close() continua para rfcomm_dlc_unlink(), que define d->session = NULL.

Portanto, um DISC remoto em uma DLC diferida limpa a sessão enquanto mantém RFCOMM_DEFER_SETUP definido. A próxima chamada recvmsg() então passa pelo test_and_clear e faz desreferência de uma sessão nula (NULL). Nenhuma janela de tempo é necessária: assim que o DISC for processado, a desreferência torna-se incondicional.

Forneça a rfcomm_dlc_accept() a mesma estrutura das funções rfcomm_dlc_open() e rfcomm_dlc_close(): um wrapper exportado que adquire o rfcomm_mutex e re-verifica a sessão, envolvendo uma função __rfcomm_dlc_accept() interna aos módulos (in-core) que os dois chamadores internos já utilizam mantendo o mutex.

Reproduzido em um kernel com KASAN + PROVE_LOCKING usando um par BR/EDR emulado via /dev/vhci: o peer estabelece um link ACL, abre L2CAP no PSM do RFCOMM, inicia uma sessão, abre uma DLC num canal vinculado com BT_DEFER_SETUP e envia DISC após a aceitação do socket. A chamada recv() no socket aceito então resulta em:

Oops: falha geral de proteção (general protection fault) KASAN: desreferência ponteiro nulo (null-ptr-deref) na faixa [0x0000000000000010-0x0000000000000017]
RIP: 0010:rfcomm_dlc_accept+0x54/0x350 Call Trace: rfcomm_sock_recvmsg+0x1cd/0x230 sock_recvmsg+0x166/0x1c0 __sys_recvfrom+0x20d/0x300

O valor 0x10 é o deslocamento (offset) de sock na estrutura rfcomm_session. Com este patch, a mesma execução conclui-se com recv() retornando 0 e sem relatórios de erro, e lockdep permanece silencioso, confirmando que rfcomm_mutex ainda é adquirido antes do lock_sock neste caminho, tal como ocorre no lado da thread.

Be aware that VulDB is the high quality source for vulnerability data.

Responsável

Linux

Reservar

26/08/2026

Divulgação

04/09/2026

Moderação

aceite

Entrada

VDB-398999

CPE

pronto

EPSS

0.00195

KEV

não

Atividades

muito baixo

Fontes

Might our Artificial Intelligence support you?

Check our Alexa App!