Segurança no X Window System

Melhorando a segurança do X usando o mit-magic-cookie e o xauth.

Por Ben Gross & Baba Buehler
Beckman Institute System Services
bgross@uiuc.edu, baba@beckman.uiuc.edu

Informações baseadas no X Window System Administrator's Guide, de Linda Mui e Eric Pearce, da O'Reilly & Associates, o FAQ do comp.windows.x, e as notas sobre segurança do X de Mark VanHeyningen, da Indiana University ( http://cs.indiana.edu/X/security/intro.html).

Este documento é parte do Beckman Institute Systes Services Virtual Library


Por quê magic cookies?

A autorização X baseada no xhost que a maioria das pessoas usam é funcional para workstations que são usadas apenas por um usuário. Para sistemas multi-usuários e ambientes de laboratório, entretanto, o xhost possui alguns problemas sérios.

Além de permitir que alguém bagunce o seu display X com figuras do Ren e Stimpy, o xhost permite que qualquer um que possa fazer o logon (ou invada) no seu sistema execute programas em seu display. Os ataques podem incluir:

  1. destruir algumas (ou todas) as janelas,
  2. abrir novas janelas na sua tela,
  3. visualizar o conteúdo de sua tela remotamente,
  4. fazer um registro de todas as teclas pressionadas (incluindo senhas) e,
  5. gerar eventos X espúrios remotamente.

A maioria destes pode ser feito sem aviso e sem deixar traços.

Apesar disto, o xhost ainda é a única segurança X que a maioria das pessoas usam. Os benefícios do xhost são diretos: é facil executar programas X em sistemas remotos e apresentar os mesmos localmente. Escreva:

% xhost +powdered.toast.com

e faça o logon em powdered.toast.com, e você pode rodar qualquer programa X em powdered.toast.com e mostrar o mesmo localmente. Isto, entretanto, também permita que qualquer um que esteja logado em powdered.toast.com usar (ou abusar) o display local de sua workstation.

O xauth pode evitar isto. A execução de programas X remotos é um pouco mais complexa, mas é o que chega mais perto de garantir que você é a única pessoa que pode executar programas em seu display X local.

Deve se notar que o mit-magic-cookie só funciona com o X11R4 e o X11R5.


Como ele funciona

O xauth funciona criando um arquivo chamado .Xauthority em seu diretório $HOME. Este arquivo contém os nomes de displays seguidos por um número hexadecimal (o magic cookie). O servidor X lê o magic cookie deste arquivo e então exige que qualquer programa X que você roda forneaça este mesmo magic cookie.

Os programas do seu cliente X também lêem o arquivo .Xauthority para obter o magic cookie. O cliente envia o magic cookie para o servidor, que então verifica se este combina com o que está em sua memória. Se eles forem idênticos, o cliente tem permissão para abrir uma janela no servidor X.

Se você está rodando programas X na mesma máquina em que o servidor X está, então a segurança é trivial, por que ambos programas possuem acesso ao arquivo .Xauthority. As permissões do arquivo .Xauthority devem ser 600, teoricamente evitando que qualquer outra pessoa em seu sistema consiga ler os magic cookies.

Se você percisa executar programas X em um host remoto, você primeiro deve propagar o magic cookie do seu display local para o host remoto. O xauth e o X fornecem os meios de fazer isto.


Configurando

Passo 1 - Criando magic cookies

O primeiro passo é criar um arquivo .Xauthority com um magic cookie para seu host. Isto é feito mais facilmente no seu arquivo .login ou .kshrc. Este código também pode ser incluído em um arquivo .xserverrc.

O programa xauth cria e administra o arquivo .Xauthority. Certifique-se que o diretório /usr/bin/X11 (ou outro diretório em que os binários do X se encontram no seu computador) está em seu path. É melhor configurar o path X nos seus arquivos de inicialização, ou em .profile, .kshrc ou .cshrc, uma vez que estes arquivos são lidos pelos comandos rsh. Você irá usar o rsh para executar programas X em hosts remotos. Segue um código de exemplo usando o perl e o sh ou ksh para o .profile de seu Korn Shell ou Born Shell:

Uma das melhores formas que encontramos para gerar um número aleatório não-reproduzível com saída em hexadecimal é usar comandos comuns do sistema e o gerador de somas criptográficas MD5. O MD5 pode ser baixado de ftp.cert.org.

Um exemplo para o csh usando estatísticas do sistema e o MD5.

set randomkey=`(ps -ael; nfsstat -m; nfsstat -f; netstat -s; netstat -m; date) | md5sum`
xauth add `hostname`/unix:0 . $randomkey
xauth add `hostname`:0 . $randomkey

Um equivalente para o sh ou ksh seria:

randomkey=$( (ps -ael; nfsstat -m; nfsstat -r; netstat -s; netstat -m; date) | md5sum)
xauth add $(hostname)/unix:0 . $randomkey
xauth add $(hostname):0 . $randomkey

Nota: estas opções de linha de comando devem funcionar com as variantes BSD e System V. Um exemplo csh usando perl.

set randomkey=`perl -e 'for (1..4) { \
	srand( time + $$ + $seed); \
	printf("%4.5", ($seed = int(rand(65536)))); } \
print "\n";'`

xauth add 'hostname'/unix:0 . $randomkey
xauth add 'hostname':0 . $randomkey

Uma nota importante: o magic cookie precisa ser uma string de dígitos hexadecimais e deve ter um comprimento par. O MD5 faz isto automaticamente.

Os benefícios aqui são:

O comando "xauth add" armazena o magic cookie em seu arquivo .Xauthority, no seu diretório $HOME, e garante que as permissões serão -rw-------, restringindo o acesso ao arquivo.

Passo 2 - habilitando autenticação com o xauth

Agora que temos um arquivo .Xauthority com seu magic cookie, precisamos informar o servidor X a usar este para autenticar programas X que querem usar seu display. Você pode fazer isto passando o argumento -auth quando estiver iniciando o servidor X.

Se você estiver usando o xinit no seu .login, você pode alterar a linha para algo como:

xinit $HOME/.xinitrc -- -auth $HOME/.Xauthority

É importante usar o argumento "--" para o xinit, este informa ao xinit para passar os argumentos seguintes ao servidor X. Algo como

xinit $HOME/.xinitrc -- -auth $HOME/.Xauthority

Provavelmente irá funcionar, enquanto

xinit $HOMW/.xinitrc -auth $HOME/.Xauthority

não irá.

Se você usa um arquivo .xserverrc para iniciar seu servidor X, acrescente a opção -auth:

exec /usr/bin/X11/X -auth $HOME/.Xauthority

Uma vez que o servidor X seja iniciado com o parâmetro -auth, ele irá usar os magic cookies para verificar os programas que querem usar o seu display X. Exceto se aind houverem hosts autorizados pelo xhost.

Passo 3 - Limpar a lista de autorização do xhost

O xhost substitui o xauth, por isto, se você ainda tem algum host habilitado pelo xhost então o esquema de magic cookie não ajudará em nada.

Verifique seu arquivo /etc/X0.hosts para ver se existem hosts que serão automaticamente autorizados, ou coloque um

xhost -

em seu arquivo .login ou equivalente. Este procedimento irá efetivamente desabilitar a autorização do xhost, passando toda a autorização para o xauth com os magic cookies.

O X Window System Administrator's Guide adverte contra a remoção total ou a desabilitação do xhost por que isto seria o equivalente a ter executado um xhost +, liberando o acesso para todos os hosts. Usando o "xhost -", você deixa o xhost habilitado, mas esvazia a lista de hosts autorizados, de forma que toda a autorização acontece através do xauth e os magic cookies.

Neste ponto, você deve estar seguro para operar o X em uma workstation. Você deve poder executar qualquer cliente em seu host e eles devem ler seu arquivo .Xauthority. Se seu diretório $HOME é compartilhado entre vários hosts (por exemplo, via montagem NFS), você pode rodar clientes de qualquer destes hots, por que eles terão todo acesso ao arquivo .Xauthority em seu diretório home compartilhado.

Passo 4 - executando clientes em hosts remotos (xauth/rsh)

Para poder executar clientes em hosts remotos, você deve ter uma forma de passar o magic cookie para aqueles clienets, de forma que eles possam se autenticar com seu servidor X local. O xauth fornece uma forma de criar um arquivo .Xauthority em seu host remoto de forma que clientes remotos possam ler o magic cookie.

Você deve primeiro certificar-se que você tem seu host local no arquivo .rhosts ou /etc/hosts.equiv na máquina remota, ou de outra forma o rsh não irá funcionar. Certifique-se também de ter o path para o xauth (normalmente /usr/bin/X11) configurado no .cshrc no host remoto.

Agora você está pronto para propagar o magic cookie para o host remoto. Por exemplo, se você está no host ren e quer executar um cliente em stimpy, você primeiro deve escrever:

ren% xauth extract - ren:0 | rsh stimpy xauth merge -

Este comando afz o pipe do magic cookie para o xauth em stimpy o que irá criar um novo arquivo .Xauthority com o magic cookie para o display ren:0. Agora você pode executar

ren% rsh stimpy /usr/bin/X11/xterm -display ren:0

e o xterm no stimpy irá ler o novo .Xauthority e encontrará o magic cookie que irá permitir que seja apresentado no display de ren.

Passo 5 - Automatizando com o xrsh

Os passos acima foram combinados em um sistema chamado xrsh que está disponível como /contrib/xrsh-5.4.shar em ftp.x.org. O xrsh automaticamente faz o trabalho com o xauth para você, bem como semper usa o csh, uma vez que o ksh não lê nenhum arquivo de init para um rsh, deixando você sem um path configurado. O rsh fornece um comando xrlogin, bem como outras precauções de segurança. Nós recomendamos fortemente a instalação do mesmo.

Usando o xrsh, e assumindo que o path para os binários do X está configurado em .cshrc no host stimpy, o código acima se torna:

ren% xrsh -auth xauth -pass ENV stimpy xterm

Certifique-se de incluir o -auth xauth por que o padrão do xrsh é usar a autenticação xhost. Você poe criar um alias xrsh que inclua -auth xauth -pass ENV:

ren% alias xrsh 'xrsh -auth xauth -pass ENV \!*'

E então usar:

ren% xrsh stimpy xterm

Eset comando deve permitir você conseguir qualquer coisa que anteriormente era feita com o xhost. Mais ainda, você ainda pode usar o xhost se você achar que precisa, apesar de isto comprometer instantaneamente qualquer segurança que você tenha configurado com o xauth. Se você achar necessário usar o xhost, recomendamos que execute um

xhost -

imediatamente após terminar o que quer que tenha exigido o xhost, ou simplesmente fazndo logoff e login novamente, o que irá gerar um novo magic cookie e reiniciar o X com a autorização xauth reiniciada.


Mais segurança X

Por uma razão desconhecida aos autores, muitos sistemas vem com toda a segurança de X Window desabilitada. O arquivo que controla as permissões de proprietário e grupo dos dispositivos relacionados ao X Window é a tabela de framebuffer (/etc/fbtab). Leia a página man fbtab(5) para mais informações.

Do faq de comp.windows.x: "...isto permite que qualquer um que possa logar em usa workstation espiar sua sessão de windowing acessando o frame-buffer diretamente, ou, menos como um problema de vriacidade mas talvez mais perturbador, [acidentalmente] iniciar uma segunda sessão X em seu display console."

O formato de seu sistema pode variar. Temos estas linhas descomentadas nos /etc/fbtab em nossos Suns:

/dev/console      0600      /dev/kbd:/dev/mouse
/dev/console      0600      /dev/fb
/dev/console      0600      /dev/cgsix0
/dev/console      0600      /dev/audio
/dev/console      0600      /dev/audioctl

O servidor X local armazena arquivos em /tmp/.X11-unix. O arquivo X0 é um descritor de socket usado pelo X para se conectar ao servidor local. Para certificar-se que nenhum outro usuário possa excluir seu arquivo X0, configure o sticky bit no diretório.

chmod 1777 /tmp
chmod 1777 /tmp/.X11-unix

Caso você não tenha permissões de teclado para seu /dev/kbd, vocêpode querer utilizar a opção Secure Keyboard de seu xterm. Esta opção pode ser acessada pressionando a tecla Ctrl e pressionando o botão 1 do seu mose (pode variar de sistema para sistema). Esta funcionalidade irá evitar que outros usuários usem a solicitação de protocolo GrabKeyboard(). A tela deverá reverter suas cores, senão, certifique-se que ninguém está olhando enquanto você escreve. Esta funcionalidade só pode ser usada em uma janela por vez, por isto é usada principalmente para digitar dados sensíveis, como sua senha, definitivamente para sua senha de root.


A implementação destas medidas significa um longo trecho percorrido para garantir que sua workstation X está protegida de ataques através do servidor X. A segurança padrão do X é simplesmente inadequada para evitar ataques ou perda de dados.

1