Pode bash script reset e sanitize * whole * environment e como?

3

Você sabe disso sudo stuff:

Defaults env_reset

que torna a injeção de ambiente impossível. Eu estava vagando se essa funcionalidade pudesse ser obtida diretamente do script bash, "de dentro"?

Pelo menos parte disso pode, com certeza. Exemplo:

#!/usr/bin/env php
<?php
//...

// sanitizes $PATH
putenv("PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"); 

// unsets $LD_LIBRARY_PATH, as it should be in Ubuntu
putenv('LD_LIBRARY_PATH');
//...

Podemos fazer env_reset em executar o script como sudo e como?

EDIT:

I'm not looking for the way to do it 'from outside' like env -i command but from inside of script itself. My intention is to ensure security no matter who (what user) and how(under which circumstances, i.e. env variables) runs it.

    
por Miloš Đakonović 02.02.2017 / 13:27

2 respostas

5

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 ... ).

    
por 02.02.2017 / 18:41
2

Você pode encontrar suas exportações com export -p ou simplesmente export e substituir declare -x por declare +x em cada linha para que ele não seja exportado:

eval "$(export|sed s/-/+/)"

Se você colocar isso no início do seu script, nenhuma variável de ambiente será passada para os programas que ele executa, a menos que você os exporte explicitamente. Você provavelmente desejará exportar código de idioma e TZ variáveis e TERM e muito mais ...

    
por 02.02.2017 / 16:58