Capa

BYD Shark: como proteger APIs de comandos remotos em carros

O caso da BYD Shark mostra um problema que vai além de “um carro conectado foi hackeado”: uma função exposta sem autenticação adequada pode transformar recursos de conveniência em comandos remotos capazes de afetar segurança e privacidade. Segundo o Olhardigital.com.br, o especialista Dan Hreszczuk conseguiu interferir em funções da picape durante um teste na Austrália, mas os freios e as câmeras permaneceram protegidos. Essa diferença é importante: carros modernos têm várias camadas de controle, e nem todas têm o mesmo nível de risco.

O que aconteceu no teste remoto com a BYD Shark

O teste foi realizado a pedido da emissora australiana ABC. Hreszczuk, cofundador da Fortify Labs, passou duas semanas analisando os sistemas da Shark antes de testar o acesso em uma estrada perto de Camberra. De acordo com o relato, a entrada explorada não exigia senha.

Com o veículo a cerca de 30 km/h, o especialista desligou os faróis, acionou os limpadores na velocidade máxima, jogou água no para-brisa e travou as portas. Também reproduziu sons e imagens na central multimídia e ativou o microfone da cabine. O teste permitiu ainda acompanhar a localização do veículo.

O relato não descreve a falha técnica exata, o caminho de rede usado nem a arquitetura interna do veículo. Sem esses detalhes, não dá para afirmar se o problema estava em uma API, em um serviço de nuvem, em um aplicativo ou em outro componente. Também não é correto concluir que todos os modelos da marca, ou todos os veículos conectados, tenham a mesma vulnerabilidade.

O que o caso demonstra é mais específico: um acesso remoto aparentemente sem autenticação conseguiu alcançar funções que deveriam ter limites claros. Para mim, essa é a questão central para quem desenvolve sistemas conectados: não basta proteger o login; cada comando precisa ser autorizado de acordo com seu risco e seu contexto.

Por que um carro conectado tem uma superfície de ataque maior

Um veículo conectado não é apenas um computador com rodas. Ele pode combinar aplicativos móveis, serviços de nuvem, conectividade celular, sistemas de entretenimento e módulos eletrônicos responsáveis por funções diferentes. Cada integração cria uma fronteira que precisa de autenticação, autorização, validação de dados e monitoramento.

Em uma arquitetura comum, o aplicativo envia uma solicitação a um serviço remoto, que verifica a identidade e as permissões do usuário. O comando pode então seguir por uma conexão do veículo até um gateway interno. Esse gateway deveria decidir se aquela solicitação é válida para aquele carro, naquele momento e para aquela função.

O princípio é parecido com o de uma aplicação web distribuída, mas as consequências são diferentes. Uma falha em um painel administrativo pode expor dados ou interromper uma operação. Em um carro, até uma função aparentemente simples — como controlar as portas ou os faróis — pode ter implicações físicas, dependendo de quando e como é acionada.

Também é importante separar conectividade de controle crítico. O teste relatado não conseguiu controlar os freios nem as câmeras. Isso sugere que havia barreiras mais rigorosas para esses recursos, embora o relato não detalhe como foram implementadas. A lição não é que essas proteções sejam infalíveis; é que a arquitetura precisa tratar cada função conforme o impacto potencial de uma falha.

Autenticação não é autorização: o erro que abre a porta

Autenticação responde: “quem está fazendo a solicitação?”. Autorização responde: “essa identidade pode executar este comando, neste veículo e nestas condições?”. Um sistema pode ter autenticação forte e ainda permitir ações excessivas depois do login.

Por exemplo, um token válido não deveria dar automaticamente acesso a qualquer função remota. O serviço precisa verificar se o usuário tem vínculo com o veículo, se a sessão continua válida, se o comando está na lista permitida e se o estado do carro permite executá-lo. Para ações sensíveis, também é razoável exigir confirmação adicional ou limitar a operação quando o veículo está em movimento.

Uma falha de autenticação, como a descrita no teste, é ainda mais básica: o sistema aparentemente aceitou uma entrada sem pedir credenciais. Mas corrigir apenas esse ponto não resolve tudo. Se a correção consistir em “colocar uma senha” sem rever permissões, expiração de tokens, proteção contra repetição de comandos e validação no veículo, a vulnerabilidade pode apenas mudar de forma.

O que o episódio ensina sobre segurança e privacidade

O acionamento do microfone e o acompanhamento da localização ampliam o caso para além da segurança física. Localização é dado pessoal sensível na prática: pode revelar rotinas, endereço, local de trabalho e deslocamentos. Microfone ativo sem transparência pode capturar conversas privadas.

Na minha experiência com sistemas distribuídos, esses riscos costumam aparecer quando uma equipe trata telemetria e comandos como se fossem a mesma categoria de dado. Não são. Uma leitura de estado enviada ao servidor pode ser necessária para um recurso legítimo; um comando que ativa um sensor dentro da cabine exige controles mais restritos, registro de acesso e uma justificativa clara para o usuário.

O desenho deve aplicar minimização de dados: coletar apenas o necessário, pelo tempo necessário, com acesso limitado. Também precisa haver rastreabilidade. Se um microfone ou outro sensor for ativado remotamente, o sistema deve conseguir registrar quem autorizou a ação, quando ocorreu e qual serviço a iniciou — sem transformar esses registros em uma nova fonte de exposição.

Na Prática: como estruturo a autorização de comandos remotos

Ao projetar uma API que controla recursos físicos, eu começo com uma regra simples: negar por padrão e liberar apenas operações explicitamente permitidas. O exemplo abaixo não reproduz a falha da reportagem. Ele mostra uma validação defensiva mínima para comandos recebidos por um serviço remoto.

import time

ALLOWED_COMMANDS = {"lights_off", "wipers_on", "lock_doors"}

def authorize_command(request, now=None):
    """Valida uma solicitação antes de encaminhá-la ao gateway do veículo."""
    now = time.time() if now is None else now

    required = {
        "user_id", "vehicle_id", "command",
        "issued_at", "token_valid", "vehicle_speed_kmh"
    }
    if not required.issubset(request):
        return False, "campos obrigatórios ausentes"

    if request["token_valid"] is not True:
        return False, "sessão inválida"

    if not request["user_id"] or not request["vehicle_id"]:
        return False, "identidade ou veículo inválido"

    # Rejeita solicitações antigas para reduzir risco de replay.
    if abs(now - request["issued_at"]) > 30:
        return False, "solicitação expirada"

    if request["command"] not in ALLOWED_COMMANDS:
        return False, "comando não permitido"

    # Exemplo de política conservadora: não operar portas em movimento.
    if request["command"] == "lock_doors":
        if request["vehicle_speed_kmh"] > 0:
            return False, "comando bloqueado com o veículo em movimento"

    return True, "comando autorizado"


sample = {
    "user_id": "user-123",
    "vehicle_id": "vehicle-456",
    "command": "lock_doors",
    "issued_at": time.time(),
    "token_valid": True,
    "vehicle_speed_kmh": 0,
}

print(authorize_command(sample))

Esse exemplo é didático, não uma implementação pronta para produção. Em um sistema real, eu não confiaria em um campo booleano como token_valid enviado pelo cliente: a validação da assinatura, expiração, audiência e emissor do token precisa acontecer no servidor confiável. Também verificaria se o usuário tem permissão para aquele veículo, usaria identificadores únicos para impedir repetição de comandos e registraria decisões de autorização.

O ponto mais importante é validar o contexto perto do componente que executa a ação. Uma autorização feita somente na nuvem pode ficar desatualizada se o estado do veículo mudar durante o trajeto do comando. O gateway do veículo deve aplicar suas próprias regras de segurança e rejeitar instruções incompatíveis com o estado local.

  1. Classifique os comandos por impacto. Separar leitura de dados, conveniência e funções com possível efeito físico ajuda a definir controles proporcionais.
  2. Exija identidade e vínculo com o veículo. Não basta um token válido; confirme que aquela conta pode operar aquele veículo.
  3. Valide estado e validade temporal. Rejeite comandos expirados, repetidos ou incompatíveis com a velocidade e o estado atual.
  4. Implemente a decisão também no veículo. O gateway deve ter uma política local e uma lista explícita de comandos permitidos.
  5. Registre e monitore. Gere trilhas de auditoria para comandos aceitos e rejeitados, com proteção adequada dos dados.

Erros comuns ao desenvolver APIs para dispositivos conectados

  • Confiar que a rede privada é suficiente. Um serviço interno ainda pode receber solicitações indevidas por falhas de configuração, credenciais comprometidas ou integração mal validada. A rede não substitui autorização.
  • Usar uma permissão genérica para tudo. “Usuário autenticado” não deveria significar “pode ativar qualquer recurso”. A autorização precisa ser granular por veículo, comando e contexto.
  • Validar apenas na interface do aplicativo. Esconder um botão não impede que uma chamada seja enviada diretamente à API. A regra precisa existir no servidor e, para comandos físicos, no componente de execução.
  • Ignorar replay e expiração. Um comando antigo capturado ou repetido não deve continuar válido indefinidamente. Nonces, timestamps curtos e controle de sequência podem ajudar, dependendo do protocolo.
  • Tratar privacidade como detalhe posterior. Acesso a localização e microfone precisa de propósito definido, controles de acesso, transparência e retenção limitada desde o início do projeto.
  • Confundir criptografia com segurança completa. Criptografar a comunicação protege o transporte, mas não corrige permissões excessivas nem uma API que aceita ações sem autenticação.

Como interpretar o caso sem exagerar nem minimizar

O teste ocorreu em uma unidade da BYD Shark 6, e o relato da ABC, reproduzido pelo Olhardigital.com.br, descreve acesso remoto a várias funções. Isso merece investigação e correção pelos responsáveis, mas não permite concluir, sozinho, qual componente falhou ou quantos veículos estão expostos.

Também não devemos minimizar o risco porque os freios ficaram fora do alcance do teste. Desligar faróis, acionar limpadores ou travar portas durante o movimento já pode distrair o motorista ou criar uma situação inesperada. E o acesso ao microfone e à localização envolve privacidade, mesmo quando não há controle direto da condução.

Para equipes de software, a comparação útil não é “carro versus aplicativo”. É “sistema conectado com efeitos no mundo físico versus sistema conectado sem esses efeitos”. Quando uma API passa a controlar um dispositivo, o modelo de ameaça precisa considerar consequências físicas, modos degradados, segurança em caso de falha e limites que continuem funcionando sem conexão com a nuvem.

FAQ sobre o hack remoto da BYD Shark

O teste conseguiu controlar os freios da BYD Shark?

Não. Segundo o relato do Olhardigital.com.br, os freios e as câmeras tinham proteções mais rigorosas e não puderam ser controlados remotamente durante o teste.

O que o especialista conseguiu acionar à distância?

O teste relatou interferência nos faróis, limpadores, jato de água do para-brisa, travas das portas e central multimídia. Também foi possível ativar o microfone da cabine e acompanhar a localização do veículo.

Isso prova que todos os carros conectados são vulneráveis?

Não. O episódio descreve um teste em uma BYD Shark 6 específica. Ele reforça riscos conhecidos de sistemas conectados, mas não prova que todos os veículos ou modelos tenham a mesma falha.

Como desenvolvedores podem reduzir riscos em APIs que controlam dispositivos?

Com autenticação forte, autorização granular, validação no servidor e no dispositivo, comandos com validade curta, proteção contra repetição, limites baseados no estado do equipamento e registros de auditoria. Criptografia do transporte é necessária, mas não substitui esses controles.

O aprendizado que levo desse caso é direto: em software conectado, toda função remota precisa de um motivo para existir e de limites verificáveis. Para sistemas que interagem com o mundo físico, a autorização não pode terminar no login — ela precisa acompanhar cada comando até o componente que o executa.

Gostou? Me segue no GitHub e deixa um comentário se tiver dúvida ou quiser aprofundar algum ponto.

Y

Yuri Sousa

Front-End Developer / Designer

Desenvolvedor apaixonado por criar experiências digitais acessíveis e visualmente perfeitas. Escrevo sobre desenvolvimento web, design e tecnologia.