Quão fácil é quebrar a seguinte proteção contra cópia? [fechadas]

11

Estou tentando proteger alguns trabalhos, que é um cartão SD inicializável, inicializando um kernel Linux no dispositivo ARM (Raspberry Pi). Estou usando esta abordagem:

  1. A abordagem usa um initrd para montar um sistema de arquivos raiz criptografado.
  2. O initrd gera a senha do sistema de arquivos de acordo com o CID do cartão SD. (uma função hash é usada, ainda não decidiu sobre md5 ou sha1). O Initrd tentará montar o sistema de arquivos usando a senha gerada.
  3. Agora, aqui está a parte mais interessante / suspeita: O initrd em si é criptografado usando uma função C personalizada, basicamente cada byte é XOR usando um gerador pseudo-aleatório personalizado. O kernel é modificado para ter a mesma função de criptografia, que funciona como decodificador.
  4. O sistema em si é simplificado, portanto não há como usar um teclado ou armazenamento externo. Um único aplicativo é executado em tela cheia.

Portanto, depois que o carregador de inicialização carrega o kernel e o initrd, o kernel descriptografa o initrd e executa seu script init, que irá gerar a senha e montar o sistema de arquivos raiz.

Minha pergunta é: Quão fácil seria interromper essa configuração (descriptografar o sistema de arquivos raiz e inicializá-lo a partir de qualquer cartão SD)? Quais são as partes mais fracas? Quão fácil é descompilar o kernel e encontrar essas funções de criptografia personalizadas?

EDIT: Aqui estão algumas correções para que você não perca tempo com as coisas óbvias:

  1. O dispositivo raiz será criptografado com LUKS (aes256) e a chave será gerada por alguma função HMAC usando o CID do cartão SD e um pouco de sal.
  2. O algoritmo pseudo-aleatório para criptografia initramfs será de fato RC4, apenas a chave será gerada usando alguma função personalizada, porque se eu apenas armazenar a chave em uma matriz de bytes, será mais fácil recuperá-la (sim, isso é segurança através da obscuridade) mas parece não haver outro caminho).
  3. Entendo que, se estiver usando um emulador de cartão SD, alguém pode iniciar uma cópia deste sistema, mas tudo bem comigo, porque é muito difícil e ninguém pode fazer isso. (Também ninguém quer lidar com emuladores)
dimovnike
fonte
Onde estão armazenados o kernel e o initrd?
User1686
Todos são armazenados em um único cartão SD. Ambos em arquivos separados. Armazenado como de costume em / boot.
dimovnike

Respostas:

7

Quão fácil seria interromper essa configuração (descriptografar o sistema de arquivos raiz e inicializá-lo a partir de qualquer cartão SD)?

O quão difícil é "interromper" sua configuração depende do número de bits de entropia em qualquer método que você esteja usando para assinar / criptografar o próprio sistema de arquivos (pois isso determina o número total de combinações únicas que podem ser usadas para força bruta a senha).

Quais são as partes mais fracas?

Sem dúvida, usando um CID predefinido como senha e também uma função de geração de números pseudoaleatórios personalizada.

O CID de um cartão SD deve ser apenas de leitura, mas não é incomum encontrar dispositivos de memória flash não compatíveis nos dias de hoje. Algumas pessoas até demonstraram a capacidade de substituir o CID com determinados cartões SD. Isso tornaria mais fácil forçar a senha com força bruta, especialmente se alguém estiver apenas emulando um cartão SD após a clonagem da sua (que é outra coisa que você pode querer considerar).

Finalmente, o uso de qualquer tipo de gerador de números pseudo-aleatórios já possui algumas falhas intrínsecas, justamente porque não são aleatórios - há uma razão para isso ser chamado de pseudo-aleatório . Talvez seja melhor usar um gerenciador de inicialização criptografado pré-fabricado (como TrueCrypt ou LUKS, que funciona no Raspberry Pi) e evite fazer modificações manuais no kernel.

Quão fácil é descompilar o kernel e encontrar essas funções de criptografia personalizadas?

É muito difícil descompilar qualquer coisa. Por outro lado, a desmontagem de um aplicativo compilado geralmente é trivial e existem muitas ferramentas que podem ser usadas para auxiliar na montagem de engenharia reversa de volta para outra linguagem de nível superior. Se um invasor tiver acesso até a um kernel compilado, analisar algo como um gerador de números pseudo-aleatórios provavelmente será trivial, a menos que o código seja ofuscado de propósito.


TL, DR : não reinvente a roda quando se trata de criptografia e segurança, fique com o que foi testado e verdadeiro. Existem várias opções de criptografia de disco completo que já estão disponíveis e demonstraram funcionar bem no Raspberry Pi. Eu evitaria usar o CID do cartão SD como um tipo de "senha" - mesmo que não possa ser alterado, existem maneiras de falsificar esse valor.

A proteção contra cópia já está incluída na especificação do cartão SD como CPRM .

Avanço
fonte
obrigado pela resposta. Eu sei sobre o CPRM, mas suas especificações são fechadas com a NDA e custam muito dinheiro (pelo que pesquisei no Google). Quanto ao LUKS e ao Truecrypt, estes requerem a chave inserida na inicialização manualmente. Se eu modificar o carregador de inicialização TrueCrypt para gerar a chave do CID usando alguma função hmac, será melhor que isso? Eu também entendo que isso pode ser feito com o emulador de cartão SD, mas tudo bem para mim, esse é o grau de dificuldade conveniente para os piratas. (Eu entendo aqui é nenhuma proteção 100%, enquanto a chave é autônoma no dispositivo)
dimovnike
@ user2021201 de fato era isso que eu estava tentando levar você. Seria provavelmente ser bastante fácil de modificar o bootloader Truecrypt a partir da fonte, embora eu não tenho certeza de como seria difícil obter o CID de um bootloader (desde que você não tem um sistema operacional carregado para consultar as especificações do cartão SD de ) No entanto, se você conseguiu, provavelmente seria uma solução aceitável e suficiente para suas necessidades.
Revelação
1

Alguém habilidoso não teria muita dificuldade em resolver isso. Seria relativamente fácil inicializar o cartão SD em um emulador e apenas ler as chaves da RAM. Em seguida, eles postam uma versão sem a proteção contra cópia no Pirate Bay (etc.), e é isso.

Como alternativa, use o emulador para injetar código de shell no sistema emulado em execução. Em seguida, use o sistema em execução para copiar os rootfs descriptografados (ou ler as chaves usando dmsetup table --showkeys, etc.)

Uma pesquisa rápida mostra a existência de emuladores do Raspberry Pi ; portanto, parte do trabalho já foi concluída.

Você tem outro problema, em particular este:

O kernel é modificado para ter a mesma função de criptografia, que funciona como decodificador.

Qualquer pessoa para quem você distribuir isso terá direito ao código fonte do kernel, nos termos da GPL. Para não precisar desmontá-lo, basta usar diffpara encontrar a função extra.

(Não que seja difícil encontrá-lo através da desmontagem, como você pode, por exemplo, verificar um kernel padrão)

Eu não estou completamente familiarizado com o código de inicialização do Raspberry Pi, mas se você puder atualizar o carregador de inicialização com uma chave criptográfica incorporada (que depois é passada para o kernel), isso pelo menos não estaria no cartão SD, por isso ' d frustrou uma tentativa de inicializá-lo em um emulador.

derobert
fonte
sim, eu estou ciente dos problemas de licenciamento, ainda estou procurando maneiras de deixar o kernel intacto e até mudar para o kernel do FreeBSD, mas por enquanto vamos discutir apenas os problemas técnicos. A idéia do gerenciador de inicialização é muito interessante, mas não consegui encontrar uma maneira de implementar isso, aparentemente não existe.
dimovnike