Injeção de código em Arquivos PHP assinados (Phar)

  • Quarta, 26th Julho, 2017
  • 12:58pm

O PHP contém um recurso interessante, mas raramente usado, chamado Phar , que significa PH AR chive, que permite aos desenvolvedores empacotar aplicativos inteiros como um único arquivo executável. Ele também possui alguns benefícios de segurança adicionais ao assinar arquivos com assinatura digital, desconsiderando a modificação dos arquivos em máquinas de produção.

De acordo com a documentação oficial do PHP

O Phar pode comprimir arquivos individuais ou um arquivo inteiro usando compressão gzip ou compressão bzip2 e pode verificar a integridade do arquivo automaticamente através do uso de assinaturas MD5, SHA-1, SHA-256 ou SHA-512 ....

... A extensão Phar leva em consideração a segurança e desabilita o acesso de gravação aos arquivos phar executáveis ​​por padrão, exigindo desabilitação do nível do sistema da configuração phar.readonly php.ini para criar ou modificar arquivos phar. Os arquivos normais de tar e zip sem um stub executável sempre podem ser criados ou modificados usando a classe PharData.

Embora o anterior seja tecnicamente verdadeiro, nós, na Sucuri, descobrimos que essas restrições são facilmente ignoradas por um atacante determinado e não podem ser confiadas para proteger a integridade de um arquivo. Como tal, é aconselhável que sejam tomadas medidas adicionais para confirmar a validade de qualquer arquivo Phar antes de usar em uma configuração de produção.

Como funciona o Phar Disables

A documentação indica que os arquivos só podem ser escritos se permitido explicitamente no php.ini - mas essa proteção só é aplicada no código. O que isso significa é que as classes Phar incluídas no PHP não permitirão a escrita de novos arquivos ou a modificação dos existentes quando tentados através dos métodos da classe Phar fornecidos para esse fim Qualquer modificação através de recursos externos não é - e não pode - ser aplicada dessa maneira, deixando esses arquivos abertos a alterações por qualquer usuário com acesso de gravação ao arquivo.

Ter acesso de escrita certamente permitirá que o arquivo seja alterado, mas isso inevitavelmente alterará a assinatura do arquivo. Isso deve fazer com que qualquer tentativa de execução falhe, certo?

Como Phar verifica assinaturas

Para dar mais informações sobre como os arquivos de Phar são construídos, eles são arquivos PHP que contêm uma mistura de código e outros dados binários.

Primeiro, vem o talão - uma seção de código que lida com a extração de recursos. Um manifesto binário vem em seguida, o que permite que o intérprete compreenda a estrutura do arquivo dos conteúdos incorporados que se seguem. assinaturacompõe a última seção do arquivo.

O formato de assinatura usado pelos arquivos do Phar é bastante simples. Na criação, é gerada uma assinatura. O arquivo contém apenas o talão, o manifesto e o conteúdo. Essa assinatura, juntamente com uma bandeira de assinatura de 4 bytes, informa ao PHP qual tipo de assinatura foi usado. Por último, uma constante mágica de 4 bytes marca um arquivo como tendo uma assinatura. Todos são anexados ao arquivo final.

Quando o PHP mais tarde lê o arquivo, ele pode determinar a assinatura e o tipo lendo o final do arquivo. Este tipo de formatação é, finalmente, o problema.

Código de Injeção na Assinatura

Para testar isso, começamos com um simples arquivo Phar "Hello World" e o assinamos usando o OpenSSL. Executar o resultado .phar através da linha de comando exibiu nossa mensagem simples, desde que o arquivo existisse ao lado de seu arquivo de chave pública. Sem o arquivo de chave pública, o intérprete falhou com o PharException .

Da mesma forma, qualquer tentativa de alterar a seção stub do arquivo também faria com que a assinatura falhe, mas o código foi injetado antes que o talão fosse executado antes que essa falha ocorresse. Isso não é bom, mas a questão surgiu se fosse possível não apenas injetar código, mas sim fazê-lo silenciosamente.

Descobriu-se ser bastante simples.

Uma vez que a assinatura é codificada no arquivo, acabamos de remover completamente a seção de assinatura antiga. Depois de adicionar nossa carga útil (um simples "Hello Evil World"), nós calculamos uma nova assinatura MD5, anexamos a cópia maliciosa e substituímos nosso "Olá Mundo", uma vez benigno, com nossa versão infectada.

O arquivo resultante executou nossa carga útil "Hello Evil World", então, felizmente, disse "Olá Mundo" como se nada estivesse errado, e o PHP não era o mais sábio. O arquivo de chave pública foi ignorado completamente.

O que isso significa para desenvolvedores

Os desenvolvedores devem estar conscientes de que os mecanismos de segurança incorporados no formato Phar não são uma solução completa e não podem impedir a modificação do código dentro.

A premissa do Phar é permitir que vários arquivos do PHP sejam armazenados em um único recipiente, e é exatamente isso que ele deve ser tratado - como uma coleção de arquivos.

O que o formato de arquivo Phar não fará é impedir que outras pessoas:

  • Lendo seu código
  • Modificando seu código
  • Incluindo o seu código em outro lugar

Isso não significa que você nunca deve usar o Phar para qualquer coisa, mas os desenvolvedores e administradores de sistemas precisam estar cientes das limitações do formato.

« Retornar

ico-whatsapp
Dúvidas por WhatsApp
ico-chat
Dúvidas por Web Chat
ico-ticket.png
Abrir ticket Suporte