Автоматическое обновление: безопасно ли это?

Автообновление Dot Net

Я чувствовал, что в .net не хватает простой безопасной библиотеки автоматического обновления, поэтому я кое-что реализовал и установил здесь. Прежде чем кто-либо подумает об использовании библиотеки, я хотел, чтобы процесс обновления получил небольшую экспертную оценку.

Вот шаги:

  • Клиентское программное обеспечение заполняется открытым ключом и URI для опроса.
  • Клиент опрашивает URI для файла манифеста.
  • Манифест загружается, и подпись (в отдельном .signature) используется для проверки правильности манифеста.
  • Список ожидающих обновлений анализируется из манифеста (чтобы показать пользователю).
  • Файл установщика загружается и снова сверяется с соответствующим файлом .signature. (загруженный файл будет защищен списками контроля доступа)
  • Установщик запущен.

Сниженные угрозы:

  • Подпись манифеста должна предотвращать любые вредоносные загрузки (ковровая бомбардировка).
  • Подпись установщика должна предотвращать любые атаки MITM от отправки вредоносных установщиков.
  • Защита загруженного установщика с помощью ACL должна предотвратить любые локальные эскалационные атаки.

Неустранимые угрозы:

  • Атака MITM, при которой злоумышленник всегда сообщает об отсутствии доступных обновлений. (Может оставить клиент в уязвимой версии)

Использованная литература:


Что я пропустил?



person Luke Quinane    schedule 14.09.2009    source источник
comment
Ради интереса, что не так с ClickOnce для этого сценария?   -  person Robert MacLean    schedule 02.10.2009
comment
@Robert ClickOnce устанавливается только с ограниченным доступом к системе. Например, нет доступа к системным сканерам. Я могу ошибаться, но я думаю, что приложения ClickOnce всегда должны проверять наличие обновлений перед запуском?   -  person Luke Quinane    schedule 02.10.2009
comment
@Luke: вы можете выбрать желаемое поведение с помощью clickonce (т.е. приложение доступно в автономном режиме, флажок, который вы можете поставить)   -  person Brann    schedule 02.10.2009
comment
@Robert: clickonce не поддерживает все прокси-схемы, clickonce иногда дает сбой из-за ошибочных поврежденных сообщений хранилища, clickonce не поддерживает шифрование ... просто чтобы назвать несколько предостережений clickonce   -  person Brann    schedule 02.10.2009
comment
А как насчет использования SSL, это решит всю проблему без каких-либо сложностей. Сейчас это стоит около 50$   -  person dr. evil    schedule 04.10.2009


Ответы (7)


У Дэна Камински есть хороший набор рекомендаций для программы обновления:

Чтобы добиться успеха, ваш пакет обновления должен быть:

  • Подписано.
  • Подписано вами.
  • Подписано вами с использованием правильного EKU (расширенное использование ключа)
  • Подписано неотзывной подписью
  • Быть таким же продуктом
  • Быть новой версией

Из вашего описания в этом вопросе видно, что у вас есть первые 3.

person Jesse Weigert    schedule 23.09.2009
comment
Я думал, что пункты № 5 и № 6 должны выполняться пользователем библиотеки. Есть мысли по этому поводу? - person Luke Quinane; 30.09.2009
comment
Пользователь библиотеки должен иметь возможность передать имя приложения и текущую версию, а библиотека могла прочитать метаданные из установщика, чтобы проверить последние два пункта. - person Jesse Weigert; 01.10.2009

Создав свой собственный развертыватель в корпоративной среде, вот несколько вариантов использования, которые мне нужно было решить:

  • поддержка цифровой подписи

  • поддержка всех видов прокси. Некоторые крупные корпорации имеют сложные конфигурации прокси (например, с помощью сценариев настройки прокси). Вы должны поддерживать все это.

  • поддержка шифрования. Ваши клиенты, вероятно, захотят, чтобы развернутые двоичные файлы были доступны на веб-сервере, и они не захотят управлять какой-либо аутентификацией или контролем доступа; но они также не захотят, чтобы неавторизованные пользователи загружали двоичные файлы. Простое решение — зашифровать двоичные файлы и развернуть их с помощью вашего инструмента.

  • поддержка подключаемых дополнительных шагов. Корпоративным клиентам обычно не очень удобно пользоваться автоматически развертываемыми инструментами. Они захотят больше контроля. Как правило, разрешение им выполнять настраиваемые шаги (например, антивирусные проверки и т. д.) помогает

  • поддержка различных версий программного обеспечения на основе потребительской идентификации. Это часто необходимо в корпоративной среде, когда вы хотите очень быстро обновить копии конкретного потребителя (чтобы исправить ошибку или добавить дополнительную функцию), не запуская весь процесс вопросов и ответов (в этой ситуации вы хотите ограничить обновление этому конкретному потребителю)

  • поддержка ситуаций с ограниченными привилегиями. Помимо того факта, что у ваших пользователей может не быть прав администратора на своих компьютерах, крупные корпорации часто используют специальные инструменты для ограничения того, что вы можете делать. Будьте готовы к развертыванию в пользовательской папке (или даже во временной папке), а не в классических «программных файлах».

  • ваш инструмент должен быть подписан надежным центром сертификации.

Что касается упомянутой вами атаки MITM, ее легко решить с помощью общедоступной криптографии (как отмечено неизвестно)

person Brann    schedule 30.09.2009
comment
+1 и за прокси. Я тот, кто стоит за этими сложными прокси, и это может привести к хаосу. - person Robert MacLean; 02.10.2009
comment
Поддержка прокси — полезная функция, но на самом деле это не проблема безопасности процесса обновления. - person Luke Quinane; 02.10.2009
comment
@ Люк: зависит от твоей точки зрения. Я могу заверить вас, что многие отделы безопасности откажутся от любого прямого подключения к www по соображениям безопасности. - person Brann; 05.10.2009

Что ж, вы можете попытаться предотвратить MITM, если ответ «без обновления версии» также будет включать метку времени (и быть подписанным). Затем, если проходит месяц (или какова ваша политика) без изменения версии и без обновления метки времени, вы отказываетесь запускать программное обеспечение или всплывает диалоговое окно с предупреждением, информирующее пользователя о возможной атаке MITM.

Не решает проблему того, что делать, если ваш сервер выйдет из строя - по-видимому, вы относитесь к этому так же, как к изменению временной метки.

person Vitali    schedule 30.09.2009
comment
+1, хорошая идея. Кроме того, вы должны зарегистрировать свою учетную запись, чтобы не потерять репутацию. - person John Gietzen; 05.10.2009
comment
Я не был зарегистрирован? Должен ли я делать что-то кроме входа в систему с моим OpenID? - person Vitali; 06.10.2009

Не хочу быть троллем, но вы пытаетесь решить уже решенную проблему. Использование SSL было бы гораздо лучшим выбором. Это решит все проблемы, перечисленные в вашем вопросе.

Я понимаю, что эта система может быть полезна для людей, которые не могут позволить себе SSL-сертификат, но любой, кто может его получить, должен получить его, чтобы решить эту проблему.

Не забывайте: «Сложность — враг безопасности».

person dr. evil    schedule 04.10.2009

В качестве дополнения добавьте также контрольную сумму MD5 в загруженный файл, в противном случае все будет хорошо :) — Справедливый комментарий ниже.

Добавлен:

Единственная дополнительная вещь, которую я вижу здесь, — это вникание в такие вещи, как запутывание кода или архивирование установочного файла и блокировка архива, а затем его разблокировка после загрузки. Такие вещи. Однако я думаю, что то, что вы сейчас сделали, должно быть на 100%.

Единственный раз, когда требуется больше, это когда приложение очень сложно с точки зрения безопасности. Прямо сейчас вы предотвращаете подделку DLL и доказательство происхождения, которых для автоматического обновления должно быть много.

person Kyle Rosendo    schedule 14.09.2009
comment
Код использует RSA/SHA1 для вычисления сигнатур файлов, поэтому я думаю, что это покрыто. - person Luke Quinane; 14.09.2009
comment
SHA1 мертв, не используйте его. Используйте SHA256. - person Noon Silk; 14.09.2009
comment
Спасибо @silky, я переключу его на SHA256. - person Luke Quinane; 14.09.2009

Так что я чего-то не понимаю; загрузчик проверяет, что манифест является тем, который он ожидает, с помощью подписи, делает ли он то же самое для фактических исправлений, которые он устанавливает?

person Noon Silk    schedule 14.09.2009
comment
Да, он также проверяет установочный файл после его загрузки. - person Luke Quinane; 14.09.2009
comment
Хорошо. Тогда ладно. Так можно ли каким-то образом обновить открытый ключ, с которым он проверяется? (и адрес)? - person Noon Silk; 14.09.2009
comment
Это зависит от приложения. Я планирую использовать его только для обновления ключа/URL, установив новую версию (т.е. жестко запрограммированную в приложении). Хотя вы можете использовать криптографический API для хранения ключа, чтобы его можно было изменить. - person Luke Quinane; 14.09.2009
comment
Я предполагаю, что вам может понадобиться средство для безопасного обновления, если по какой-либо причине вы решите, что вам нужно изменить свой закрытый ключ, или вы предвидите, что домен отключается/изменяется. - person Noon Silk; 14.09.2009

В этом посте есть очень хороший комментарий и решение. Но я полностью согласен с доктором. зло. Вы должны использовать SSL-соединение для обновления, и сертификат должен быть сохранен (встроен) в клиенте. Таким образом, вы можете убедиться, что клиент не примет поддельный сертификат. Я думаю, что это эффективно защитит клиента от атаки MiTM.

ПРИМЕЧАНИЕ. Если клиент может принять неавторизованный сертификат, атака MiTM может быть успешной, поэтому не давайте эту опцию клиенту.

Изменить: я думаю, что в этом случае SSL-сертификат может быть самоподписанным.

person Sadi    schedule 05.10.2009
comment
Я хотел бы знать, возможна ли атака MiTM в этом сценарии. Насколько я знаю, это не так. - person Sadi; 05.10.2009