boot seguro para linux embarcado
TRANSCRIPT
bruno@bruno:~$ echo 2^1024 | bc17976931348623159077293051907890247336179769789423065727343008115773\26758055009631327084773224075360211201138798713933576587897688144166\22492847430639474124377767893424865485276302219601246094119453082952\08500576883815068234246288147391311054082723716335051068458629823994\7245938479716304835356329624224137216
Boot Seguro
Números Grandes
- Pessoas no mundo: ~ 2^33- Células no corpo humano: ~ 2^33- Atomos no corpo humano: ~ 2^81- Grãos de areia na terra: ~ 2^63- Estrelas no universo: ~ 2^69- Átomos no universo: ~ 2^246
Tamanho de uma chave simétrica considerada segura: 2^128
Tempo estimado para um super-computador quebrar esta chave por força bruta: > 10^21 anos! Ou, 1 000 000 000 000 000 000 000 anos!
2
Problema
Personagens:
- Ana (desenvolvedor, fabricante do hardware)
- Beto (usuário, cliente da Ana)
- Caio (atacante mal-intencionado)
3
Problema
4
Problema
5
FlashCode A:
MysecurecodeMysecurecodeMysecurecodeMysecurecodeMysecurecode VIRUS
Problema?
MPU
RAM
6
Problema?
MPU
RAM
FlashCode A:
NON secureNON secureNON secureNON secureNON secureNON secure
7
Agenda
1) Números grandes2) Problema3) Introdução
a) Processo normal de bootb) Criptografia
4) Boot seguroa) Assinadob) Encriptadoc) Outros conceitos
5) Chain of Trust6) Implementação em um processador
8
Processo de boot
MPU
RAM
FlashCode A:
MysecurecodeMysecurecodeMysecurecodeMysecurecodeMysecurecodeMysecurecode
CORE
SRAM
ROM
Boot Select
9
Processo de boot
MPU
RAM
FlashCode A:
MysecurecodeMysecurecodeMysecurecodeMysecurecodeMysecurecodeMysecurecode
CORE
SRAM
ROM
Boot Select
ROM
10
Boot Seguro
Para o boot ocorrer de maneira segura:
1) A imagem deve estar íntegra.2) A imagem deve ter sido "assinada" pelo desenvolvedor.3) Só pode bootar de imagens geradas e gravadas na fonte.4) Os passos do processo de boot devem ser configuráveis.5) A imagem pode, ou não, estar criptografada.
Como?
Criptografia!
11
Criptografia
A criptografia se baseia em modelos matemáticos.
Importantes para o boot seguro:
- Criptografia Simétrica (AES)- Criptografia Assimétrica (RSA)- Resumo Criptográfico (SHA)
12
Criptografia Simétrica
- Chave única, idêntica dos dois lados.- Deve ser "combinada" previamente.- Cálculos muito rápidos.
13
Criptografia Assimétrica
- Cada lado tem um par de chaves: pública, privada.- Não há necessidade de "combinar" a chave previamente.- Cálculo matemático lento: exponencial.
Chave Privada Ana
Chave Pública Ana
14
Criptografia - Resumo (Hash)
- Oferece um resumo dos dados, integridade.- Muito difícil encontrar outro dado que dê o mesmo resumo.- Não necessita de chave, qualquer um pode calcular obtendo o mesmo
resultado.
Hash = 10! Hash = 10?Integro!
15
Boot seguro
Boot Seguro - Passo a Passo
Problema 1 : Integridade dos dados.
FlashCode A:
MysecurecodeNot my codeMysecurecodeMysecurecodeMysecurecodeMysecurecode
FlashCode A:
MysecurecodeMysecurecodeMysecurecodeMysecurecodeMysecurecodeMysecurecode
ANA:
Resumo A
FlashCode A:
MysecurecodeMysecurecodeMysecurecodeMysecurecodeMysecurecodeMysecurecode
BETO:
Resumo A Resumo B== ?
CAIO:
17
Boot Seguro - Passo a Passo
Problema 2: Assinatura digital.
FlashCode A:
MysecurecodeMysecurecodeMysecurecodeMysecurecodeMysecurecodeMysecurecode
ANA:
Resumo A
FlashCode A:
MysecurecodeMysecurecodeMysecurecodeMysecurecodeMysecurecodeMysecurecode
BETO:
Resumo B
CAIO:
Resumo C Priv.
FlashCode A:
MysecurecodeNot my codeMysecurecodeMysecurecodeMysecurecodeMysecurecode
Assinatura ANA
Ch. Pública ANA
FlashCode A:
MysecurecodeMysecurecodeMysecurecodeMysecurecodeMysecurecodeMysecurecode
ANA:
Assinatura ANA
Ch. Pública ANA
Assinatura ANA
Ch. Pública ANA
Resumo A == ? 18
Boot Seguro - Passo a Passo
Problema 3: Só bootar de imagens geradas por ANA.
FlashCode A:
MysecurecodeMysecurecodeMysecurecodeMysecurecodeMysecurecodeMysecurecode
ANA:
Resumo A
FlashCode A:
MysecurecodeMysecurecodeMysecurecodeMysecurecodeMysecurecodeMysecurecode
BETO:
Resumo B
CAIO:
Priv.
FlashCode A:
MysecurecodeNot my codeMysecurecodeMysecurecodeMysecurecodeMysecurecode
Assinatura ANA
Ch. Pública ANA
FlashCode A:
MysecurecodeMysecurecodeMysecurecodeMysecurecodeMysecurecodeMysecurecode
ANA:
Assinatura ANA
Ch. Pública ANA
Assinatura ANA
Ch. Pública ANA
Resumo A == ?
Assinatura CAIO
Ch. Pública CAIO
Ch. Pública ANA
Resumo Ch Pub ANA
Resumo Ch Pub ANA "B"
Resumo Ch Pub ANA
== ?
19
Boot Seguro - Passo a Passo
4) Adicionando flexibilidade.
FlashCode A:
MysecurecodeMysecurecodeMysecurecodeMysecurecodeMysecurecodeMysecurecode
ANA:
Resumo 1
FlashCode A:
MysecurecodeMysecurecodeMysecurecodeMysecurecodeMysecurecodeMysecurecode
BETO:
Resumo B
Priv.Assinatura1 ANA
Ch. Pública1 ANA
FlashCode A:
MysecurecodeMysecurecodeMysecurecodeMysecurecodeMysecurecodeMysecurecode
ANA:
Assinatura1 ANA
Ch. Pública1 ANA
Resumo 1
== ?
Ch. Pública1 ANA
Resumo Ch Pub ANA 1 e 2
Resumo Ch Pub ANA 1 e 2 "B"
Resumo Ch Pub ANA 1 e 2
== ?
Comandos de Boot
Resumo 2
Assinatura2 ANA
Ch. Pública2 ANA
Assinatura2 ANA
Ch. Pública2 ANA
Assinatura1 ANA
Ch. Pública1 ANA
Comandos de Boot
Ch. Pública2 ANA+
Assinatura2 ANA
Ch. Pública2 ANA
Comandos de Boot
Resumo 2
Resumo C
== ?
20
Boot Seguro (Revisão)Para o boot ocorrer de maneira segura:
1) A imagem deve estar íntegra.a) ANA gera e envia um resumo criptográfico.
2) A imagem deve ter sido "assinada" pelo desenvolvedor.a) ANA assina o resumo com sua chave privada, e envia sua chave pública junto com a imagem.
3) Só pode bootar de imagens geradas e gravadas na fonte.a) Par de chaves público e privada do desenvolvedor (ANA).b) O processador (BETO) deve poder checar que ANA é a ANA.
i) Resumo criptogáfico da chave pública da ANA.
4) Os passos do processo de boot devem ser configuráveis.5) A imagem pode, ou não, estar criptografada.
a) Se for o caso, AES128
21
Boot encriptado
FlashCode A:
MysecurecodeMysecurecodeMysecurecodeMysecurecodeMysecurecodeMysecurecode
Assinatura2 ANA
Ch. Pública2 ANA
Assinatura1 ANA
Ch. Pública1 ANA
Comandos de Boot
Chave AES (1)
Chave AES Cifrada
Chave única por processador (2)
1+2
Chave AES (1)
Flash
Imagem encriptada
Assinatura2 ANA
Ch. Pública2 ANA
Assinatura1 ANA
Ch. Pública1 ANA
Chave AES Cifrada
1+2
ANA:
1+2
Chave única por processador (2)
+
=
Chave AES (1)
+
Priv. ANA
Ch. Pública1 ANA
=Chave AES Cifrada
BETO:
22
Comandos de boot
- Seleção de protocolos de segurança.- Assinatura (RSA 1024, 2048, ECC)- Hash (SHA128, 256)- Cifra (AES)
- Endereços das assinaturas e certificados.- Seleção de recursos do processador de maneira segura.- Ordem dos cálculos.- Lógica de checagem do hash dos certificados.
23
Múltiplas assinaturas
- É possível checar assinatura de diversos objetos (regiões).- Exemplos:
- U-boot- Kernel, Device Tree- Outros binários (cores secundários, GPU, WiFi, etc)- Rootfs (boot pode ficar demorado)
- Cada novo objeto, gera um par de chaves:- Chave privada, para a assinatura, “na fábrica”.
- Chave pública, em formato de certificado digital, a ser copiada junto com a imagem para a
execução do processo de boot.
- Geralmente, para cada produto é criado um conjunto de novas chaves.- Quanto mais pares de chaves, mas seguro é o processo geral.
24
Gravação em fusíveis
Algumas configurações do boot seguro devem ser, na fábrica, gravadas em fusíveis internos do processador, e bloqueados para gravações futuras:
- Fonte de boot- Parâmetros de boot- Hash das chaves públicas
Estes fusíveis devem ser gravados em fábrica, atravéz de ferramentas disponibilizadas pelo fabricante.
- Os dados podem ser gravados via u-boot, ou via programa rodando no PC com link serial (USB) com a placa.
25
Chain of
Trust
- O Hardware se encarrega de carregar uma imagem inicial de boot loader de maneira segura.
- O boot loader ou o hardware, “bootam” o kernel de maneira segura.- O kernel, por sua vez, se encarrega de montar o rootfs e mantê-lo de maneira
segura.
Corrente de confiança (Chain of Trust)
u-boot
kernel
rootfs
Hardware
Boot seguro
26
Implementação em um processador comercial *
Ferramentas necessárias
Familia estudada: i.MX6 da NXP, utilizando o HABv4 (High Assurance Boot).
- Gerador de certificados, responsável por gerar:- Par de chaves público/privada- Certificados digitais- Hash a ser gravado nos fusíveis
- Assinador de código, responsável por:- Calcular o resumo do binário em questão- Assinar o resumo com a chave privada- Concatenar o resultado com os certificados necessários
- Exemplo de comandos de boot seguro- Ferramenta para gravação dos fusíveis, em fábrica
28
Distribuição de certificados e chavesCertificado
mestre
Produto 1
Certificado Pai 1
Certificado Filho 1-1
Certificado Filho 1-2
Certificado Filho 1-3
Produto 2
Certificado Pai 2
Certificado Filho 2-1
Certificado Filho 2-2
Certificado Filho 2-3
Produto n
n
n
n
n
Tabela de chaves e
certificados
29
Gerando as chavesbruno@bruno:~/CST-CodeSigningTool/cst-2.3.2/keys$ .
/hab4_pki_tree.sh
Do you want to use an existing CA key (y/n)?: n
Do you want to use Elliptic Curve Cryptography (y/n)?: n
Enter key length in bits for PKI tree: 2048
Enter PKI tree duration (years): 10
How many Super Root Keys should be generated? 1
Do you want the SRK certificates to have the CA flag set? (y/n)?:
y
+++++++++++++++++++++++++++++++++++++
+ Generating CA key and certificate +
+++++++++++++++++++++++++++++++++++++
Generating a 2048 bit RSA private key
writing new private key to 'temp_ca.pem'
++++++++++++++++++++++++++++++++++++++++
+ Generating SRK key and certificate 1 +
++++++++++++++++++++++++++++++++++++++++
Generating RSA private key, 2048 bit long modulus
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'SRK1_sha256_2048_65537_v3_ca'
Certificate is to be certified until Jun 27 16:14:55 2026 GMT
(3650 days)
++++++++++++++++++++++++++++++++++++++++
+ Generating CSF key and certificate 1 +
++++++++++++++++++++++++++++++++++++++++
Generating RSA private key, 2048 bit long modulus
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'CSF1_1_sha256_2048_65537_v3_usr'
Certificate is to be certified until Jun 27 16:14:56 2026 GMT
(3650 days)
++++++++++++++++++++++++++++++++++++++++
+ Generating IMG key and certificate 1 +
++++++++++++++++++++++++++++++++++++++++
Generating RSA private key, 2048 bit long modulus
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'IMG1_1_sha256_2048_65537_v3_usr'
Certificate is to be certified until Jun 27 16:14:56 2026 GMT
(3650 days)
30
Gerar a tabela de chavesbruno@bruno:~/CST-CodeSigningTool/cst-2.3.2/keys$ ../linux64/srktool --help
Usage:
To generate SRK Table data and the SRK Table hash for HAB4
==========================================================
srktool --hab_ver <version> --table <tablefile> --efuses <efusefile>
--digest <digestalg> --certs <srk>,%<srk>,...
[--fuse_format <format>] [--license]
-h, --hab_ver <version>:
HAB Version - set to 4 for HAB4 SRK table generation
-t, --table <tablefile>:
Filename for output SRK table binary file
-e, --efuses <efusefile>:
Filename for the output SRK efuse binary file containing the SRK table hash
-d, --digest <digestalg>:
Message Digest algorithm. Either sha1 or sha256
-c, --certs <srk1>,<srk2>,...,<srk4>:
X.509v3 certificate filenames.
-f, --fuse_format <format>:
Optional, Data format of the SRK efuse binary file.
-l, --license:
Optional, displays program license information. 31
Extrair os valores dos fusíveis
bruno@bruno:~/CST-CodeSigningTool/cst-2.3.2/keys$ hexdump -e '/4 "0x"' -e '/4 "%X""\n"'
SRK_1_2_3_4_fuse.bin
0xF2E90790
0x33472527
0x65452D17
0xD52CEB6C
0x3A0B28B5
0x1016780D
0xEF1F296
0x5CAD4836
- No u-boot, pode-se usar o comando fuse prog para programar os fusíveis:
fuse prog <bank> <word> <value>
Ex.:
fuse prog 3 0 0xF2E9079032
Montagem dos comandos de bootSimilar a um arquivo XML, contém os comandos e passos de boot.
#Illustrative Command Sequence File Description
[Header]
Version = 4.1
Hash Algorithm = sha256
Engine = ANY
Engine Configuration = 0
Certificate Format = X509
Signature Format = CMS
[Install SRK]
File = “../crts/SRK_1_2_3_4_table.bin”
...
[Install CSFK]
File = “../crts/CSF1_1_sha256_2048_65537_v3_usr_crt.pem”
...
[Authenticate CSF]
...
[Install Key]
File= ”../crts/IMG1_1_sha256_2048_65537_v3_usr_crt.pem”
...
[Authenticate Data]
...33
Preparando a imagem
- Gerar o CST (binário) a partir do arquivo CST de entrada ("XML"):- ./cst -–o csf-uboot.bin < csf-uboot
- Concatenar o CST à imagem do u-boot:- cat u-boot.imx csf-uboot.bin > u-boot-signed.imx
- Depois do boot, no u-boot, checar o estado do boot:- hab_status
- Queimar os últimos fusíveis
34
Formato típico gerado para boot seguro
Binário do u-boot (uB)
Assinatura uB
Certificado uB
Certificado CB
Assinatura CB
Comandos de Boot (CB)
Assinatura LK
Certificado LK
Linux Kernel (LK)
dtb
rootfs
35
Formato típico gerado para boot seguro
Disponível em NXP AN4581: http://cache.nxp.com/files/32bit/doc/app_note/AN4581.pdf
36
OBRIGADO! Perguntas?