Estou executando um daemon de software que exige que determinadas ações insiram uma senha para desbloquear alguns recursos que se parecem, por exemplo:
$ darkcoind masternode start <mypassphrase>
Agora eu tenho algumas preocupações de segurança no meu servidor debian sem cabeça.
Sempre que procuro meu histórico do bash, por exemplo Ctrl+R
, consigo ver essa senha super forte. Agora, imagino que meu servidor esteja comprometido e algum invasor tenha acesso a shell e possa simplesmente Ctrl+R
encontrar minha frase secreta no histórico.
Existe uma maneira de digitar a senha, sem que seja mostrado na história bash, ps
, /proc
ou em qualquer outro lugar?
Atualização 1 : não passar senha para o daemon gera um erro. Esta não é uma opção.
Atualização 2 : Não me diga para excluir o software ou outras dicas úteis, como desligar os desenvolvedores. Eu sei que este não é um exemplo de prática recomendada, mas este software é baseado em bitcoin e todos os clientes baseados em bitcoin são algum tipo de servidor json rpc que escuta esses comandos e ainda é discutido um problema de segurança conhecido ( a , b , c ) .
Atualização 3 : O daemon já está iniciado e em execução com o comando
$ darkcoind -daemon
Fazendo ps
mostra apenas o comando de inicialização.
$ ps aux | grep darkcoin
user 12337 0.0 0.0 10916 1084 pts/4 S+ 09:19 0:00 grep darkcoin
user 21626 0.6 0.3 1849716 130292 ? SLl May02 6:48 darkcoind -daemon
Então, passando os comandos com a senha não aparece na ps
ou /proc
em tudo.
$ darkcoind masternode start <mypassphrase>
$ ps aux | grep darkcoin
user 12929 0.0 0.0 10916 1088 pts/4 S+ 09:23 0:00 grep darkcoin
user 21626 0.6 0.3 1849716 130292 ? SLl May02 6:49 darkcoind -daemon
Isso deixa a questão de onde a história aparece? Somente em .bash_history
?
fonte
Respostas:
Realmente, isso deve ser corrigido no próprio aplicativo. E esses aplicativos devem ser de código aberto, para que a correção do problema no próprio aplicativo seja uma opção. Um aplicativo relacionado à segurança que comete esse tipo de erro também pode cometer outros erros, para que eu não confie nele.
Interposer simples
Mas você estava pedindo uma maneira diferente, então aqui está uma:
Compile isso com
em seguida, execute seu processo com
A biblioteca do interposer executará esse código antes que a
main
função do seu aplicativo seja executada. Ele substituirá o último argumento da linha de comando pela senha real na chamada para main. A linha de comando impressa/proc/*/cmdline
(e, portanto, vista por ferramentas comops
) ainda conterá o argumento falso. Obviamente, você teria que tornar o código-fonte e a biblioteca compiladas legíveis apenas para si mesmo, para melhor operar em umchmod 0700
diretório. E como a senha não faz parte da chamada do comando, seu histórico do bash também é seguro.Interposer mais avançado
Se você quiser fazer algo mais elaborado, lembre-se de que
__libc_start_main
é executado antes que a biblioteca de tempo de execução seja inicializada corretamente. Portanto, sugiro evitar chamadas de função, a menos que sejam absolutamente essenciais. Se você quiser chamar funções para o conteúdo do seu coração, faça isso antes quemain
ele seja chamado, depois que toda a inicialização estiver concluída. No exemplo a seguir, devo agradecer a Grubermensch, que apontou como ocultar uma senha passada como argumento de linha de comando, que me chamougetpass
a atenção.Isso solicita a senha, para que você não precise mais manter a biblioteca do interposer em segredo. O argumento do espaço reservado é reutilizado como solicitação de senha, portanto, invoque isso como
Outra alternativa seria ler a senha de um descritor de arquivo (como, por exemplo,
gpg --passphrase-fd
faz), ou dex11-ssh-askpass
, ou o que for.fonte
strings
vulnerabilidade. Consulte SO: ocultar a entrada de senha no terminal .__libc_start_main
.Não é apenas a história. Ele também aparecerá na saída ps .
Quem escreveu esse software deve ser pendurado, desenhado e esquartejado. É um NÃO absoluto precisar fornecer uma senha na linha de comando, independentemente do software que seja.
Para um processo daemon, é ainda mais imperdoável ...
Além do rm -f no próprio software, não conheço nenhuma solução para isso. Honestamente: Encontre outro software para fazer o trabalho. Não use esse lixo.
fonte
rm -f
agora.ps
. Então, até que o desenvolvedor conserte isso, ele está sugerindo o uso de outra coisa.ps
, portanto, não é melhor que arm
solução.Isso limpará a
ps
saída.SEJA MUITO CONSCIENTE : Isso pode interromper o aplicativo. Você está devidamente avisado de que aqui devem haver dragões.
Agora você está devidamente notificado desses avisos terríveis. Isso limpará a saída exibida em
ps
. Ele não limpará seu histórico nem o histórico de tarefas básicas (como executar o processo comomyprocess myargs &
). Masps
não mostrará mais os argumentos.Invoque o programa salvando-
chmod +x
o. Em seguida, fazendo./whatever <pidoftarget>
se isso funciona, ele vai produzir nenhuma saída. Se falhar, irá reclamar de algo e sair.fonte
gdb
pode modificar a memória dos processos em execução (com muito mais precisão cirúrgica do que eu acrescentaria).Você pode passar o argumento de um arquivo, acessível apenas pela raiz ou pelo usuário requerido?
É um enorme NÃO-NÃO digitar senhas no console, mas o último recurso ... comece sua linha com um espaço para que não apareça no histórico.
fonte
export HISTCONTROL=ignoreboth
ignora duplicatas e linhas com um espaço inicial para entrada no histórico. Adicione-o ao seu .bashrc ou .bash_profile.Talvez isso funcione (?):
fonte
darkcoind masternode start `head -1`
, se você quiser inserir a senha manualmente.ps
utilitários e similares..bash_history
para uma senha de texto sem formataçãopassword.txt
ganha o que, exatamente?Infelizmente, se seu
darkcoind
comando espera a senha como um argumento da linha de comando, ela será exposta por meio de utilitários comops
. A única solução real é educar os desenvolvedores .Embora a
ps
exposição possa ser inevitável, você pode pelo menos impedir que a senha seja gravada no arquivo de histórico do shell.O arquivo de histórico deve registrar apenas
xargs darkcoind masternode start
, não a senha.fonte
ignorespace
em$HISTCONTROL
, e então você pode impedir que qualquer comando de ir para a história shell prefixando o comando com um espaço.Como outros já declararam, examine seu controle do histórico do shell para ocultar as informações do histórico.
Mas uma coisa que ninguém parece ter sugerido ainda é montar
/proc
com ohidepid
parâmetro Tente modificar sua/proc
linha/etc/fstab
para incluir dahidepid
seguinte maneira:fonte
Você pode manter a senha fora do histórico do seu shell executando o comando a partir de um novo processo do shell, que você encerra imediatamente. Por exemplo:
Verifique se
sh
está configurado para não salvar seu histórico em um arquivo.É claro que isso não resolve os outros problemas, como a senha visível
ps
. Acredito que existem maneiras de odarkcoind
próprio programa ocultar as informaçõesps
, mas isso apenas reduz a janela de vulnerabilidade.fonte
ps
utilitários e similares.Para Bitcoin, a resposta oficial do desenvolvedor é usar o wrapper python fornecido no
contrib/bitrpc/bitrpc.py
( github ):e:
Fonte: # 2318
Desbloquear carteira:
Alterar senha:
https://github.com/bitcoin/bitcoin/tree/master/contrib/bitrpc
Para darkcoin, funciona análogo:
https://github.com/darkcoin/darkcoin/tree/master/contrib/bitrpc
fonte