Existe algum risco usando cat para ler um valor de um arquivo não confiável

2

Eu preciso obter um valor variável lendo o arquivo de texto enviado pelo usuário.

Eu estou fazendo a partir do script de um sistema:

resourceVersion='cat userFile.txt'
mkdir $resourceVersion
...

O conteúdo deste arquivo pode prejudicar o sistema de alguma forma quando eu uso mais tarde a variável $resourceVersion , como argumento para outros comandos?

    
por Johnny Everson 22.07.2012 / 21:59

2 respostas

8

Regra 1 de como escrever código de segurança: Você precisa limpar sua entrada de usuário .

No mínimo passe -- para sua cláusula mkdir para evitar manipular switches.

Atualmente, ele pode ser usado para criar diretórios em locais arbitrários com permissões arbitrárias.

Por si só, provavelmente não vai levar a uma violação, mas você pode passar coisas como:

-m 0777 /var/lib/mysql/newdb

Para criar um novo banco de dados mysql, qualquer um poderia escrever.

Existe também um ataque de negação de serviço, porque cada espaço é tratado como um novo diretório. Assim, você poderia passar 32760 novos caminhos para serem processados.

Finalmente, alguns pseudo sistemas de arquivos são sensíveis a novos diretórios de maneiras que você não espera. No fedora, por exemplo, diretórios como /sys/fs/cgroup/newcgroup poderiam criar um novo cgroup. Também no subsistema LIO, escrever diretórios em /sys/kernel/config/target poderia ser usado para exportar um dispositivo de bloco através de uma rede iscsi (então todo o conteúdo do seu dispositivo poderia ser copiado).

Então, não, não faça isso.

    
por 22.07.2012 / 22:47
1

No momento, posso adicionar uma pasta gravável ao mundo se userFile.txt contiver -m 777 /.secretstorage
Na minha opinião, isso já é ruim o suficiente para não usar tal construto.

É correto que, com o script atual que você postou, não é possível injetar um comando diferente.
Mas, dependendo de quais outros comandos você usará, essa variável pode ficar muito pior.
Por exemplo, se você planeja limpar no final do programa usando essa variável e rm ...

    
por 22.07.2012 / 22:49