Демонстрация самостоятельного обновления, написанная на C++. Включает в себя загрузчик, клиент, сервер и инструменты подписи для безопасной доставки автоматических обновлений для настольных приложений Win32.
В собственных настольных приложениях Win32 нет такой роскоши, как интегрированный в систему менеджер пакетов для обработки автоматических обновлений. Эта платформа обеспечивает рабочую демонстрацию того, как безопасно и эффективно доставлять и обрабатывать обновления.
Самообновляющаяся система должна удовлетворять целям безопасности целостности и аутентичности. Эта платформа использует 4096-битные ключи RSA для подписи и проверки подписи SHA-256 для данных обновления. Открытый ключ встроен в двоичный файл клиента для проверки. Предполагая, что первоначальная доставка программного обеспечения осуществляется из надежного источника, единственными действительными поставщиками обновлений являются те, у кого есть доступ к закрытому ключу.
Данные обновления передаются по UDP. Основным фактором в этом решении было сокращение нагрузки на серверную память из-за TCP-соединений (со снижением нагрузки на процессор в качестве бонуса). Ожидаемый расход памяти составляет примерно:
(Update File Size) + (Max Connections) * 80 bytes
Данные обновления сохраняются непосредственно в памяти, чтобы избежать доступа к диску. Клиент и сервер проверяют право собственности на IP-адрес путем обмена 64-битными криптографическими токенами. Каждому соединению назначается ограниченная полоса пропускания сети, прежде чем оно будет ограничено. Каждый IP-адрес ограничен максимальным количеством одновременных подключений. Эти функции смягчают ряд распространенных сетевых атак:
Предотвращение атак «человек посередине» основано на гарантиях подлинности системы обновлений.
На сервере не требуется выполнять сложные криптографические функции (например, в HTTPS), поскольку конфиденциальность не является целью безопасности обновлений программного обеспечения — данные обновления не являются конфиденциальными.
На стороне клиента не предпринимается никаких усилий по ограничению скорости загрузки. Интеграция в ваше приложение должна обеспечивать динамическую настройку скорости отправки в зависимости от отброшенных пакетов и задержки соединения.
Архитектура демонстрационного сервера работает на одном порте/одном потоке. Несколько экземпляров сервера могут быть запущены в каждом потоке на разных портах или в разных системах (согласование которых происходит на балансировщике нагрузки, к которому клиент подключится первым (для крупномасштабной доставки обновлений).
Данные обновления отправляются для одного файла как есть. Если вам нужна поддержка нескольких исправлений файлов, дельта-обновлений или сжатия, вам следует предоставить исполняемый файл с утилитами и данными для обработки этих функций (и отделить его от самой системы обновлений).
Гарантии безопасности действуют только до тех пор, пока закрытый ключ остается в безопасности. В состав платформы не входит метод отзыва ключей (поскольку для этого потребуется внешняя проверка и доверие со стороны другого поставщика).
updater.sln
.Release
.client.dll
в update.dll
signtool.exe
, чтобы сгенерировать pub.h
, pub.key
, pri.key
и update.sig
.public_key
в client_updater.cpp
содержимым из сгенерированного pub.h
server.exe
и loader.exe
чтобы продемонстрировать обновление.