Data --set não permitido para o usuário www-data

0

Eu estou rodando um servidor lighttpd no Debian GNU / Linux 7.5 (wheezy) e quero usar uma página php para mudar a hora do sistema (eu sei que posso apenas mudar o horário da página, mas não é isso que eu preciso para isso projeto). Neste momento, estou usando o comando exec() para emitir comandos diretamente e apenas executar um script de shell. Então, ou:

exec('date --set [HH:MM:SS]')

ou

exec("sh /full/file/path/updateTime.sh") //contains command 'date --set [HH:MM:SS]'

Se eu mudar o usuário na linha de comando para www-data e tentar executar o comando date, recebo a resposta "date: não é possível definir a data: Operação não permitida".

O script de shell é executado com sucesso se eu o executar como root.

Se eu fornecer um segundo argumento para exec() para manter a resposta, ele contém as informações de data / hora que estou tentando definir.

Eu também tentei editar sudoers para adicionar

www-data        ALL=(ALL:ALL) ALL

em user privilege specification e includedir /etc/sudoers.d sem alteração. Eu também tentei criar uma especificação de alias Cmnd para /bin/date e adicioná-la ao usuário www-data sem nenhuma alteração.

Sou bastante inexperiente com tudo o que é necessário, por isso qualquer ajuda é apreciada.

O site não estará ativo, mas estou ciente dos perigos associados à aceitação de comandos do shell dos usuários. Eu verifiquei o arquivo php.ini para ter certeza de que o comando exec() não está desativado. Eu tentei dar a propriedade do shell script em /var/www/ para www-data sem nenhuma alteração. Permissões estão definidas para 777 por enquanto.

    
por Nick 09.01.2017 / 00:57

2 respostas

2

Se o www-data estiver no arquivo sudoers, você declararia que o comando sudo não precisaria de uma senha, pois www-data não pode inserir um.

A entrada de sudoers deve ser www-data ALL=(ALL:ALL) NOPASSWD: ALL

Em seguida, você precisaria executar sudo date --set [HH:MM:SS] em vez de apenas date --set [HH:MM:SS] .

www-data nunca deve ter sudo direitos, a menos que você esteja apenas usando para seu próprio desenvolvimento pessoal, em um servidor de teste. Esta é uma grande lacuna de segurança.

Edit: Dê uma olhada nesta questão, que é simalar sudo em php exec ()

    
por 09.01.2017 / 01:18
0

Aqui está outra abordagem:

  • Crie um FIFO (pipe nomeado) em um local razoavelmente seguro - qualquer lugar que não seja mundialmente gravável deve ser OK.
  • Assuma a propriedade de www-data , modo 600. Ou 200 devem funcionar.
  • Toda vez que o aplicativo PHP deseja alterar o horário do sistema, tem que escrever o novo horário para o FIFO.
  • Ter um processo daemon, rodando como root, lido no FIFO. Quando ele lê um horário corretamente formatado, configure o relógio do sistema.

Não é necessário mexer com sudo . O pior que pode acontecer se alguém invadir seu sistema como www-data é que ele pode escrever mudanças de horário para o FIFO e fazer com que o daemon mude a hora. Parece ser quase impossível que o atacante seria capaz de elevar seus privilégios para root (a menos que você crie uma vulnerabilidade no daemon).

    
por 18.01.2017 / 05:30