Как убедиться, что содержимое загруженного файла не может быть восстановлено после использования? - PullRequest
6 голосов
/ 18 января 2011

Я хотел бы сделать содержимое файла, загруженного на веб-сервер, невосстановимым после его использования.Мои опасения:

  1. Когда файл загружен, сохраняется ли он во временном каталоге (например, в каталоге Windows Temp) и как мне оттуда удалить все следы?

  2. Можно ли записать содержимое файла в виртуальную память и как я могу убедиться, что оно не было записано или удалено после его записи?

  3. Если я зашифрую файлМогу ли я по-прежнему беспокоиться о сохранении содержимого в каталоге Temp, виртуальной памяти или в другом месте до того, как файл будет зашифрован?

  4. Могу ли я выполнить безопасное удаление всех заинтересованных сторон?местоположения (временная, виртуальная память, любые другие) и как мне это сделать?

  5. Есть ли какие-либо проблемы, которые я пропустил, или альтернативный способ достижения поставленной цели?

NB Это веб-приложение ASP.NET.

Edit : Спасибо djeeg за ссылку на то, как переместитьвременная загрузка каталога в более контролируемую область.

Есть какие-либо отзывы по другим пунктам?

Ответы [ 3 ]

3 голосов
/ 21 января 2011

Безопасность диска

Вы можете позволить утилите wipe сделать всю работу за вас.

Если вы используете ASP.NET в Mono / Linux, вы можете использовать команду wipe через класс Process (убедитесь, что пакет wipe установлен).

Если вы используете Windows, подход такой же. Используйте утилиту wipe.exe, которая выполняет жесткую очистку, когда вам нужно безопасно утилизировать файл.

Мне нравится этот веб-сайт, который распространяет бесплатный wipe.exe, который не входит в стандартную установку Windows (слишком плохо).

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

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

Безопасность памяти

Класс SecureString помогает вам не оставлять следов в памяти. Но когда вы работаете с файлами, вы на самом деле работаете с потоками. Я не уверен, что беспокоюсь о содержимом энергозависимой памяти (даже если вы работаете с документами Wikileaks).

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

  1. Может ли кто-нибудь получить доступ к серверу с учетной записью администратора / root с возможностью выполнения дампа памяти? (Обычные пользователи не могут читать вашу память, а .NET предотвращает переполнение буфера из-за неиспользуемых указателей)
  2. Может ли кто-нибудь физически получить доступ к серверу? Разве вы не достаточно доверяете своему хостинг-провайдеру? Вы вместо этого запускаете виртуальный сервер?

Если ответ не да , вам не стоит беспокоиться о безопасности памяти

Обмен пространства безопасности

Даже если вы работаете в Windows, позвольте мне вызвать «swap» файл подкачки, или файл виртуальной памяти, или что-то еще. Вы можете подумать о его отключении (убедитесь, что у вас много оперативной памяти) или, в противном случае, вы можете подумать о его шифровании (но вы получите снижение производительности).

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

Если данные слишком чувствительны, я бы отключил обмен.

[Добавить] Я уверен, что вы уже используете SSL для загрузки файла, на тот случай, если вы забыли некоторые принципы ...

2 голосов
/ 18 января 2011

Я бы, вероятно, изменил место загрузки по умолчанию с c: \ Temp на то, что вы можете удалить

http://blogs.msdn.com/b/viag/archive/2006/10/25/how-to-change-the-default-tempfile-upload-location-for-the-asp-net-2-0-fileupload-control.aspx

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

0 голосов
/ 28 января 2011

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

javascript secure key exchange

Убедитесь, что вы не передаете расшифрованные данные. Расшифруйте и используйте данные в том же классе или методе и убедитесь, что вы очищаете данные, прежде чем сборщик мусора освободит ваш объект. Защитите свой своп (я парень из Linux, поэтому я не знаю, как это сделать в Windows).

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

...