- A Samsung WB850F foi o primeiro modelo a usar o SoC DRIMeIII junto com Wi-Fi, e o partialImage.o.map incluído no ZIP do firmware possibilitou a análise do firmware do SoC principal e o bypass da detecção de hotspot
WB850F_FW_210086.zipcontémWB850-FW-SR-210086.bin, com 6 partições, e um dump do linker com mais de 300 mil linhas, permitindo confirmar queMain_Imageera o firmware ARM real- Na análise com Ghidra, o ponto central foi encontrar o endereço base 0xc0004000 do
Main_Imageusando a diferença entre endereços de strings e importar como símbolos os nomes de funções da.textapós convertê-los - A função de identificação de hotspot
DevHTTPResponseStartdetermina se o AP está autenticado por um cookie de domínio Yahoo em HTTP 200 ou pela stringyahoo.no início da URL de redirecionamento 301/302/307 - Quando o Yahoo passou a redirecionar para HTTPS, a posição de
yahoo.saiu do intervalo aceito pelo código; após o patch nosamsung-nx-emailservice, o upload de fotos da WB850F passou a funcionar
Estrutura do ZIP de firmware da WB850F
- A Samsung WB850F é um dos poucos modelos para os quais a Samsung ainda publica firmware e arquivos de suporte, mesmo após a descontinuação do aplicativo iLauncher
WB850F_FW_210086.zipcontém os seguintes arquivosGPS_FW/BASEBAND_FW_Flash.mbinGPS_FW/BASEBAND_FW_Ram.mbinGPS_FW/Config.BINGPS_FW/flashBurner.mbinFWUPpartialImage.o.mapWB850-FW-SR-210086.binwb850f_adj.txt
FWUPcontém apenas a stringupgrade all, que parece ser um script para um módulo de teste/automação de firmwarewb850f_adj.txté um script mais complexo que atualiza o firmware de GPS e remove arquivos relacionados- Os scripts relacionados a GPS e a pasta
GPS_FWficam fora do escopo desta análise
partialImage.o.map: um mapa em forma de dump do linker
partialImage.o.mapé um arquivo de texto com mais de 300 mil linhas e contém a saída do linker parapartialImage.o, além do mapa completo de memória do arquivo linkado- A seção
.textcontém nomes de funções comosysInit,archPwrDown,DevHTTPResponseStart,DevHTTPResponseDataeDevHTTPResponseEnd - A seção
.datainclui símbolos de dados comosysBus,sysCpuesysBootLine - Esse arquivo é usado como um mapa de símbolos para associar o código do firmware aos nomes das funções
Cabeçalho e tabela de partições de WB850-FW-SR-210086.bin
- Ao analisar
WB850-FW-SR-210086.bincombinwalk, aparecem cabeçalhos HTML, PNG e JPEG, cabeçalhos VxWorks e vários caminhos Unix, mas nenhuma partição ou sistema de arquivos claro é revelado - Um dump hexadecimal do primeiro 1 KB mostra o firmware versão
210086seguido de0x00 0x06, e depois nomes de arquivos comoFW_UP/ONBL1.bin - Cada registro parece ter uma estrutura de 60 bytes, composta por uma string de 32 bytes com padding de zeros, dois inteiros little-endian e um nome de partição de 20 bytes com padding de zeros
- Os dois inteiros são interpretados, respectivamente, como tamanho e offset dentro do arquivo
- Há 6 registros no total, então
0x00 0x06é interpretado como o byte de término ou padding da string de versão do firmware e um contador de partições de 1 byte -
Partições reconstruídas
FW_UP/ONBL1.bin- Tamanho: 196 bytes, offset:
0x0000800, nome da partição:ONBL1
- Tamanho: 196 bytes, offset:
FW_UP/ONBL2.bin- Tamanho: 46 KB, offset:
0x00008c4, nome da partição:ONBL2
- Tamanho: 46 KB, offset:
[WB850]DSC_5KEY_WB850- Tamanho: 30 MB, offset:
0x000bef4, nome da partição:Main_Image
- Tamanho: 30 MB, offset:
RomFS/SPID.Rom- Tamanho: 48 MB, offset:
0x1d2b32c, nome da partição:Resource
- Tamanho: 48 MB, offset:
FW_UP/WB850.HEX- Tamanho: 19 KB, offset:
0x4c75f2c, nome da partição:OIS
- Tamanho: 19 KB, offset:
FW_UP/skin.bin- Tamanho: 36 MB, offset:
0x4c7acb2, nome da partição:SKIN
- Tamanho: 36 MB, offset:
- Para extrair as partições, foi escrito e usado o extrator de partições de firmware DRIMeIII
Distinção entre partições de código e dados
- A ferramenta de extração recupera os arquivos com base no nome da partição e acrescenta
.bin - Apenas o resultado de
filetem utilidade limitada, chegando a identificar erroneamenteMain_Image.bincomo uma chave secreta OpenPGP ONBL1eONBL2parecem ser os bootloaders de primeiro e segundo estágio, considerando a string"BootLoader(ONBL1, ONBL2) Update Done"dentro deMain_ImageMain_Imageé o firmware real, ebinwalk -Areporta nesse arquivo vários prólogos de função ARMResourceeSKINsão contêineres grandes, possivelmente configurações fornecidas pelo fabricante do SoC relacionadas ao skin da UI da câmeraOIS, apesar do nome do arquivo, não é realmente um HEX e pode ser o firmware do dispositivo dedicado de estabilização óptica de imagem- O centro da análise é
Main_Image
Mapeando Main_Image no Ghidra
- As três partições
ONBL1,ONBL2eMain_Imagecontêm código ARM real - Firmwares ARM comuns têm uma tabela de vetores de reset no endereço
0x0000000, mas os três binários começam com código linear, então precisam ser remapeados para um endereço ainda desconhecido - Para analisar o falso reconhecimento de hotspot, foram necessárias as seguintes tarefas
- Encontrar o endereço de memória correto para mapear
Main_Image - Carregar no Ghidra os nomes de símbolos de
partialImage.o.map - Analisar a função que dispara incorretamente a decisão de login em hotspot
- Encontrar o endereço de memória correto para mapear
- Ao buscar
"yahoo"na aba Defined Strings do Ghidra, apareceram itens que pareciam strings de debug deDevHTTPResponseStart()DevHTTPResponseStart: url=%s, handle=%x, status=%dDevHTTPResponseStart: This is YAHOO check !!!DevHTTPResponseStart: THIS IS GOOGLE/YAHOO/SAMSUNG PAGE!!!! 111301/302/307! cannot find yahoo!
- Em
partialImage.o.map,DevHTTPResponseStartfica em0x321a84, e o Ghidra também encontra a função no mesmo offset - A diferença entre o valor do ponteiro da string de debug e o offset real da string bate com
0xc0004000, levando à conclusão de que o endereço base deMain_Imageé0xc0004000 - Como o Ghidra não permite alterar o endereço base depois, foi necessário remover o binário do projeto e importá-lo novamente configurando o endereço base
Importação de nomes de funções e análise de DevHTTPResponseStart
- O ImportSymbolScript.py do Ghidra consegue importar símbolos em massa a partir de uma tabela de texto
- O script espera que cada linha contenha o nome do símbolo, o endereço em hexadecimal e
fpara indicar função oulpara indicar label - Como em
partialImage.o.mapsó eram necessárias as funções da seção.textatual, os seguintes itens precisaram ser excluídos- Linhas em branco
- Offsets de arquivos de objeto
- Labels de seção como
.text - Labels com prefixo
L$_ - Símbolos locais com prefixo
$
- Aos endereços foi somado
0xc0004000para alinhá-los ao endereço base no Ghidra - O resultado convertido foi gerado em um formato como
sysInit c0004000 fearchPwrDown c0004094 f, e carregado pelo Script Manager do Ghidra - Depois que os nomes de funções foram inseridos, vários campos
DAT_foram marcados como ponteiros e os nomes dos parâmetros foram alterados com base nas strings de debug, tornando legível o resultado de decompilação deDevHTTPResponseStart
Condições de detecção de hotspot
DevHTTPResponseStartobserva o status da resposta HTTP, a URL e os cabeçalhos para decidir se o AP Wi-Fi foi autenticado- Em uma resposta HTTP 200 OK, é necessário haver nos cabeçalhos da resposta um cookie de domínio Yahoo para que a autenticação seja tratada como bem-sucedida
- Os alvos da verificação são
domain=.yahoo,Domain=.yahoo,domain=kr.yahooeDomain=kr.yahoo - Se a condição for satisfeita,
p_request_ongoingé alterado para 0 e, se o navegador estiver em estado não autenticado,safnotify_auth_ap(0)é chamado
- Os alvos da verificação são
- Em redirecionamentos HTTP 301/302/307, a string
yahoo.é verificada dentro da URL- Se
yahoo.não existir ou estiver depois deurl + 11, o código trata isso como Yahoo não encontrado - Se o framebuffer do navegador não estiver ligado e a autenticação também não tiver sido feita,
safnotify_auth_ap(1)é chamado - Se
yahoo.estiver no começo, a autenticação é considerada bem-sucedida comsafnotify_auth_ap(0)
- Se
- Status negativos retornam
false, como em uma requisição interrompida - Em status positivos que não sejam 200 nem redirecionamento, o resultado varia conforme o estado do framebuffer do navegador
Verificação do Yahoo quebrada após TLS e bypass
- A URL consultada pela câmera é
http://www.yahoo.co.kr/ - Ao fazer uma requisição direta, o servidor redireciona com
HTTP/1.1 301 Moved PermanentlyeLocation: https://www.yahoo.com/ - Em
https://www.yahoo.com/, a substringyahoo.fica na posição 12 - O código exige que
yahoo.esteja em uma das 11 primeiras posições, então essa verificação quebrou após a migração para HTTPS - Para passar na verificação de hotspot, é preciso apontar o registro DNS para outro servidor, e esse servidor deve redirecionar via HTTP para um nome que se pareça mais com Yahoo ou definir um cookie de domínio Yahoo
- Depois do patch no samsung-nx-emailservice, a câmera de fato se conecta e faz upload das fotos
Outras câmeras às quais o mesmo bypass foi aplicado
- Esta análise conseguiu entender e contornar a detecção de hotspot da câmera Wi-Fi Samsung WB850F com base em uma única função submetida a engenharia reversa
- O patch final era pequeno, mas a forma de detecção implementada pelos engenheiros da Samsung dificultava inferir o bypass apenas a partir do rastreamento de pacotes
- Depois de saber o que procurar, o mesmo bypass foi aplicado também a câmeras que consultam MSN.com
- Como resultado, EX2F, ST200F, WB3xF e WB1100F foram adicionadas à lista de câmeras compatíveis
Main_Imagecontém mais de 77 mil funções, então ainda restam muitos alvos de análise para entender melhor o funcionamento da câmera digital
1 comentários
Comentários do Hacker News
Gostei mais de https://op-co.de/blog/posts/samsung_nx_cryptofail/#index3h3
É um caso realmente impressionante de falha na criptografia de firmware
Trabalho excelente. Fico curioso se há planos de transformar o método de engenharia reversa em um tutorial
Só deixei de fora as partes fáceis de encontrar no Google
Tudo o que eu quero é tirar fotos com uma dSLR usando o botão da câmera e, pouco depois, a imagem aparecer no Apple Photos
Os smartphones praticamente acabaram com o mercado de câmeras de consumo, então parece faltar demanda. Como ideia de projeto, seria tentar encontrar uma forma de enfiar um ESP32 dentro de um cartão SD
Também dá para conectar a celulares, tablets e sites, mas é necessário um app ou serviço. Documento sobre envio por FTP diretamente da câmera: https://gdlp01.c-wss.com/gds/5/0300024975/01/eos5d-mk4-wff-i... página 113. O link é para o EOS 5D Mark IV (WG) Wi‑Fi (Wireless Communication) Function Instruction Manual
Infelizmente, são modelos de 10 anos atrás e raros até no mercado de usados
Ela pareia por Wi‑Fi ou Bluetooth e, se quiser, você pode controlar a câmera remotamente pelo iPad e também ver a tela