Capítulo 28 — Criptografia e serviços de confiança: implementação I
Mapa da aula
Aula 28 publicada. Mapa, exemplo, EX082.
flowchart TD
N0["28.1 O caminho de atualização do firmware"]
N1["Laboratório — Verificação do manifesto"]
N2["28.2 Ler a verificação do manifesto"]
N3["28.3 Detalhes de integração"]
N4["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4
N4 --> EX["Exemplo resolvido"]
EX --> Q["Exercício EX082"]
Desenho lógico
flowchart LR
N0["28.1 O caminho de atualização do firmware"]
N1["Laboratório — Verificação do manifesto"]
N2["28.2 Ler a verificação do manifesto"]
N3["28.3 Detalhes de integração"]
N4["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4 --> Q["EX082"]
[28.1 O caminho de atualização do firmware]
|
v
[Laboratório — Verificação do manifesto]
|
v
[28.2 Ler a verificação do manifesto]
|
v
[28.3 Detalhes de integração]
|
v
[Síntese]
|
v
[Exemplo resolvido] --> [Exercício EX082]
Objetivos de aprendizagem
Você vai (1) implementar a verificação do firmware com um manifesto de hashes e uma assinatura; (2) explicar por que o manifesto precisa ser assinado; (3) integrar a verificação ao processo de atualização.
28.1 O caminho de atualização do firmware
Aiyana implementa a primeira parte do caminho de atualização do firmware. O sistema de build produz uma imagem e um manifesto que contém a versão e o digest SHA-256 da imagem. O manifesto é assinado com a chave de assinatura intermediária. Os medidores baixam os dois, verificam a assinatura do manifesto contra a cadeia embutida de raiz e intermediária, conferem que a versão é mais nova e depois calculam o hash da imagem e o comparam com o digest do manifesto. Só se todas as verificações passarem o medidor grava a imagem no seu slot inativo e reinicia a partir dele.
Laboratório — Verificação do manifesto
"""Verify a synthetic firmware image against a SHA-256 manifest before install (FIPS 180-4)."""
import hashlib
IMAGE = b"RIDGEWAY-METER-FW v3.2.1\n" + bytes(range(256)) * 4
MANIFEST = {"version": "3.2.1", "sha256": hashlib.sha256(IMAGE).hexdigest()}
def check(img):
return hashlib.sha256(img).hexdigest() == MANIFEST["sha256"]
def main():
print("manifest digest", MANIFEST["sha256"][:20], "...")
print("intact image accepted:", check(IMAGE))
bad = bytearray(IMAGE); bad[100] ^= 1
print("one flipped bit accepted:", check(bytes(bad)))
print("note: the manifest itself must be signed, or an attacker swaps both")
if __name__ == "__main__":
main()
Execute com python3 lab_manifest.py. Saída verificada:
manifest digest 29de505e903e58072161 ...
intact image accepted: True
one flipped bit accepted: False
note: the manifest itself must be signed, or an attacker swaps both
28.2 Ler a verificação do manifesto
O laboratório calcula o digest SHA-256 de uma imagem sintética e o guarda num manifesto. A imagem intacta é aceita; inverter um único bit faz a verificação falhar, ilustrando a propriedade de avalanche dos hashes do FIPS 180-4. A última linha do laboratório enuncia a lição principal: um hash sozinho prova apenas que a imagem coincide com o manifesto. Um atacante que consiga substituir tanto a imagem quanto um manifesto não assinado vence com facilidade. É a assinatura sobre o manifesto, feita com ECDSA ou Ed25519 numa biblioteca avaliada, que vincula o digest à Ridgeway.
28.3 Detalhes de integração
Aiyana trata dos detalhes práticos. Os medidores mantêm dois slots de firmware, para que uma atualização que falhe possa voltar à versão anterior sem inutilizar o aparelho. A verificação acontece antes da gravação e de novo na inicialização. Imagens grandes têm o hash calculado em blocos, para caber na memória do medidor, usando o método de atualização incremental do hashlib. Os medidores reportam a versão instalada e o resultado da verificação, alimentando a medida de sucesso do firmware do Capítulo 20. Ela documenta que a verificação de assinaturas usa no medidor a biblioteca certificada do fornecedor, e não o código dela. Os relatos de verificações que falharam vão para o sistema de alertas descrito anteriormente.
Exemplo resolvido
Aiyana implementa a verificação baseada em manifesto, com assinatura, verificação de versão, dois slots e nova verificação na inicialização, e mostra que um único bit invertido faz o hash falhar.
Caso sintético. A imagem e o manifesto são inventados; o FIPS 180-4 é real.
Erros e limites
Um hash sem assinatura não autentica nada diante de um atacante ativo. Os dois slots precisam de proteção contra rollback, para que os atacantes não consigam forçar versões antigas.
Exercícios
-
EX082 — Ordem das verificações. Liste as verificações que um medidor faz antes de instalar o firmware. Rubrica: 3 = cadeia de assinatura do manifesto, versão mais nova, hash da imagem igual ao do manifesto;; 2 = duas;; 1 = uma;; 0 = nenhuma.
-
EX083 — Bit invertido. O que aconteceu quando um bit foi invertido? Rubrica: 3 = a imagem foi rejeitada (accepted: False);; 2 = rejeitada;; 1 = aceita;; 0 = nenhuma.
-
EX084 — Manifesto não assinado. Por que o manifesto precisa ser assinado? Rubrica: 3 = do contrário, um atacante troca a imagem e o manifesto juntos;; 2 = troca;; 1 = não é preciso;; 0 = nenhuma.
Síntese
A verificação do firmware liga um hash da imagem a um manifesto assinado, conferido antes da instalação e na inicialização, com slots seguros de reversão.
Continue estudando — aula 28 (capítulo 28 de 50)
← Capítulo 27 · Índice das aulas · Capítulo 29 →
Continue para a próxima aula já escrita.