Pular para o conteúdo
De volta ao Nymchat

Base de conhecimento Sob o capô

Verificando a compilação

O código aberto só ajuda se o código que você está executando for o código que foi publicado. O Nymchat é construído de forma determinística para que você mesmo possa verificar isso, de dentro do aplicativo ou de um terminal.

Construções reproduzíveis

Construir o aplicativo emite um build-manifest.json contendo o commit de origem, um Hash SHA-256 de cada ativo HTML, JavaScript e CSS veiculado e um único bundleHash sobre todo esse conjunto de ativos.

A saída depende apenas do conteúdo de origem — até mesmo o tempo de construção registrado é o o carimbo de data e hora do commit em vez do momento em que a compilação foi executada - portanto, qualquer pessoa que esteja reconstruindo o mesmo commit obtém arquivos idênticos em bytes e os mesmos bundleHash.

Uma ação do GitHub então reconstrói cada commit de forma independente e assina a proveniência do build atestados para o hash e o manifesto, então há um registro assinado vinculando um bundleHash para um commit no repositório, produzido por algo diferente do implantação.

O que a caixa de diálogo Sobre verifica

Sobre no cabeçalho executa a verificação ao vivo, no seu navegador.

A caixa de diálogo Sobre do Nymchat, mostrando a versão, integridade da construção e garantia do status canário.
A caixa de diálogo Sobre: ​​versão, integridade de construção, canário de garantia e uma linha direta com o desenvolvedor.

Ele busca novamente cada ativo que a página está realmente executando, faz o hash com a API Web Crypto e compara com o manifesto. Então – e esta é a parte que importa – é recalcula o bundleHash dos hashes isto apenas calculado, não de qualquer coisa que o manifesto reivindique e procure isso nos atestados assinados do repositório por meio da API GitHub.

Isso é o que impede uma implantação de garantir a si mesma: servir arquivos modificados junto com um manifesto correspondente ainda falha porque o hash recalculado não tem atestado.

StatusSignifica
&verificar; Aplicativo oficial verificado (n/n)Cada ativo corresponde, o hash do pacote recalculado é atestado pelo repositório, e a página é veiculada a partir do domínio oficial.
⚠ Versão verificada · não é o aplicativo oficialO código é genuíno e atestado, mas é um espelho de outro domínio. Um espelho não pode remover este aviso sem falhar na verificação.
✗ IncompatibilidadeUm ativo não corresponde ao que o manifesto diz.
✗ Compilação não oficialO hash do pacote recalculado não tem atestado do repositório – um manifesto feito por ele mesmo.
⚠ Proveniência inacessívelA API do GitHub não pôde ser acessada, portanto o atestado não pôde ser verificado de qualquer maneira.

Verificando você mesmo

Reconstrua o commit dos nomes da caixa de diálogo Sobre e compare:

git clone https://github.com/Spl0itable/NYM
cd NYM
git checkout <commit shown in the About dialog>
npm ci
npm run build   # prints "Build hash: <bundleHash>"

O hash impresso deve corresponder tanto ao da caixa de diálogo Sobre quanto ao do commit resumo da execução de origem de construção. Você também pode verificar a assinatura diretamente com a CLI do GitHub:

gh attestation verify dist/build-manifest.json --repo Spl0itable/NYM

Os aplicativos Android e iOS

A verificação acima é uma verificação de aplicativo da web, e vale a pena declarar claramente o motivo: um aplicativo nativo não pode fazer a mesma coisa consigo mesmo. O que é executado no seu telefone é o código de máquina compilado, não o fonte no repositório, e nada que o aplicativo possa calcular no dispositivo se relaciona com o outro.

O Android pode fazer a próxima melhor coisa. O instalado .apk é um arquivo que o aplicativo pode ler e hash, e o hash de cada lançamento publicado já é público: publicar no Zapstore assina um evento Nostr carregando o SHA-256 do APK e o SHA-256 do seu certificado de assinatura. Então o Android Sobre caixa de diálogo faz o hash do APK do qual está sendo executado, busca aqueles assinados eventos, mantém apenas aqueles assinados pela chave do desenvolvedor e compara. Mostra os dois hashes também, para que você possa repetir a verificação no dispositivo: baixe o APK publicado, execute sha256sum nele e observe você mesmo o mesmo evento.

Um aplicativo instalado do Google Play não pode ser verificado desta forma, e isso não é um sinal de que nada está errado. O Google assina cada upload com sua própria chave e constrói um APK separado para cada dispositivo, então o que aterra no seu telefone não é o arquivo produzido pelo desenvolvedor e seu hash não corresponde a nada que pudesse ser publicado. O aplicativo reconhece uma instalação do Play e diz isso em vez de relatar um fracasso. Para verificar um build você mesmo, instale o APK publicado diretamente.

iOS não pode ser verificado de forma alguma. A Apple criptografa e assina novamente cada download individualmente, portanto, um hash calculado no seu iPhone é exclusivo do seu iPhone e não corresponde a nada publicado em qualquer lugar. A caixa de diálogo Sobre diz isso abertamente, em vez de mostrar uma resposta tranquilizadora. status que não significa nada. Se você quiser um Nymchat que possa verificar no hardware da Apple, use a web app, que verifica todos os arquivos que está executando.

O que nada disso prova

Uma verificação que um aplicativo executa em si mesmo não pode provar que o aplicativo é honesto – quem o modificou poderia remover o cheque também. O que isso prova é o caso comum: que a cópia que você instalada é a cópia que foi publicada. Vale a pena ter isso porque os valores que as comparações são públicas, então alguém que não seja você pode verificá-las e discordar.

O canário mandado

Um warrant canary é uma declaração, publicada em um cronograma fixo, de que o desenvolvedor não receberam uma ordem secreta do governo que estão proibidos de divulgar - uma Carta de Segurança Nacional, uma ordem da FISA. O desenvolvedor pode ser obrigado a permanecer em silêncio sobre tal ordem, mas não pode ser obrigado a mentir, então o canário que envelhece ou desaparece é em si o sinal.

Ele vive em canary.json na raiz do repositório e é obtido diretamente do GitHub, portanto, seu histórico pode ser auditado independentemente do que o site implantado diz. A caixa de diálogo Sobre codifica-o por cores:

CorSignifica
Verde - tudo claroAssinado, atual e a assinatura corresponde à chave do desenvolvedor. Nenhuma ordem secreta foi recebida.
Amarelo - atrasado ou nem tudo claroNão foi atualizado até a data declarada ou allClear bandeira é falsa. Uma ordem silenciada não pode ser descartada.
Vermelho - assinatura inválida ou desaparecidaA assinatura não corresponde à chave do desenvolvedor ou o arquivo foi totalmente removido. Trate isso como um aviso sério.

A âncora do frescor

O canário assinado incorpora a altura e o hash mais recentes do bloco Bitcoin no momento da assinatura. Esse hash não poderia ser conhecido antes da existência do bloco, o que prova que o canário era assinado depois um ponto específico no tempo, em vez de pré-assinado em massa meses antes. A caixa de diálogo Sobre vincula a âncora a um explorador de blocos para que você possa verificá-la.