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:
- A abordagem usa um initrd para montar um sistema de arquivos raiz criptografado.
- 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.
- 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.
- 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:
- 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.
- 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).
- 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)
linux
encryption
sd-card
initrd
dimovnike
fonte
fonte
Respostas:
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).
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.
É 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 .
fonte
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:
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
diff
para 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.
fonte