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.