Estou escrevendo um aplicativo compilado regular que precisa criar um arquivo especial e gravar um cookie mágico nele. Não consigo escrever o arquivo diretamente do aplicativo, o modelo de segurança do sistema exige que eu lance uma ferramenta auxiliar com privilégios elevados para executar o truque. Eu posso fornecer qualquer número de argumentos para a ferramenta auxiliar. Agora eu gostaria de escolher um comando de sistema muito simples que serviria como ferramenta auxiliar e criaria o arquivo para mim. Algo assim:
/bin/sh -c "/bin/echo -n 'magic' > /some/where/file"
O Simple touch
não funciona porque eu preciso gravar o cookie no arquivo, um simples echo
sem o invólucro do shell não funciona, pois ele precisa de redirecionamento para gravar o arquivo. Não me sinto confortável chamando o shell com privilégios de root para executar uma tarefa tão trivial. Existe algum comando do sistema realmente simples e restrito que eu poderia chamar para escrever o arquivo para mim?
/bin/sh -c 'echo magic > /path/to/magic/file'
não funciona? Isso seria um arquivo executável e dois argumentos. Você precisaria construir o último argumento como uma string (com sprintf ou equivalente). Existe uma razão para isso não funcionar para você? Na sua pergunta, parece que doCommandAsRoot () não recebe entrada para transmitir ao comando, correto? Caso contrário, você poderá substituir o último argumento por'cat > /path/to/magic/file'
e passar os dados em vez de construir uma string.tee
. Obrigado!Respostas:
Que tal agora:
Claro que existem redirecionamentos nisto, mas somente o tee é executado como root, não como um shell. Funciona com
dd of=...
também.fonte
doCommandAsRoot
). E essa função aceita apenas um caminho para o comando e seus argumentos, então não há como eu usar o redirecionamento de saída imediatamente. Eu poderia passar pelo shell (como mostrado na pergunta), mas não gosto disso em termos de segurança.doCommandAsRoot("dd", "if=/tmp/unprotected_file", "of=/some/where/file")
.dd
exemplo está bem próximo do que eu quero, obrigado. Você poderia pensar em algo ainda mais simples?cp
ou emmv
vez dedd
.Sem redirecionamento de saída, sem pipe, mas com "here string":
fonte
status=none
suprimirá todas as outras saídas das versões modernas dos coreutils do GNUdd
.Há outra consideração: você não deseja colocar o valor do cookie mágico em uma linha de comando, pois isso pode ser observado por outros usuários. Mesmo que o programa tenha vida curta (inclusive se o programa zerar a cadeia de caracteres da linha de comando), há uma oportunidade de ataque. Então, um teórico:
é uma abordagem perigosa. Portanto, apoio a sugestão do @ stribika: escreva o valor em um arquivo temporário e copie-o no lugar. Certifique-se de usar uma função segura para criar o arquivo temporário (
mkstemp()
), para que também não haja uma condição de corrida.fonte