Bash script arg0 vulnerabilidade?

2

É possível alterar o argumento $ 0 de um script shell (script bash) explicitamente durante a execução do script?

Considere o seguinte script:

readonly SCRIPT_HELP="$(cat <<EOF 
Usage: $(basename "$0") [-h]
EOF 
)" 

echo "${SCRIPT_HELP}"

É possível passar outra coisa como um argumento 0 para este script bash, então a avaliação $(basename... seria executada com algum código fornecido pelo usuário (potencialmente prejudicial)?

E, geralmente, se é possível explorar o fato de que o argumento 0 não é higienizado corretamente em um script de shell específico?

    
por ddnomad 06.06.2017 / 03:45

2 respostas

2

É trivialmente possível decidir o que $0 deve ser. Basta criar um link:

$ cat foo.sh
#! /bin/bash
readonly SCRIPT_HELP="$(cat <<EOF
Usage: $(basename "$0") [-h]
EOF
)"

echo "${SCRIPT_HELP}"
$ ./foo.sh
Usage: foo.sh [-h]
EOF
$ ln -s foo.sh bar.sh
$ ./bar.sh
Usage: bar.sh [-h]
EOF

Neste caso particular, não, não imagino que seja possível usar isso para qualquer grande vantagem. "$0" e SCRIPT_HELP são citados quando usados (dentro de substituições de comandos aninhados e heredocs, mas ainda assim são citados), e eles não estão sendo eval ed.

$ ln -s ./foo.sh '"; echo rm -rf ~; echo"'
$ ./\"\;\ echo\ rm\ -rf\ \~\;\ echo\"
Usage: "; echo rm -rf ~; echo" [-h]
EOF
    
por 06.06.2017 / 04:21
3

$0 pode ser o que o chamador do script quiser. Este é o caminho para o script e o chamador pode fazer uma cópia ou link para o script em qualquer local.

No entanto, isso não é uma vulnerabilidade em si, a menos que o script esteja sendo executado com mais privilégios do que o responsável pela chamada. A menos que o executável do script seja privilegiado, o chamador pode executar um programa diferente. Pode se tornar uma vulnerabilidade se o próprio chamador for privilegiado e puder ser convencido a passar um% diferente% co_de.

Se o script estiver sendo executado com privilégios, o que $0 pode ser depende do método usado para elevar privilégios. Se o script for invocado por meio de um link simbólico para um executável setuid, então $0 pode ser arbitrário (no entanto, a maioria dos sistemas recusa executáveis setuid).

Independentemente da falta de implicação de segurança na maioria dos cenários neste caso específico, o seu script não é totalmente robusto contra o $0 arbitrário. As aspas duplas em $0 fazem com que o valor seja usado como está (enquanto um "$0" sem aspas o trataria como uma lista de padrões de curingas). Mas quando o comando $0 vê esse valor como um argumento, ele o tratará de maneira diferente, dependendo de o valor começar com basename . Se o valor começar com - (e não é apenas - ), então é uma opção. Pelo menos com o GNU - , um argumento de não-opção é obrigatório, então chamá-lo com um único argumento que começa com basename resultaria apenas em um erro. Mas . Para lidar com valores arbitrários, incluindo aqueles que começam com - , coloque - antes do argumento para indicar que não há mais opções a seguir: -- .

    
por 08.06.2017 / 02:02