Configuração para proteger o gnome-terminal do registro de chaves

15

Parece fácil registrar as teclas digitadas de todos os processos do mesmo usuário. Um keylogger básico é 'xinput'.

xinput test-xi2

O comando gera o log de todas as teclas pressionadas. Infelizmente, isso inclui senhas no gnome-terminal. O Google sugeriu que pegar o teclado pode impedir que outras janelas capturem os pressionamentos de tecla.

Existe uma maneira de impedir o log do XI2 no terminal gnome? Ou existe um terminal X que possui esse recurso?

yanychar
fonte
É esta a solução?
Radu Rădeanu

Respostas:

13

Não é possível, pois as teclas passadas para o servidor X estarão disponíveis para xinput / qualquer programa arbitrário. (De fato, faz parte do design). Novos servidores de exibição como Wayland e Mir estão corrigindo esses problemas de segurança no X. A única solução real seria usar o Wayland ou o Mir em vez do X. Esta postagem do blog detalha esse problema.

Ramchandra Apte
fonte
Então entrada para gksu para senha também vai para xinput?
yanychar 24/09/13
11
@yanychar yup, na verdade eu descobri esse método de registro de chaves através desta postagem no blog: theinvisiblethings.blogspot.in/2011/04/… (até fiquei surpreso na primeira vez que li a postagem no blog)
Ramchandra Apte
2
X11 realmente tem modo não confiável que você pode usar para impedir que programas de acessar "maus" extensões - x.org/wiki/Development/Documentation/Security
Michał Zielinski
-1

Na verdade não. Mesmo que você consiga, de alguma forma, pegar o teclado no X (não sei se isso é possível, duvido disso), um utilitário de keylogger executando como root sempre terá acesso ao teclado.

janeiro
fonte
4
O comando acima pega o teclado no X sem privilégios de root. Portanto, é trivial instalar um keylogger em um desktop ubuntu. A questão é como evitar isso.
yanychar
-3

Como outros disseram aqui, não é possível proteger apenas um programa como o gnome-terminal ou outro terminal do registro de chaves, apenas se você restringir os usuários padrão a executar qualquer registrador de chaves ou se você parar / pausar qualquer processo do registrador de chaves.

Em seguida, mostrarei como você pode fazer isso em caso de xinputcomando, mas os mesmos métodos podem ser usados ​​para qualquer outro registrador de chaves. Se um registrador de chaves usa o xinputcomando, não é necessário aplicar o método nele, desde que você o aplique xinput.

1. Restrinja os usuários padrão para usar o xinputcomando

Você pode restringir os usuários padrão a usar o xinputcomando usando o seguinte comando:

sudo chmod go-x /usr/bin/xinput

2. Restrinja os usuários padrão para usar o xinputcomando com test-xi2argumento

Você pode restringir os usuários padrão a usar o xinputcomando com test-xi2argumento escrevendo um wrapper para este comando. Para fazer isso, entre no terminal e siga as instruções abaixo:

  • Obtenha privilégios de root:

    sudo -i
    
  • Mova o xinputarquivo para outro diretório que não esteja no CAMINHO de nenhum usuário (por exemplo /opt):

    mv /usr/bin/xinput /new/path/to/xinput
    
  • Crie seu wrapper para xinputcomando em /usr/bin:

    gedit /usr/bin/xinput
    

    Adicione o seguinte script dentro:

    #!/bin/bash
    if [ "$@" != "${@/test-xi2/}" -a "$(whoami)" != "root" ]; then
        echo "`basename $0` $@: Permission denied"
    else
        /new/path/to/xinput $@
    fi
    

    Salve o arquivo e feche-o.

  • Torne o novo wrapper executável:

    chmod +x /usr/bin/xinput
    

Enquanto o primeiro método é a segurança, usando o segundo método, o usuário ainda pode contorná-lo chamando o original xinputdiretamente se ele souber seu novo local.

3. Parar / pausar qualquer xinputprocesso

Você pode interromper ou pausar qualquer xinputprocesso antes para inserir uma senha ou qualquer outra coisa que não deseja que seja registrada. Para fazer isso, adicione a seguinte função bash no final do seu ~/.bashrcarquivo:

processof () {
    xinput_pids=" $(pidof $1) "
    if [ "$xinput_pids" = "  " ]; then
        echo "Nothing to stop/pause/continue. $1: no such process!"
        return
    fi
    for pid in $xinput_pids; do
        case $2 in
        "stop") 
            kill $pid
            echo "$1: stopped"
            ;;
        "pause")
            kill -stop $pid
            echo "$1: paused"   
            ;;
        "continue")
            kill -cont $pid
            echo "$1: continue"
            ;;
        *)
            echo "$1 is runnig"
            ;;
        esac
    done
}

Agora, depois de reabrir o seu terminal, quando quiser, usando esta função, você pode:

  • parar / matar todos os xinputprocessos:

    processof xinput stop
    
  • pausar todos os xinputprocessos:

    processof xinput pause
    
  • retomar todos os xinputprocessos:

    processof xinput continue
    

De fato, com esta função, você pode interromper / pausar qualquer processo que desejar antes de executar algo (como digitar a senha):

processof [process_name] [stop|pause|continue]

Se você não sabe como detectar um keylogger ativo no seu sistema, consulte:

Talvez esses métodos não sejam as melhores soluções, mas espero ter uma idéia do que você pode fazer ...

Radu Rădeanu
fonte
5
O xinput é apenas um exemplo de um keylogger. A questão é proteger as entradas de todos os keylogger possíveis.
yanychar 24/09
5
Qualquer programa pode se conectar ao servidor X através de soquetes e keylog, nem é necessário que o key logger use um programa externo.
Ramchandra Apte
3
@ RaduRădeanu, sua solução é ineficaz e inútil. xinputnão é sequer SUID (-rwxr-xr-x 1 root root 48504 15 agosto de 2012 / usr / bin / xinput)
Ramchandra Apte
11
@ RaduRădeanu Porque você não precisa do xinput para o keylog. (ele não precisa de um comando externo nem a necessidade programa malicioso para ser SUID) sua solução irá simplesmente permitem controlar a execução de xinput
Ramchandra Apte
3
O exemplo mais básico para provar que é ineficaz: copie uma versão de estoque do (ubuntu) xinput de um pendrive, faça o download da web ou envie por e-mail para si mesmo e execute-o em sua pasta pessoal. O mesmo efeito que o uso de / usr / bin / xinput irrestrito.
allo