Variável de leitura da memória

3

Eu tenho um script simples que lê a entrada do usuário (senha) e salva-a em uma variável

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

Aparentemente, isso não é seguro, pois é armazenado em um texto não criptografado na memória e é possível acessá-lo via dump central? Como eu posso ler essa variável da memória. Por favor, note que eu não estou procurando uma solução melhor, estou apenas curioso para saber se posso realmente ler esta senha / variável.

    
por HTF 06.05.2012 / 15:52

3 respostas

6

root pode sempre (para quase todos os valores de sempre) ler a memória do processo para que seja possível extraí-la, independentemente de como ela é armazenada (sempre há uma pequena janela, mesmo se a senha for enviada para um dispositivo de armazenamento seguro) como hardware de smartcard, iButton ou TPM).

No seu exemplo, o PASSWD será armazenado em uma variável local. As variáveis de ambiente para o processo são armazenadas em /proc/PID/environ e podem ser lidas por esse usuário ou raiz:

[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 '
[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 '%pre%0' '\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
0' '\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

N.B .: algumas distribuições permitem as restrições de ptrace_scope do Yama que impedem a anexação a processos arbitrários pertencentes ao mesmo usuário.

N.B .: Tenha mais cuidado ao passar senhas por meio de uma linha de comando. Nada deve ser passado como um argumento que o mundo inteiro não pode conhecer. A linha de comando não é protegida.

    
por 06.05.2012 / 21:02
1

Não é fácil acessar uma região de memória de outro processo em sistemas operacionais que implementam proteção de memória .

Se você tiver dúvidas de que outro processo / usuário tentará isso, você poderá usar essa variável e depois esvaziá-la imediatamente depois disso. Você também pode tentar armazenar uma cópia com hash da senha, se isso funcionar no seu caso.

    
por 06.05.2012 / 15:59
1

De um jeito ou de outro, a senha terá que ficar na memória para você usá-la (você pode armazenar algumas senhas AES na CPU, eu esqueci como a tecnologia é chamada, mas por outro lado, ou está na memória, ou você solicita ao usuário toda vez que ele for reinserido e, em seguida, limpe-o).

Se você quiser despejar toda a sua memória, você pode usar memdump , mas cuidado, desde que foi escrito to disk usa memória também, então você pode estar sobrescrevendo-a antes de fazer o dump dessa parte :) (Claro, se o seu script / programa ainda está rodando, essa parte da memória ainda é 'usada', então ele não será sobrescrito)

Você pode tentar usar o dump da sua senha, e ela estará lá (provavelmente mais de uma vez). Descobrir onde a senha é armazenada (e o que é), se você não sabe, é uma tarefa muito mais difícil.

Você também pode tentar ler this - a página parece estar inativa no momento, mas o Google ainda a mantém em cache.

    
por 06.05.2012 / 16:02

Tags