Existem várias camadas que você precisa proteger.
Alguns dos hosters incorretamente dependem de "proteções" PHP como open_basedir, safe_mode (PHPs mais antigos), disable_functions etc.
Mesmo o PHP NÃO os considera recursos de segurança - http://php.net/security- note.php
Estes podem ser desabilitados com qualquer exploit para PHP e então todo o sistema está condenado, não faça isso.
Como deve ser feito
a parte inferior
- Usuário de sistema/nível de SO separado para cada site hospedado
- permissões corretas (um não pode visualizar/editar a página do outro) - também certifique-se de que os subdiretórios tenham a permissão correta, pois serão semelhantes
- arquivos de sessão separados (MUITOS webhostings colocam arquivos de sessão de cada site hospedado em PHP no mesmo diretório, isso é ruim ruim ruim!
O Apache finalmente conseguiu seu próprio módulo para isso - Apache MPM-ITK .
Resumindo: imagine isso como você daria ao usuário um shell na máquina (sob seu próprio uid) - ele não pode fazer nada com os outros sites hospedados.
- uid/gid diferente
- permissões do sistema
- estruturas como SELinux, AppArmor e similares
- grsecurity se você quiser ser hardcore... mas o sistema será mais difícil de manter.
subindo?
Você pode obter mais hard-core. O melhor que eu vi é uma biblioteca compartilhada para apache (ou o que você usar) - que é usada quando o apache é iniciado usando
LD_PRELOAD
e implementa todas as chamadas de sistema potencialmente maliciosas como system()
, execve()
e basicamente qualquer outra chamada que você achar ruim. Ainda não vi uma boa implementação disso por aí (além das personalizadas em algum lugar) - corrija-me se estiver errado.
Certifique-se de implementar uma lista branca para isso, por exemplo. mail() em PHP executa sendmail por padrão e isso não funcionará mais.
conclusão
Adicione o clássico disable_functions, open_basedir, etc. no php.ini global, adicione session.save_path a cada vhost - coloque as sessões nos diretórios do usuário. Certifique-se de que os usuários não compartilhem nada .
Implemente corretamente a separação no nível do SO subjacente.
Obtenha hardcore com grsec e LD_PRELOAD lib hooking chamadas de sistema.
Separação, separação, separação .. em breve sistemas como o Docker fornecerão contêineres baseados em LXC para separar usuários no nível do kernel, mas ainda não está pronto para produção (imho).