$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: -- .