Pular para o conteúdo

Integridade

SRI para o script de CDN, o manifesto de uma pasta, e o manifesto assinado que denuncia a troca conjunta.

Integridade é o "I" da tríade, e o menos implementado: quase todo sistema cifra, poucos conferem. Arcane.Integridade responde três perguntas: o script da CDN é o que eu aprovei? a pasta de produção mudou desde o deploy? e quem trocou um arquivo trocou também o manifesto?

SRI — o script de terceiro#

dataforge
adopt Arcane.Integridade as I

js := "alert('Hello, world.');"
valor := I.sri(js)
out $"<script src=\"https://cdn.exemplo.com/a.js\" integrity=\"{valor}\" crossorigin=\"anonymous\"></script>"

// O exemplo da MDN — o mesmo valor que o navegador calcula.
assert valor is "sha384-H8BRh8j48O9oYatfu5AZzq6A9RINhZO5H16dQZngK7T62em8MUt1FLm52t+eX6xO"
assert not I.conferir_sri(js + " ", valor)

O manifesto de uma pasta#

dataforge
adopt Arcane.Integridade as I
adopt Arcane.IO as IO
adopt Arcane.OS as OS

app := $"{OS.temp_dir()}/df-int-{randint(100000, 999999)}"
IO.mkdir(app)
IO.write($"{app}/main.df", "out 1")
IO.write($"{app}/config.toml", "porta = 8080")

chave := "mora-fora-desta-maquina-000"
assinado := I.assinar_manifesto(I.manifesto(app), chave)

// ... depois do deploy, alguem mexe:
IO.write($"{app}/main.df", "out 2")
IO.write($"{app}/porta-dos-fundos.df", "out 3")

r := I.conferir_manifesto(app, assinado["arquivos"])
out r
assert r["alterados"] is ["main.df"] and r["acrescentados"] is ["porta-dos-fundos.df"]

// E quem troca o arquivo e o manifesto JUNTOS e pego pela assinatura.
forjado := assinado with {}
forjado["arquivos"] := I.manifesto(app)
assert not I.verificar_manifesto(forjado, chave)
IO.remove_tree(app)
DecisãoSem ela
caminho relativo e com /o manifesto do Windows não confere no Linux
link simbólico não é seguidoo manifesto descreve arquivos de fora da pasta
a assinatura usa uma chave que mora foraquem troca o arquivo troca o manifesto junto, e ele continua batendo
comparação em tempo constantea assinatura é descoberta pelo tempo de resposta

Continue em Cadeia de suprimentos e Arcane.Integridade.