C++ で書かれたセルフアップデーターのデモ。 Win32 デスクトップ アプリケーションの自動更新を安全に配信するためのローダー、クライアント、サーバー、署名ツールが含まれています。
ネイティブ Win32 デスクトップ アプリケーションには、自動更新を処理するためのシステム統合パッケージ マネージャーの余裕がありません。このフレームワークは、更新を安全かつ効率的に配信および処理する方法を示す実用的なデモンストレーションを提供します。
自己更新システムは、完全性と信頼性のセキュリティ目標を満たしている必要があります。このフレームワークは、4096 ビット RSA キーを使用して、更新データの SHA-256 署名に署名し、検証します。公開キーは検証のためにクライアント バイナリに埋め込まれます。ソフトウェアの最初の配信が信頼できるソースを通じて行われると仮定すると、更新の有効な発行者は秘密キーにアクセスできる発行者だけです。
更新データは UDP 経由で送信されます。この決定の主な要因は、TCP 接続によるサーバー メモリのオーバーヘッドを削減することでした (おまけに CPU 負荷も削減されました)。予想されるメモリ オーバーヘッドはおおよそ次のとおりです。
(Update File Size) + (Max Connections) * 80 bytes
更新データは、ディスクへのアクセスを避けるためにメモリに直接保存されます。クライアントとサーバーは、64 ビット暗号トークンを交換することで IP の所有権を確認します。各接続には、制限される前に、限られた量のネットワーク帯域幅が割り当てられます。各 IP アドレスは、同時接続の最大数に制限されています。これらの機能により、多くの一般的なネットワーク攻撃が軽減されます。
中間者攻撃の防止は、更新システムによる信頼性の保証に依存しています。
機密性はソフトウェア更新のセキュリティ目標ではないため、(HTTPS のような) 重い暗号化機能をサーバー上で実行する必要はありません。更新データは機密ではありません。
クライアント側では、ダウンロード速度を制限するための努力は行われません。アプリケーションに統合するには、ドロップされたパケットと接続遅延に基づいて送信レートを動的に調整する努力をする必要があります。
デモ サーバー アーキテクチャは単一ポート/単一スレッドで実行されます。複数のサーバー インスタンスは、スレッドごとに異なるポートまたは異なるシステムで実行できます (ネゴシエーションは、クライアントが最初に接続するロード バランサーで発生します (大規模な更新配信の場合)。
更新データは1ファイル分そのまま送信されます。複数のファイルのパッチ適用、デルタ更新、または圧縮のサポートが必要な場合は、これらの機能を処理するためのユーティリティとデータを含む実行可能ファイルを配布する必要があります (そして更新システム自体から分離する必要があります)。
セキュリティ保証は、秘密キーが安全である限り有効です。キー失効メソッドはフレームワークにバンドルされていません (外部検証と別のプロバイダーからの信頼が必要となるため)。
updater.sln
を開きます。Release
に変更します。client.dll
をコピーして名前をupdate.dll
に変更しますsigntool.exe
を実行して、 pub.h
、 pub.key
、 pri.key
、およびupdate.sig
を生成します。client_updater.cpp
のpublic_key
データを、生成されたpub.h
の内容で置き換えます。server.exe
とloader.exe
起動します。