Демонстрация самостоятельного обновления, написанная на 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.dllsigntool.exe , чтобы сгенерировать pub.h , pub.key , pri.key и update.sig .public_key в client_updater.cpp содержимым из сгенерированного pub.hserver.exe и loader.exe чтобы продемонстрировать обновление.