Existem métodos para verificar o que você está realmente executando a partir de um script bash?
Digamos que seu script bash está chamando vários comandos (por exemplo: tar
, mail
, scp
, mysqldump
) e você está disposto a se certificar de que tar
é o real, verdadeiro tar
, que é determinável pelo root
utilizador sendo o dono do arquivo e diretório pai e o único com permissão de escrita e não alguns /tmp/surprise/tar
com www-data
ou apache2
sendo o proprietário.
Claro que eu conheço PATH
e o ambiente, estou curioso para saber se isso pode ser verificado adicionalmente em um script bash em execução e, se houver, como exatamente?
Exemplo: (pseudocódigo)
tarfile=$(which tar)
isroot=$(ls -l "$tarfile") | grep "root root"
#and so on...
bash
shell-script
shell
security
Miloš Đakonović
fonte
fonte
which
não dizer corretamente o quetar
fará, conforme respondido por xhienne,ls
poderia ser hackeado para retornar informações falsas sobre o (s) arquivo (s), se houver. Tambémgrep
pode ser hackeado para retornar informações falsas; isso poderia ser evitado usando a correspondência de shell, mas o shell poderia ser hackeado. E o shell pode ser hackeado para obter resultados erradostype
em primeiro lugar - ou substituído totalmente, pois a substituibilidade do shell foi uma inovação importante do Unix em comparação com os sistemas operacionais de 50 anos de idade. Veja o endereço de Turing de 1984 de Ken Thompson. São tartarugas até o fim.TE
) - que possui um banco de dados com assinaturas (ou seja, mais extenso que uma soma de verificação MD5. Quando o TE está ativo E um arquivo está no banco de dados, você pode escolher se o programa é executado - ou apenas avisa que não corresponde ao banco de dados.Além disso, existem duas outras configurações:TEP
(PATH de execução confiável) eTLP
(PATH LIBrary confiável). Somente os programas no TEP podem ser executados e as bibliotecas podem ser carregadas apenas com o directório está incluído no TLP no Linux I existe algo chamado 'AppArmor' que podem ajudá-lo..Respostas:
Em vez de validar binários que você executará, você poderá executar os binários corretos desde o início. Por exemplo, se você quiser ter certeza de que não vai rodar
/tmp/surprise/tar
, basta executar/usr/bin/tar
no seu script. Como alternativa, defina seu$PATH
valor sensato antes de executar qualquer coisa.Se você não confia em arquivos
/usr/bin/
e em outros diretórios do sistema, não há como recuperar a confiança. No seu exemplo, você está consultando o proprietáriols
, mas como você sabe que pode confiarls
? O mesmo argumento se aplica a outras soluções, comomd5sum
estrace
.Onde é necessária alta confiança na integridade do sistema, são usadas soluções especializadas como o IMA . Mas isso não é algo que você possa usar em um script: todo o sistema deve ser configurado de uma maneira especial, com o conceito de arquivos imutáveis em vigor.
fonte
/bin
vez de/usr/bin
.$PATH
dois caminhos, se necessário, suporte a distribuição múltipla.Se um invasor obteve acesso ao seu sistema e pode modificá-lo
$PATH
(o que não deve ser incluído/tmp
em nenhuma circunstância), é tarde demais para começar a se preocupar com as propriedades dos executáveis.Em vez disso, você deve ler sobre como lidar com uma invasão .
Melhor se concentrar em evitar completamente a intrusão.
Se você possui um sistema em que esse tipo de coisa é importante, pode ser uma boa ideia isolar as partes que precisam ser públicas das partes que precisam ser privadas, além de realizar uma auditoria nos modos de comunicação. entre estes.
fonte
É possível, até certo ponto, verificando o
md5sum
arquivo. Assim, em sistemas que usamapt
gerenciamento de pacotes - no meu caso particular, Ubuntu 16.04 - existe o arquivo/var/lib/dpkg/info/tar.md5sums
, que armazena as somas md5 de todos os arquivos provenientestar
durante a instalação. Portanto, você pode escrever uma instrução if simples que verifique se a saídamd5sum /bin/tar
corresponde ao que está nesse arquivo.É claro que isso pressupõe que o arquivo em si não foi violado. Obviamente, isso só pode acontecer quando o invasor obtém acesso root / sudo, quando todas as apostas estão desativadas.
fonte
/usr/bin/md5sum
?/bin/tar
ou/usr/bin/tar
, é muito provável que ele também possa simplesmente substituirmd5sum
ou/var/lib/dpkg/info/tar.md5sums
. Ou$SHELL
.tar
aponta para um binário diferente, isso funcionará. Quando um sistema é comprometido no nível da raiz, você tem uma opção - ative-o da órbita #Sim, existe um método: o embutido
type
. Ao contrário dowhich
comando que apenas pesquisa no PATH,type
ele informa se o nome do comando é realmente uma palavra-chave reservada, um builtin, um alias, uma função ou um arquivo de disco.Além disso
type -a
, você terá todos os candidatos ao seu comando (da primeira à última escolha):Por fim, se você estiver preocupado apenas com os binários no seu disco, poderá usar
type -Pa
para obter todos os binários no seu PATH (na mesma ordem que acima):Dito isto, por
type
si só não lhe dirá exatamente qual comando será chamado no final. Por exemplo, se vocêtar
é um alias que chama um binário (por exemploalias tar="/tmp/tar"
), entãotype
você diz que é umalias
.fonte
type -a
inclui todos os formulários (por exemplo, alias e programa externo)type
lhe dirá o quanto o bash sabe, mas se estivermos sob o controle de um invasor mal-intencionado, não há razão para acreditar que o que o bash acha que sabe reflete a verdade real. Pelo que você sabe, há umLD_PRELOAD
módulo que intercepta todas as chamadas da biblioteca C que você faz.which
.enable
antes. Eu usei o conselho dessas respostas para executartype enable
para descobrir que é um shell embutido e depoishelp enable
para ver o que ele faz.Você pode verificar quais comandos estão sendo executados exatamente por um script usando
strace
. Por exemplo:Com o seguinte script:
strace
dirá o caminho exato para os comandos executados quando usados com o-e execve
parâmetro:Parâmetros (do strace man):
-f
: Rastreie os processos filhos à medida que são criados pelos processos rastreados atualmente como resultado das chamadas do sistema fork (2), vfork (2) e clone (2). Observe que-p PID -f
anexará todos os encadeamentos do processo PID se ele for multiencadeado, não apenas o encadeamento com thread_id = PID.-e trace=file
: Rastreie todas as chamadas do sistema que usam um nome de arquivo como argumento. Você pode pensar nisso como uma abreviação para a-e trace=open,stat,chmod,unlink,...
qual é útil ver quais arquivos o processo está fazendo referência. Além disso, o uso da abreviação garantirá que você não se esqueça de incluir acidentalmente uma chamada como lstat na lista.fonte
strace
isso não tenha sido subvertido.O sistema operacional Linux é baseado em arquivos e muitos comandos executados no linux provavelmente resolverão algumas alterações nos arquivos localizados em sua máquina. Por isso, talvez seja a melhor solução para o seu problema. Você pode testar seus comandos quanto a alterações no sistema de arquivos antes que ele seja executado.
Existe um comando 'strace' que decompila seu comando em partes ...
Se você realmente deseja aprofundar, deseja fazer o check-out dos descompiladores para os scripts que serão executados. Em outras palavras, você deve verificar a interpretação do montador desse comando. Para festança lá
objdump -d
. Os scripts bin do Linux são criados principalmente com aC
linguagem de programação, portanto, use um bomC
descompilador.fonte