Demonstrasi pembaruan mandiri yang ditulis dalam C++. Termasuk alat pemuat, klien, server, dan penandatanganan untuk mengirimkan pembaruan otomatis secara aman untuk aplikasi desktop Win32.
Aplikasi desktop asli Win32 tidak memiliki kemewahan manajer paket sistem terintegrasi untuk menangani pembaruan otomatis. Kerangka kerja ini memberikan demonstrasi kerja tentang cara menyampaikan dan memproses pembaruan dengan aman dan efisien.
Sistem yang dapat diperbarui sendiri harus memenuhi tujuan keamanan integritas dan keaslian. Kerangka kerja ini menggunakan kunci RSA 4096-bit untuk menandatangani dan memverifikasi tanda tangan SHA-256 untuk data pembaruan. Kunci publik tertanam ke dalam biner klien untuk verifikasi. Dengan asumsi pengiriman awal perangkat lunak dilakukan melalui sumber tepercaya, satu-satunya penerbit pembaruan yang valid adalah mereka yang memiliki akses ke kunci pribadi.
Data pembaruan dikirimkan melalui UDP. Faktor utama dalam keputusan ini adalah mengurangi overhead memori server dari koneksi TCP (dengan pengurangan beban CPU sebagai bonus). Overhead memori yang diharapkan kira-kira:
(Update File Size) + (Max Connections) * 80 bytes
Data pembaruan disimpan langsung di memori untuk menghindari akses ke disk. Klien dan server memverifikasi kepemilikan IP dengan menukar token kriptografi 64-bit. Setiap koneksi diberi bandwidth jaringan dalam jumlah terbatas sebelum dibatasi. Setiap alamat IP dibatasi pada jumlah maksimum koneksi bersamaan. Fitur-fitur ini mengurangi sejumlah serangan jaringan yang umum:
Pencegahan serangan man-in-the-middle bergantung pada jaminan keaslian dari sistem pembaruan.
Tidak ada fungsi kriptografi berat yang perlu dijalankan di server (seperti di HTTPS) karena kerahasiaan bukanlah tujuan keamanan untuk pembaruan perangkat lunak -- data pembaruan tidak sensitif.
Tidak ada upaya yang dilakukan di sisi klien untuk membatasi kecepatan pengunduhan. Integrasi ke dalam aplikasi Anda harus berupaya menyesuaikan kecepatan pengiriman secara dinamis berdasarkan paket yang dijatuhkan dan latensi koneksi.
Arsitektur server demo berjalan pada satu port/utas tunggal. Beberapa contoh server dapat dijalankan per thread pada port berbeda atau sistem berbeda (dengan negosiasi yang terjadi pada penyeimbang beban yang akan disambungkan klien terlebih dahulu (untuk pengiriman pembaruan skala besar).
Data pembaruan dikirim untuk satu file apa adanya. Jika Anda memerlukan dukungan untuk patching beberapa file, pembaruan delta, atau kompresi, Anda harus mengirimkan file yang dapat dieksekusi dengan utilitas dan data untuk menangani fitur-fitur ini (dan memisahkannya dari sistem pembaruan itu sendiri).
Jaminan keamanan hanya berlaku selama kunci privat tetap aman. Tidak ada metode pencabutan kunci yang digabungkan dengan kerangka kerja ini (karena memerlukan verifikasi eksternal dan kepercayaan dari penyedia lain).
updater.sln
.Release
.client.dll
menjadi update.dll
signtool.exe
untuk menghasilkan pub.h
, pub.key
, pri.key
dan update.sig
.public_key
di client_updater.cpp
dengan konten dari pub.h
yang dihasilkan.server.exe
dan loader.exe
untuk mendemonstrasikan pembaruan.