Защита системы, развернутой во “враждебной” среде

StackOverflow https://stackoverflow.com/questions/4868170

Вопрос

В моей компании мы разрабатываем большую систему, состоящую из нескольких серверов.Система состоит примерно из 5 логических компонентов.Данные хранятся в XMLs, MS SQL и SQLite.Это .Сетевая система (в основном), компоненты взаимодействуют с помощью WCF и некоторых пользовательских UDP.Клиенты получают доступ к системе в основном через пользовательский UDP или WEB (ASP.NET и Silverlight).

Защитить связь несложно, немного SSL и немного безопасности в WCF, и мы закончили.

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

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

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

Как вы предлагаете решить такую проблему?


Обновить 04/02 Я ищу практические предложения или рекомендации по продуктам, которые могли бы мне помочь, поэтому я начинаю розыгрыш призов...

Послушайте, ребята, мы фактически размещаем нашу машину на сайте клиента (по соображениям бизнеса и практичности), мы владеем этой машиной, и клиент получает все, за что он платит, в течение нескольких часов, и он может делать с данными все, что захочет.Но я знаю, что алгоритмы, работающие на этой машине, и некоторые данные, хранящиеся там, являются нашей коммерческой тайной, которую мы хотим защитить.В идеале я бы хотел, чтобы машина вообще не работала, даже не загружалась, если я не скажу, что все в порядке, и без моего СОГЛАСИЯ все на машине оставалось зашифрованным.Ограничение памяти также выглядит как хороший способ защитить компьютер во время выполнения.

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


Обновить 10/02 Ладно.после проведения некоторых исследований, я думаю, мы собираемся попробовать что-то в том же направлении, что и система шифрования PS3, за исключением того, что мы собираемся ввести ключи для расшифровки программного обеспечения и данных с наших серверов.поступая таким образом, мы можем решить на наших машинах, доверяем ли мы серверу, запрашивающему ключи, мы можем получить отключение, просто переустановив машину.вероятно, это будет основано на TPM или чем-то подобном, возможно, TXT от intel...Я также действительно заинтересован в ограничении памяти как важной функции безопасности...

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

Это было полезно?

Решение

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

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

С точки зрения его реальной защиты, есть несколько проблем:

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

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

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

Другие советы

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

Тем не менее, это ужасная идея по ряду причин:

  1. Что произойдет, если их интернет соединение прервется или они переедут из офиса и ненадолго отключат компьютер ?
  2. Что, если вы неправильно закодируете его, и он даст осечку ?Удаление данных, даже если клиент использует его правильно?
  3. Я могу только предположить, что ваш запрос подразумевает, что ваше приложение не предлагает никаких возможностей резервного копирования.Я прав ?Звучит так же, как продукт я бы не стал покупать.
  4. Насколько ценны данные, которыми управляет ваше приложение?Если оно будет удалено, к каким финансовым потерям это приведет для клиента?Есть Ваш юридический отдел одобрил это и подтвердил, что вы не можете быть привлечены к ответственности?

Этот вопрос задают на SO 2-3 раза в неделю, и ответ всегда один и тот же - все, что вы передали пользователю, больше не ваше.

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

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

О переключателе отключения:это не сработает.Никогда.Пользователь может сделать копию и при необходимости восстановить ее из резервной копии.ОН может менять компьютерные часы.Вероятно, он может даже замедлить работу компьютера (если данные настолько ценны, что возможно инвестировать в специальное оборудование для эмуляции).

О важных данных:иногда оказывается, что ваш ценный актив на самом деле не имеет большой ценности ни для кого другого [и какой-то другой аспект вашего решения имеет значение].Пример:мы отправляем исходный код наших продуктов для драйверов.Это самый ценный актив для нас, но пользователи платят не за строки кода, а за поддержку, обновления и другие преимущества.Пользователь не сможет эффективно использовать [украденный] исходный код, не вложив сумму, сопоставимую со стоимостью нашей лицензии.

О запутывании:виртуализация фрагментов кода (например.Продукт VMProtect) кажется довольно эффективным, однако его также можно обойти с определенными усилиями.

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

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

Как все остальные говорили, волшебного средства не существует.Пользователь может выключить компьютер, подключить HD-диск в качестве ведомого устройства к другому компьютеру, создать резервную копию всего, переработать ваш код и затем успешно взломать его.Как только пользователь получает физический доступ к исполняемому файлу, он потенциально скомпрометирован, и в 100% случаев ничего не нужно делать, чтобы остановить его.

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

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

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

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

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

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

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

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


НО, ЕСЛИ ВАМ ДЕЙСТВИТЕЛЬНО НУЖНЫ КАКИЕ-ТО ИДЕИ И ВЫ ДЕЙСТВИТЕЛЬНО ХОТИТЕ ЭТО СДЕЛАТЬ, ПОЕХАЛИ:

Я мог бы предложить вам сделать вашу программу мутантной.То Есть:Когда вы расшифруете свой код, зашифруйте его другим ключом и выбросьте старый ключ.Получите новый ключ с сервера и заявите, что сам ключ закодирован таким образом, что было бы очень сложно издеваться над сервером с помощью чего-то, что дает скомпрометированные новые ключи.Дайте некоторую гарантию, что ключ уникален и никогда не будет использован повторно.Опять же, это не является небьющимся (и первое, что сделал бы взломщик, это атаковал бы именно эту функцию).

И еще кое-что:Добавьте много неочевидных отвлекающих маневров, которые выполняют бессмысленные странные проверки согласованности, в которых много нефункциональных фиктивных версий вашего алгоритма, и добавьте много сложных перегрузок, которые фактически ничего не делают и утверждают, что они выполняются так, как ожидается от реального кода.Заставьте реальный код делать некоторые вещи, которые тоже выглядят странно и бессмысленно.Это еще больше усложняет отладку и реверсивный инжиниринг, поскольку взломщику потребуется много усилий, пытаясь отделить полезное от ненужного.

Редактировать:И, очевидно, сделайте так, чтобы часть нежелательного кода выглядела лучше, чем правильный, чтобы взломщик сначала заглянул туда, фактически теряя время и терпение.Излишне говорить, что все запутывается, поэтому, даже если взломщик получит простой незашифрованный запущенный код, это все равно выглядит запутанным и очень странным.

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

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

  2. Включите TPM на оборудовании и правильно настройте его для вашего программного обеспечения.Это поможет остановить прослушивание оборудования.

  3. Отключите все неиспользуемые вами учетные записи и заблокируйте системные учетные записи и группы, чтобы использовать только то, что вам нужно.Бонусные баллы за настройку Active Directory и защищенной VPN, позволяющей вам получать удаленный доступ к их сети через черный ход для проверки системы без официального посещения сайта.

  4. Чтобы повысить техническую планку, необходимую для работы с этим, напишите программное обеспечение на C ++ или каком-либо другом языке, отличном от.Net language, поскольку байт-код MSIL легко декомпилируется в исходный код общедоступными бесплатными инструментами, и требуется больше технических навыков, чтобы декомпилировать что-либо в ассемблере, даже если это все еще очень выполнимо с помощью правильных инструментов.Убедитесь, что вы включили все инструкции процессора для оборудования, которое вы будете использовать, чтобы еще больше усложнить ситуацию.

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

  6. После проверки аппаратного обеспечения загрузите свое программное обеспечение из зашифрованного двоичного образа, загруженного на зашифрованный диск RAM, который затем сам расшифровывается в (не закрепленной!) памяти.Не закрепляйте его и не используйте постоянный адрес в памяти, так как это плохая идея.

  7. Будьте очень осторожны, чтобы после завершения дешифрования ключи удалялись из оперативной памяти, поскольку некоторые компиляторы тупо оптимизируют незащищенные вызовы bzero / memset0 и оставляют ваш ключ в памяти.

  8. Помните, что ключи безопасности могут быть обнаружены в памяти по их случайности по отношению к другим блокам памяти.Чтобы помочь смягчить это, убедитесь, что вы используете несколько "фиктивных" ключей, которые при использовании запускают сценарий обнаружения вторжения и взрыва.Поскольку вы не должны закреплять память, используемую ключами, это позволит людям запускать одни и те же фиктивные ключи несколько раз.Бонусные баллы, если вы можете сгенерировать все фиктивные ключи случайным образом, а реальный ключ каждый раз будет отличаться из-за приведенного ниже # 12, чтобы они не могли просто искать ключ, который не меняется..потому что они все так делают.

  9. Используйте полиморфный ассемблерный код.Помните, что assembly - это на самом деле просто числа, которые можно сделать самоизменяющимися на основе инструкций и состояния стека / того, что было вызвано ранее.Например, в простой системе i386 0x0F97 (Set byte, если указано выше) может легко быть прямо противоположной инструкцией (Set byte, если указано ниже), просто вычитая 5.Используйте свои ключи для инициализации стека и использования кэша L1 / L2 процессора, если вы действительно хотите работать на жестком диске.

  10. Убедитесь, что ваша система понимает текущую дату / время и подтверждает, что текущая дата / время находится в допустимых пределах.Запуск за день до развертывания и предоставление ему ограничения в 4 года будут совместимы с колоколообразной кривой аппаратного сбоя для жестких дисков, находящихся на гарантии / поддержке, поэтому вы можете воспользоваться преимуществами такой защиты И обеспечить достаточное время между обновлениями оборудования.В случае неудачи этой проверки заставьте его убить себя.

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

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

  13. Вся криптография должна соответствовать рекомендациям FIPS.Так что используйте сильную криптографию, используйте HMACS и т.д.Вам следует попытаться соответствовать требованиям FIPS-140-2- учитывая вашу текущую ситуацию, спецификации 4-го уровня, но понятно, что некоторые требования могут быть невыполнимы с экономической точки зрения, и реально, FIPS-140-2- уровень 2 может быть вашим пределом.

  14. Во всех случаях самоуничтожения попросите его сначала позвонить вам домой, чтобы вы сразу же узнали, что произошло.

И, наконец, некоторые непрограммные решения:

  1. Если он не может позвонить домой..в качестве последней попытки пользовательское аппаратное устройство, подключенное к внутреннему последовательному порту / usb, настроено на активацию реле, которое затем запускает блок термита, если обнаруживает вмешательство в корпус, аппаратное или программное обеспечение.Лучше всего для этого подойдет установка его поверх жестких дисков и размещение их поверх материнской платы.Однако вам необходимо будет уточнить в вашем юридическом отделе наличие необходимых разрешений и т.д., если это ситуация, не одобренная военными США, поскольку я предполагаю, что вы находитесь в США.

  2. Чтобы убедиться, что аппаратное обеспечение не взломано, см. Требования FIPS к физической безопасности для получения более подробной информации о том, как обеспечить физическую безопасность системы.Бонусные баллы, если вы сможете ознакомиться с инструкциями по прикручиванию / приварке современных стоек, которые вы используете, к старому корпусу AS400 в качестве маскировки, чтобы предотвратить перемещение / повреждение оборудования.Ребята помоложе не будут знать, что делать, и будут беспокоиться о том, что сломают "отстойное старье", парни постарше удивятся "что за ерунда?", и почти все оставят кровь, которую позже можно будет использовать как доказательство взлома, если они будут трогать футляр с часто острыми краями, по крайней мере, исходя из моего собственного опыта.

  3. В случае уведомления о вторжении сбросьте ядерную бомбу с орбиты..это единственный способ быть уверенным.;) Просто убедитесь, что у вас заполнены все юридические формы и требования для доступа, чтобы legal была довольна снижением риска или ответственности...Или же вы можете настроить свою систему уведомлений так, чтобы она автоматически отправляла электронные письма / текстовые сообщения / звонки людям, как только вы получаете уведомление о том, что оно взорвалось.

"Единственный способ получить абсолютно безопасную систему - это разбить ее молотком".

Тем не менее, можно облапошить потенциальных хакеров настолько, чтобы создать им больше проблем, чем они того стоят.Если компьютер представляет собой "черный ящик", к которому они на самом деле не могут получить прямой доступ, но вместо этого имеют программы, которые с ним справляются, то вашей самой большой угрозой для него является физический доступ.Вы можете заблокировать футляры и даже установить в футляр небольшой хрупкий предмет, который защелкнется, если футляр будет открыт...убедитесь, что сотрудники вашей службы поддержки всегда заменяют это item...it они сообщат вам, если кто-то открывал его без авторизации (да, это старый подростковый трюк, но он работает).Что касается самой коробки, физически отключите все аппаратные средства (например, USB-порты), которые вам абсолютно не нужны.

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

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

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

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

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

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

После этого вы либо увидите, что защита на самом деле не нужна, ЛИБО сможете применить какие-то разумные меры и прикрыть другие "дыры" юридическими материалами, ЛИБО вообще перепроектировать систему, начиная с бизнес-модели (маловероятно, но тоже возможно).

Как правило, безопасность - это проблема системного проектирования, и вы не должны ограничивать себя только техническими подходами.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top