bash
em si usa algumas variáveis de ambiente. No momento em que bash
é iniciado e está pronto para interpretar seu primeiro comando, já é tarde demais, um ambiente mal-intencionado pode ter tido bash
do dano já.
Você precisa que o ambiente tenha sido higienizado antes de bash
ser chamado. Você pode limpar o ambiente com a função clearenv()
C na maioria dos sistemas ou pode simplesmente chamar execve()
em seu script e passar uma lista vazia no parâmetro envp
.
Mesmo com um script que contenha:
#! /bin/bash -
:
( :
sendo um especial incorporado), se o ambiente contiver SHELLOPTS=xtrace PS4='$(reboot)'
, o comando reboot
será invocado em :
.
Se bash
estiver vinculado dinamicamente, LD_PRELOAD
/ LD_LIBRARY_PATH
poderá fazer bash
executar código arbitrário assim que for invocado.
bash
também respeita o conjunto de caracteres do código do idioma para sua análise, portanto, com LOCPATH
e LC_*
variáveis, você pode ter até mesmo a linha #! /bin/bash -
invocar código arbitrário (fazendo #!/bina
caracteres em branco, por exemplo).
Veja também:
env SHELLOPTS=noexec any-bash-script
Isso impede que bash
faça qualquer coisa.
Esses são apenas alguns exemplos.
Observe também que as variáveis de ambiente não são as únicas coisas que um comando herda na inicialização e que podem afetar seu comportamento (como argumentos, umask, limites, diretório de trabalho atual, descritores de arquivo aberto, disposição de sinal, terminal de controle ... ).