Назад | Перейти на главную страницу

Чтение переменной из памяти

У меня есть простой скрипт, который считывает ввод пользователя (пароль) и сохраняет его в переменной

read -s -p "password: " PASSWD; printf "%b" "\n" 

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

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

В вашем примере PASSWD будет храниться в локальной переменной. Переменные среды для процесса хранятся в /proc/PID/environ и может быть прочитан этим пользователем или root:

[choad ~]$ read -s -p "password: " PASSWD; echo
password:
[choad ~]$ echo $PASSWD
soopersekrit
[choad ~]$ ls -al /proc/self/environ
-r-------- 1 michael michael 0 May  6 14:46 /proc/self/environ
[choad ~]$ grep PASSWD /proc/self/environ
[choad ~]$ export PASSWD
[choad ~]$ tr '\000' '\n' < /proc/self/environ | grep PASSWD
PASSWD=soopersekrit
[choad ~]$ echo $$
19613

[choad ~]$ gdb -p 19613
(gdb) info proc mappings
     0x91f2000  0x9540000   0x34e000          0           [heap]
(gdb) dump memory /tmp/bash.mem 0x91f2000 0x9540000

[choat ~]$ strings /tmp/bash.mem |grep ^PASSWD
PASSWD=soopersekrit
PASSWD=soopersekrit

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

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

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

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

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

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

Затем вы можете попробовать использовать дамп для своего пароля, и он будет там (возможно, более одного раза). Узнать, где хранится пароль (и что это за пароль), если вы его не знаете, - намного более сложная задача.

Вы также можете попробовать прочитать этот - страница кажется недоступной в данный момент, но Google все еще кеширует ее.