Leitura e análise seguras de uma string de um parâmetro ou arquivo no bash

2

Eu tenho escrito um número de scripts bash ultimamente que obtém variáveis de um parâmetro ou de um arquivo. Alguns dos scripts são executados como root (usando sudo)

Isso está no meu bloco de anotações, portanto, não há outros usuários que possam causar problemas de segurança nessa situação, mas ...

Eu gostaria de poder escrever um roteiro que eu possa lançar na vida selvagem.

Provavelmente, o que essa questão faz é defender a necessidade de não escrever nada no bash, onde o root / sudo está envolvido e a entrada / parâmetros não são confiáveis.

Além de bloquear tudo com sudoers, existe uma maneira de ler uma string arbitrária em um programa bash e analisá-la sem permitir que o bash a expanda, potencialmente executando algo ao longo do caminho?

Não vejo qualquer solução para defender-me contra um parâmetro falso.

Para um arquivo, pode haver um jeito, mas não é simples.

A string pode ser inserida com segurança no script usando leitura, mas, uma vez em uma ou mais variáveis, não vejo nenhum método de acessá-la que não envolva uma expansão de variável potencialmente perigosa.

Eu acho que seria possível ler de um arquivo usando read -n 1 para obter um caractere por vez em um loop em uma matriz. Isso deve prejudicar praticamente qualquer coisa, mas é um pouco complicado ter de remontar tudo o que é característico por caractere depois.

Estou pensando em inserir como:

'$ (rm -rf ./*)' ou 'eval shutdown -h now'

ou similar dado como entrada que seria executado quando uma variável que o continha fosse referenciada. Se o script estava sendo executado como root, isso poderia ser um problema real!

Alguma idéia de como abordar essa questão além de "Obter uma linguagem de programação real"?

    
por Joe 16.03.2013 / 00:29

1 resposta

3

É difícil responder isso sem saber que tipo de informação deve ser fornecida nesse arquivo. O fato de o script estar armazenado em um sistema com vários usuários não é automaticamente um problema de segurança. Por que eles devem (ser capazes de) fornecer informações para outros usuários?

No entanto, você pode ler com segurança uma linha de um arquivo por read -r line . E se você só precisa de dados do tipo foo=bar , então você pode facilmente verificar a linha de caracteres inválidos (ou estruturas) por [[ =~ ]] .

Se você não está limitado a usar um único arquivo, então uma solução fácil pode ser obtida do software do DJB: um arquivo por variável. As variáveis podem então ser definidas por algo como:

for varname in ${vars[@]}; do
  if [ -f "${path_to_var_files}"/$varname ]; then
    eval $varname='"$(cat '"${path_to_var_files}"/$varname"')"'
  fi
done

... se rastrear novas linhas não são importantes.

Muitos problemas (para o sistema, não para o respectivo usuário) podem ser resolvidos minimizando o código executado sob o sudo. Não deixe um script sudo fornecer o arquivo. Deixe que um script de nível de usuário forneça o arquivo e faça as chamadas sudo. scripts sudo devem ter uma interface clara com entrada fácil de ser verificada.

    
por 16.03.2013 / 02:32