Quão seguro é criar um arquivo arbitrário?

77

Às vezes, quando eu catarquivo um arquivo binário por engano, meu terminal fica distorcido. Nada que um rápido resetnão pode consertar, mas um invasor não poderia criar teoricamente um arquivo que, quando exibido em um terminal, executaria algum código arbitrário? Através de uma exploração no emulador de terminal ou não.

Gunchars
fonte
3
Às vezes, quando faço isso, meu shell diz no final "<garbage> comando desconhecido". Isso me faz pensar se isso é realmente possível.
26413 Keith
5
Havia exploits para o emulador de terminal, por exemplo linuxsecurity.com/content/view/104657 ou securityfocus.com/bid/6936/discuss por isso não é necessário seguro especial
Ulrich Dangel
1
É por isso que é melhor usar algo que não aceita arquivos binários (como more) ou tem reconhecimento de terminal ( less) para examinar o conteúdo dos arquivos. Além de não colocar o terminal em um estado estranho, o arquivo inteiro não será exibido de uma só vez.
Blrfl
O stty sanecomando redefine um xterm (ou similar) que foi alterado para, por exemplo, um conjunto de caracteres diferente.
Thorbjørn Ravn Andersen 01/01
moshdocumentação tem alguns pensamentos sobre isso: mosh.mit.edu/#techinfo
Max Ried

Respostas:

34

Se essa saída pode ser explorada depende do programa do terminal e o que esse terminal faz, dependendo dos códigos de escape que estão sendo enviados. Não estou ciente dos programas de terminal com esses recursos exploráveis, e o único problema agora seria se houver um estouro de buffer desconhecido ou algo assim, que possa ser explorado.

Em alguns hardwareterminais mais antigos , isso pode ser um problema quando você programa, por exemplo, teclas de função com esse tipo de sequência de escape, armazenando uma sequência de comandos para essa chave no hardware. Você ainda precisará pressionar uma tecla física para ativar isso.

Mas sempre há (como Hauke ​​tão marcadamente marcado como 'braindead') pessoas dispostas a adicionar esse recurso se isso resolver um problema para eles, sem entender a brecha que eles criam. De acordo com minha experiência com software de código aberto, devido aos muitos olhos que olham para o código, é menos provável que isso aconteça com o código fechado. (Lembro-me que no programa de e-mail no Irix da Silicon Grahpics, em meados dos anos dezenove, você podia incluir comandos a serem executados na máquina receptora, caminhos reais para executáveis, ...)

Anthon
fonte
3
"você pode incluir comandos a serem executados na máquina receptora" Você quer dizer algo como incluir em um email VBScript que chama o Host de Script do Windows? :)
um CVn
Não, exatamente, você pode iniciar um executável que já estava na máquina, como reproduzir um som. Não me lembro da sintaxe exata (que foi há quase 20 anos) nem se você pode desativar esse 'recurso' em uma configuração. Nos divertimos um pouco com os vídeos de reprodução automática armazenados em nossa rede.
Anthon
Você não está falando sobre o NeWS, está? O IIRC SGI foi um dos últimos impedimentos.
Luser droog
@luserdroog Sem este era o programa padrão GUI baseada correio sob Irix
Anthon
1
@Anthon Eu não tenho certeza se ainda é possível, mas a possibilidade de usar códigos de escape para obter um terminal para "repetir" o texto vindo do writecomando - executando assim comandos / scripts como o usuário proprietário do terminal. É supostamente a razão pela qual muitos recomendam desativar as mensagens mesg -npara os usuários na maioria das vezes e para root sempre . AFAIK, isso foi realmente feito - embora eu não saiba se alguma vez foi explorado. Assim, o texto aleatório de um catexecutável ted talvez pudesse ser executado.
Baard Kopperud
33

A maioria dos emuladores de terminal retornará alguma resposta, se receberem determinadas seqüências de escape (consulte a documentação das seqüências de controle do xterm ). Por exemplo, você pode enviar \e[0cpara um emulador semelhante ao VT100 e ele enviará de volta os atributos do dispositivo, algo como \e[?1;2c (provavelmente é o que Keith observou). Mas essas respostas não são seqüências arbitrárias. Ainda assim, ter um executável nomeado 2cem algum lugar do sistema que faça algo fatal é uma má ideia.

Atualização: os riscos são de fato maiores do que eu pensava, devido à possibilidade de definir o título de uma janela xterm e devolvê-lo usando as seqüências de escape apropriadas ( http://www.securityfocus.com/bid/6940/ ) . Em contraste com o exemplo acima, o título pode ser uma sequência quase arbitrária.

Uwe
fonte
Isso já está cortando muito perto.
Gunchars
Há um recurso ainda mais antigo - 'mensagem de resposta', enviada em resposta ao caractere ENQ (Ce). Em um VT100 real, ele é definido pelo usuário no menu SETUP do terminal; talvez há emuladores de terminais que permitem configurá-lo remotamente ...
sendmoreinfo
16

Isso altera o título do terminal no GNOME Terminal 3.6.1, a menos que seja substituído por algo como PS1 :

printf "\033]2;Script Kiddie was here\007"

Agora abra uma nova janela do Terminal GNOME para testar a catversão:

printf "\033]2;Script Kiddie was here\007" > test.bin
cat test.bin

Sim, isso também define o título do terminal.

Costumava haver um problema de segurança com um código de escape, resultando na impressão do título na linha de comando , para que você pudesse efetivamente criar um arquivo, que quando cated seria impresso (não tenho certeza se você poderia inserir uma nova linha) comandos arbitrários. Ai!

l0b0
fonte
8

Embora o uso catpossa não resultar na execução do código, os códigos de escape serão processados ​​para que você possa ser facilmente enganado ao pensar que o script é inofensivo quando, na verdade, é malicioso.

Aqui está um exemplo de comando que você pode executar que criará um shell script "malicioso":

echo -e '#!/bin/sh\necho "...doing something bad here..."\nexit\n\033[A\033[Aecho "Hello dear reader, I am just a harmless script, safe to run me!"' > demo.sh
chmod a+x demo.sh

Quando você inspeciona o arquivo, ele parece inofensivo o suficiente:

$ cat demo.sh
#!/bin/sh
echo "Hello dear reader, I am just a harmless script, safe to run me!"

Mas você deve realmente executá-lo ...

$ ./demo.sh 
...doing something bad here...

O script funciona incluindo códigos de escape brutos para mover o cursor algumas linhas, para que o restante do script seja escrito por cima do código malicioso, ocultando-o.

Quase qualquer outro programa irá revelar o script para o que é. Somente os programas que não processam o conteúdo do arquivo (como cat, moree less -r) produzirá a saída enganosa.

Observe que taile headtambém produz a mesma saída enganosa. Usar "less + F" é, portanto, mais seguro que "tail -f".

Malvineous
fonte
Isto é bastante problemático ... Você pode ver o que está realmente acontecendo, executando echo $(cat demo.sh), cat demo.sh | grep . --color=yes(Nota: o --color=yesé o que está mostrando o código "malicioso" aqui) ou o build-in cat -v demo.sh.
Charlie
Verdadeiro ou falso, é uma resposta para uma pergunta diferente: quão confiável é a catexibição do conteúdo do arquivo .
Incnis MRSI
@IncnisMrsi: Não é realmente uma resposta para uma pergunta diferente. Esta resposta adverte que o gato mostrará códigos de escape e fornece um exemplo simples com apenas um tipo de código de escape, mas existem muitos outros. Quando combinados com determinados terminais, eles podem remapear chaves, sobrescrever arquivos e, em teoria, até executar comandos . Assim que você perceber o perigo de exibir códigos de escape, entenderá que às vezes pode não ser seguro para catum arquivo arbitrário, como a pergunta!
Malvineous
6

Definitivamente, experimentei xterminserir caracteres arbitrários em si, como se eu os tivesse digitado. E, de vez em quando, isso aparentemente inclui caracteres de nova linha, para que eu tenha ngwerm:0riu: command not founduma resposta. Não vejo razão para que alguém não possa criar um arquivo que envie comandos específicos e prejudiciais. Então, sim, pelo menos alguns terminais são suscetíveis a ataques com impacto arbitrário.

Kilian Foth
fonte
2

Bem, um emulador de terminal basicamente simplesmente imprime os caracteres enviados a ele.

Qualquer coisa além de simplesmente imprimir um caractere na posição atual, como definir uma nova posição, mudar de cor, mudar de título etc., é feito por seqüências de escape.

O conjunto de seqüências de escape suportadas geralmente consiste em padrões bem definidos como o ANSI , que não define uma maneira de iniciar outros processos. Embora seja possível implementar essa sequência, não conheço nenhum emulador de terminal que permita intencionalmente tais coisas.

Em teoria, um bug como um estouro de buffer pode ser usado para disparar funcionalidades arbitrárias. Mas isso seria possível em praticamente qualquer outro binário também.

michas
fonte
0

Em geral, geralmente não há risco de criar um arquivo arbitrário. Meu método usual para analisar um arquivo é o seguinte:

$ file <mystery file>
$ strings <mystery file> | less

O que foi dito acima me permite determinar o tipo de arquivo por meio do filecomando, e o stringscomando me permite despejar qualquer sequência identificável de possíveis arquivos binários que não tenho certeza sobre sua linhagem.

exemplo

saída de arquivo
$ file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, stripped
saída de strings
$ strings /bin/ls|less
...
across
vertical
single-column
force
never
auto
if-tty
slash
%b %e  %Y
%b %e %H:%M
long-iso
main
posix-
sort_files
?pcdb-lswd
dev_ino_pop
Try `%s --help' for more information.
Usage: %s [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort.
Mandatory arguments to long options are mandatory for short options too.
  -a, --all                  do not ignore entries starting with .
  -A, --almost-all           do not list implied . and ..
...
slm
fonte
3
A execução de strings em um arquivo desconhecido também pode ter consequências problemáticas. lcamtuf.blogspot.fi/2014/10/…
Jan Wikholm 26/10
@IncnisMrsi - leia a primeira frase !!!!
slm
OK, retirando minha afirmação anterior, a resposta é curta, usando terminologia confusa, infundada e evidentemente incompleta. Observe que, em segurança, “arbitrário” ≠ aleatório, conforme distribuído no seu sistema operacional favorito.
você precisa saber é o seguinte