Как предотвратить пароли и другие конфиденциальные данные, отправленные и полученные с веб-страниц ASP.NET в файлах дампа IIS/ASP.NET?
Шаги по воспроизведению
- Используя Visual Studio 2010, создайте приложение интрасети ASP.NET MVC 3.
- Настройте его на использование IIS 7.5.
- Запустите его и зарегистрируйте учетную запись (скажем, bob123 как пользователь и Pa $$ w0Rd в качестве пароля. Я предполагаю, что база данных SQL Express создана и сайт полностью работоспособен.
- Используя диспетчер задач, щелкните правой кнопкой мыши процесс w3wp и создайте дамп.
- Откройте дамп в редакторе, способном отображать его содержимое как шестнадцатеричное, например, SlickEdit.
- Найдите "Pa $$ 0Rd" и "Pa% 24% 24w0Rd" в шестнадцатеричном дампе. Вы должны иметь возможность найти несколько копий, хранящихся в виде ASCII, Unicode или закодированных.
Обратите внимание, что не имеет значения, используете ли вы HTTPS, потому что он шифрует только сообщение. ASP.NET хранит данные в ящике в памяти или на диске.
Проблема
Общей мудростью является шифрование конфиденциальных данных, а не сохранение в ясности. Однако сотрудник может получить дамп приложения IIS/ASP.NET и обнаружить пароли и другие конфиденциальные данные пользователей, поскольку эта информация не зашифрована и не используется память ASP.NET после использования.
Это ставит их под угрозу просто потому, что они имеют к нему доступ. Дамп иногда предоставляется партнерам (например, Microsoft), чтобы помочь им диагностировать проблемы в своем коде. Это необходимая часть диагностики некоторых действительно сложных проблем в одном приложении.
Вещи, которые я посмотрел на
- Используйте SecureString для паролей и других конфиденциальных данных. Однако поставщик членства ASP.NET наряду с другими платформами, такими как WCF, часто принимает пароли как System.String, что означает, что эти копии все равно будут находиться в дампе.
- Посмотрел, есть ли что-нибудь в каркасе, чтобы очистить копию System.String, когда она больше не используется. Я ничего не мог найти.
- Исследуется, можно ли обнулить память, используемую для запросов и ответов, после того, как IIS будет с ней работать, но я ничего не смог найти.
- Я исследовал, что можно шифровать файлы, которые получает IIS (как HttpPostFile), чтобы они не сохранялись в ящике. Мы можем получать конфиденциальные документы, и каждый шаг делается для шифрования и защиты их на сервере. Тем не менее, кто-то может извлечь их в ящике с дампа IIS.
То, что я надеялся, - это сообщить IIS/ASP.NET, что конкретный запрос/ответ содержит конфиденциальные данные и что IIS/ASP.NET очистит память, когда она будет выполнена с ее помощью.