Предотвращение чтения строк, хранящихся в памяти, другими программами - PullRequest
6 голосов
/ 27 декабря 2010

Некоторые программы, такие как ProcessExplorer, могут читать строки в памяти (например, моё сообщение об ошибке, написанное в коде, может быть легко отображено, даже если оно уже скомпилировано).

  1. Представьте, если у меня есть строка пароля "123456", последовательно размещенная в памяти. Что если хакеры смогут получить пароль, введенный пользователем? Есть ли какой-нибудь способ помешать так ясно видеть струны?

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

Спасибо!

Ответы [ 4 ]

8 голосов
/ 27 декабря 2010

Я полагаю, вы путаете две вещи. Строки, которые находит ProcessExplorer, также могут быть найдены командой «strings» в Unix. Он просто сбрасывает все сохраненные строки в исполняемый файл, а не в текущую память.

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

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

Вам также необходимо убедиться, что память, используемая для хранения пароля, никогда не записывается на диск и не выгружается. Этот веб-сайт может указать вам правильное направление. https://www.securecoding.cert.org/confluence/display/seccode/MEM06-C.+Ensure+that+sensitive+data+is+not+written+out+to+disk

[править]

Я хотел бы расширить свой предыдущий пост, говоря о предотвращении повторов.

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

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

Это тема, которую я не могу охватить слишком хорошо на этом веб-сайте. Вам нужно будет исследовать центры сертификации и PKI.

Тогда ваши уязвимости: 1. Пика в текущую память, чтобы извлечь пароль 2. Социальная инженерия

Ссылка: http://en.wikipedia.org/wiki/Public_key_infrastructure

2 голосов
/ 27 декабря 2010

Эндрю ответ дает вам хорошие советы для защиты строк в памяти.Что касается воспроизведения - вы, безусловно, правы, если кто-то перехватит хешированный пароль, он может воспроизвести его и поставить под угрозу безопасность.Способ победить - аутентификация по запросу-ответу: http://en.wikipedia.org/wiki/Challenge-response_authentication

1 голос
/ 27 декабря 2010

Не храните простые пароли в памяти (вы можете как минимум XOR их). И прочитайте Введение в Windows Anti-Debugging

0 голосов
/ 27 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...