Boot Seguro para Linux Embarcado

37
bruno@bruno:~$ echo 2^1024 | bc 17976931348623159077293051907890247336179769789423065727343008115773\ 26758055009631327084773224075360211201138798713933576587897688144166\ 22492847430639474124377767893424865485276302219601246094119453082952\ 08500576883815068234246288147391311054082723716335051068458629823994\ 7245938479716304835356329624224137216 Boot Seguro

Transcript of Boot Seguro para Linux Embarcado

Page 1: Boot Seguro para Linux Embarcado

bruno@bruno:~$ echo 2^1024 | bc17976931348623159077293051907890247336179769789423065727343008115773\26758055009631327084773224075360211201138798713933576587897688144166\22492847430639474124377767893424865485276302219601246094119453082952\08500576883815068234246288147391311054082723716335051068458629823994\7245938479716304835356329624224137216

Boot Seguro

Page 2: Boot Seguro para Linux Embarcado

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

Page 3: Boot Seguro para Linux Embarcado

Problema

Personagens:

- Ana (desenvolvedor, fabricante do hardware)

- Beto (usuário, cliente da Ana)

- Caio (atacante mal-intencionado)

3

Page 4: Boot Seguro para Linux Embarcado

Problema

4

Page 5: Boot Seguro para Linux Embarcado

Problema

5

Page 6: Boot Seguro para Linux Embarcado

FlashCode A:

MysecurecodeMysecurecodeMysecurecodeMysecurecodeMysecurecode VIRUS

Problema?

MPU

RAM

6

Page 7: Boot Seguro para Linux Embarcado

Problema?

MPU

RAM

FlashCode A:

NON secureNON secureNON secureNON secureNON secureNON secure

7

Page 8: Boot Seguro para Linux Embarcado

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

Page 9: Boot Seguro para Linux Embarcado

Processo de boot

MPU

RAM

FlashCode A:

MysecurecodeMysecurecodeMysecurecodeMysecurecodeMysecurecodeMysecurecode

CORE

SRAM

ROM

Boot Select

9

Page 10: Boot Seguro para Linux Embarcado

Processo de boot

MPU

RAM

FlashCode A:

MysecurecodeMysecurecodeMysecurecodeMysecurecodeMysecurecodeMysecurecode

CORE

SRAM

ROM

Boot Select

ROM

10

Page 11: Boot Seguro para Linux Embarcado

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

Page 12: Boot Seguro para Linux Embarcado

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

Page 13: Boot Seguro para Linux Embarcado

Criptografia Simétrica

- Chave única, idêntica dos dois lados.- Deve ser "combinada" previamente.- Cálculos muito rápidos.

13

Page 14: Boot Seguro para Linux Embarcado

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

Page 15: Boot Seguro para Linux Embarcado

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

Page 16: Boot Seguro para Linux Embarcado

Boot seguro

Page 17: Boot Seguro para Linux Embarcado

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

Page 18: Boot Seguro para Linux Embarcado

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

Page 19: Boot Seguro para Linux Embarcado

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

Page 20: Boot Seguro para Linux Embarcado

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

Page 21: Boot Seguro para Linux Embarcado

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

Page 22: Boot Seguro para Linux Embarcado

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

Page 23: Boot Seguro para Linux Embarcado

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

Page 24: Boot Seguro para Linux Embarcado

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

Page 25: Boot Seguro para Linux Embarcado

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

Page 26: Boot Seguro para Linux Embarcado

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

Page 27: Boot Seguro para Linux Embarcado

Implementação em um processador comercial *

Page 28: Boot Seguro para Linux Embarcado

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

Page 29: Boot Seguro para Linux Embarcado

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

Page 30: Boot Seguro para Linux Embarcado

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

Page 31: Boot Seguro para Linux Embarcado

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

Page 32: Boot Seguro para Linux Embarcado

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

Page 33: Boot Seguro para Linux Embarcado

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

Page 34: Boot Seguro para Linux Embarcado

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

Page 35: Boot Seguro para Linux Embarcado

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

Page 36: Boot Seguro para Linux Embarcado

Formato típico gerado para boot seguro

Disponível em NXP AN4581: http://cache.nxp.com/files/32bit/doc/app_note/AN4581.pdf

36

Page 37: Boot Seguro para Linux Embarcado

OBRIGADO! Perguntas?