
Divulgação e PoC de uma falha de leitura/escrita de arquivo como root no canal de depuração do TP-Link Deco XE75 Pro V3 (opcodes tmpsvr 0xC456/0xF0), com análise CVSS e descompilação do handler.
Projeto VLAN complementar: alpha experimental de código-fonte com VLAN 30 fixa para o firmware/perfil exato do XE75 Pro V3. Requer ficheiros originais fornecidos pelo operador e não tem instalador geral nem imagem flashável. A VLAN de convidados 591 permanece por resolver; a aceitação final de arranque a frio, UI e isolamento de clientes com três unidades está incompleta. Ver estado atual.
Divulgação de investigação, TP-Link Deco XE75 Pro V3, firmware 1.5.0 Build
20260603 Rel.15804. Preparado para [email protected] e lançamento público em conjunto com a nossa implementação de VLAN IoT 802.1Q (deco-iot-vlan).
O canal SSH de depuração autenticado pelo proprietário do Deco (Dropbear em TCP 20001,
apenas encaminhamento direct-tcpip, autenticação por palavra-passe) alcança um
serviço interno tmpsvr em 127.0.0.1:20002. Um dos seus handlers Lua,
inner_file_push (opcode 0xC456), abre params.file em modo "w" e
escreve params.content literalmente como root, sem lista de caminhos permitidos, sem limite
de tamanho e sem redução de privilégios. Um opcode irmão (0xF0) fornece uma
leitura de ficheiros como root correspondente. Em conjunto: leitura + escrita autenticadas de todo o
sistema de ficheiros root, que num router é o dispositivo inteiro.
SSH :20001 (username = SHA1(owner_email), password = TP-Link account password)
-> direct-tcpip -> 127.0.0.1:20002 (TMPv2)
-> 0xC456 inner_file_push : io.open(file,"w"); write(content); close() [root]
-> 0x00F0 root file read : byte-exact file read [root]
/etc/config é um ramfs gravável em tempo real → altere uma chave e o roteador a respeita./www é servido via HTTPS pelo uhttpd → os arquivos enviados ficam imediatamente acessíveis./tp_data/user_data é flash ubifs persistente → sobrevive ao reboot.GET /cgi-bin/luci → execução de Lua como root → io.popen → execução arbitrária
de binário como root.Todas as quatro etapas foram executadas e revertidas na própria unidade principal do proprietário.
tmpsvr continua sem correção 2 anos após o CCS'24 / Black Hat '24A equipe UCR SecLab documentou publicamente o canal de depuração :20001 -> 127.0.0.1:20002 (tmpsvr) há dois anos no CCS 2024 — "Untangling the Knot: Breaking Access Control in Home Wireless Mesh Networks" (e no Black Hat USA 2024 — "Fallen Tower of Babel"). O ponto de entrada deles em modelos Deco mais antigos (X55, FW 1.2.2) era a fatoração de hostkeys RSA de 512 bits e o abuso de handlers tmpsvr não validados.
Diferenças observadas e handlers remanescentes neste firmware exato:
ssh-rsa de 512 bits para 2048 bits (uma chave compartilhada observada entre as três unidades mesh, SHA256:9feb3ac4...932a36, além de ecdsa-sha2-nistp521 por unidade), fechando o caminho de fatoração de 512 bits da palestra de 2024.1.5.0:
:20001 (svr_auth_uci) permanece ativa usando SHA1(owner_email) + a senha compartilhada da TP-Link ID.0xC456 (inner_file_push) ainda abre qualquer caminho fornecido pelo chamador no modo "w" como root sem nenhuma validação de caminho.0x00F0 ainda lê qualquer arquivo do sistema de arquivos como root.0xC505 (tty2tcp/start) — o exato handler de injeção de comando /bin/sh -c sem aspas destacado no artigo de 2024 — continua presente no firmware de junho de 2026 (1.5.0) completamente sem correção.luci/controller/admin/mobile_app/iot_device,
inner_file_push).Apenas a alcançabilidade pela LAN foi demonstrada. Para o perfil observado de LAN apenas, usamos as variantes AV:A: v3.1 6.8 / v4.0 8.5. As pontuações AV:N abaixo são condicionais a um caminho de rede demonstrado; a alcançabilidade pela nuvem não foi verificada.
Esta é uma escalada para root pós-autenticação, com privilégios do proprietário — não
um RCE não autenticado — as pontuações do perfil observado abaixo são 6.8 (v3.1) e 8.5 (v4.0). A justificativa completa e as
inflações rejeitadas estão em docs/cvss-analysis.md.
CVSS v3.1 — avaliação apenas LAN 6.8 (Médio); variante remota condicional 7.2 (Alto):
CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H = 7.2 (High)
CVSS:3.1/AV:A/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H = 6.8 (Medium) # if LAN-only
Chamadas decisivas: PR:H (o proprietário / conta TP-Link-ID é o principal administrativo do dispositivo) e S:U (o handler já é executado como root — nenhum limite de autoridade é cruzado). Um rascunho anterior pontuou 9.9 via PR:L + S:C; ambos são rejeitados.
CVSS v4.0 — avaliação apenas para LAN 8.5 (Alta); variante remota condicional 8.6 (Alta):
CVSS:4.0/AV:N/AC:L/AT:N/PR:H/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N = 8.6 (High)
CVSS:4.0/AV:A/AC:L/AT:N/PR:H/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N = 8.5 (High) # if LAN-only
CVSS:4.0/AV:N/AC:L/AT:N/PR:H/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:L = 9.3 (Critical) # with Subsequent-System LAN/mesh impact
O risco no mundo real — uma senha TP-Link-ID roubada/reutilizada convertendo-se em root persistente em toda a malha, além de MITM do tráfego dos clientes — pertence à narrativa (e às métricas Subsequent-System SC:H/SI:H/SA:L da v4.0), não a um vetor base v3.1 inflado.
poc/deco_filepush_poc.py — autocontido (stdlib + paramiko). Credenciais
apenas via variáveis de ambiente DECO_EMAIL / DECO_PASSWORD. Os modos ao vivo exigem
DECO_HOSTKEY, verificado de forma independente: base64 bruto, uma linha de chave pública, ou uma
linha de chave de ssh-keyscan (comentários suportados). Uma varredura sozinha não autentica
o dispositivo. A verificação HTTPS compara os bytes servidos, mas não verifica seu certificado.
Exige-se exatamente um modo; uma verificação falhada termina com código de saída diferente de zero.
python3 poc/deco_filepush_poc.py --selftest # offline framing sanity
[email protected] DECO_PASSWORD=*** DECO_HOSTKEY="$TRUSTED_DECO_HOSTKEY" \
python3 poc/deco_filepush_poc.py --run # write marker + readback + HTTPS check
[email protected] DECO_PASSWORD=*** DECO_HOSTKEY="$TRUSTED_DECO_HOSTKEY" \
python3 poc/deco_filepush_poc.py --cleanup <nonce> # overwrite marker with empty content
O PoC grava um único marcador inerte em /www/log_export (ramfs; também
apagado no reboot), e então exige leitura de volta byte a byte através do
próprio opcode de leitura de root do dispositivo e serviço HTTPS não
modificado antes de reportar sucesso.