Demonstração do autoatualizador escrita em C++. Inclui ferramentas de carregador, cliente, servidor e assinatura para fornecer atualizações automáticas com segurança para aplicativos de desktop Win32.
Os aplicativos de desktop Win32 nativos não têm o luxo de um gerenciador de pacotes integrado ao sistema para lidar com atualizações automáticas. Esta estrutura fornece uma demonstração prática de como entregar e processar atualizações de forma segura e eficiente.
Um sistema com atualização automática deve satisfazer as metas de segurança de integridade e autenticidade. Esta estrutura usa chaves RSA de 4.096 bits para assinar e verificar a assinatura SHA-256 para os dados de atualização. A chave pública é incorporada ao binário do cliente para verificação. Supondo que a entrega inicial do software seja feita por uma fonte confiável, os únicos emissores válidos para atualizações são aqueles com acesso à chave privada.
Os dados de atualização são transmitidos por UDP. O principal fator nesta decisão foi reduzir a sobrecarga de memória do servidor proveniente de conexões TCP (com carga reduzida da CPU como bônus). A sobrecarga de memória esperada é aproximadamente:
(Update File Size) + (Max Connections) * 80 bytes
Os dados de atualização são armazenados diretamente na memória para evitar acesso ao disco. O cliente e o servidor verificam a propriedade do IP trocando tokens criptográficos de 64 bits. Cada conexão recebe uma quantidade limitada de largura de banda de rede antes de ser limitada. Cada endereço IP é limitado a um número máximo de conexões simultâneas. Esses recursos atenuam vários ataques comuns à rede:
A prevenção de ataques man-in-the-middle depende das garantias de autenticidade do sistema de atualização.
Nenhuma função criptográfica pesada precisa ser executada no servidor (como em HTTPS), pois a confidencialidade não é uma meta de segurança para atualizações de software – os dados de atualização não são confidenciais.
Nenhum esforço é feito por parte do cliente para limitar a velocidade de download. A integração em seu aplicativo deve fazer esforços para ajustar dinamicamente a taxa de envio com base nos pacotes descartados e na latência da conexão.
A arquitetura do servidor de demonstração é executada em uma única porta/thread único. Várias instâncias de servidor podem ser executadas por thread em portas ou sistemas diferentes (com a negociação ocorrendo em um balanceador de carga ao qual o cliente se conectaria primeiro (para entrega de atualização em grande escala).
Os dados de atualização são enviados para um único arquivo no estado em que se encontram. Se você precisar de suporte para correção de vários arquivos, atualizações delta ou compactação, você deve entregar um executável com os utilitários e dados para lidar com esses recursos (e dissociá-lo do próprio sistema de atualização).
As garantias de segurança só são válidas enquanto a chave privada permanecer segura. Nenhum método de revogação de chave é fornecido com a estrutura (pois exigiria verificação externa e confiança de outro provedor).
updater.sln
.Release
.client.dll
para update.dll
signtool.exe
para gerar pub.h
, pub.key
, pri.key
e update.sig
.public_key
em client_updater.cpp
pelo conteúdo do pub.h
gerado.server.exe
e loader.exe
para demonstrar a atualização.