boot seguro para linux embarcado

Post on 23-Jan-2018

196 Views

Category:

Engineering

13 Downloads

Preview:

Click to see full reader

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?

top related