Mantenha o Seu Código PHP Seguro com a Taint Analysis do Qodana

Esta postagem do blog é um oferecimento do Qodana — uma plataforma de qualidade de código da JetBrains. Essa plataforma foi projetada para trazer análise estática pelo lado do servidor à sua ferramenta preferida de CI. Por usar as mesmas inspeções de código e os mesmos perfis que o PhpStorm e outros IDEs da JetBrains, o Qodana ajuda a garantir que haja verificações consistentes da qualidade do código tanto no seu IDE quanto no seu ambiente de CI.

Basta apenas um usuário para explorar uma vulnerabilidade no seu projeto e invadir o seu sistema. Para defender os programas contra entradas de dados maliciosas por usuários externos (conhecidas como “taints”), as equipes de desenvolvimento adicionam a verificação de taints às suas rotinas de análise estática. 

No primeiro lançamento deste ano, a equipe do Qodana incorporou a taint analysis para PHP na versão de acesso antecipado (EAP). Este recurso está disponível apenas no Qodana para PHP 2023.1 (jetbrains/qodana-php:2023.1-eap). O Qodana para PHP foi o primeiro linter que lançamos; então, decidimos deixar os desenvolvedores PHP também serem os primeiros a testarem nossas novas funções de segurança. Planejamos adicionar mais linguagens no futuro, depois de termos coletado feedback suficiente.

Continue lendo para saber mais sobre o que é taint analysis e como ela funciona no Qodana. 

COMEÇAR COM O QODANA

O que é taint analysis?

Um taint é qualquer valor que possa representar um risco de segurança quando modificado por um usuário externo. Se você tiver um taint no seu código e dados externos não verificados puderem ser distribuídos a partes do seu programa, hackers poderão executar esses fragmentos não verificados de código para provocar injeção de SQL, overflow aritmético, cross-site scripting, path traversal e outros ataques. Geralmente, eles exploram essas vulnerabilidades para destruir o sistema, obter credenciais e outros dados e alterar o comportamento do sistema.

Exemplo de um taint. São mostrados na tela dados arbitrários do parâmetro GET. Por exemplo, usuários mal-intencionados podem explorar essa vulnerabilidade para interferir no layout do seu programa.  

Como uma camada adicional de defesa contra dados de entrada mal-intencionados, as equipes de desenvolvimento executam uma taint analysis ao efetuarem uma auditoria de segurança na superfície de ataque do programa. 

A taint analysis é o processo de avaliar o fluxo de dados de entrada não confiáveis de usuário por todo o corpo de uma função ou método. Seu objetivo principal é determinar se algum dado de entrada não previsto pode afetar a execução do programa de forma mal-intencionada. 

Fontes de taints são locais onde um programa tem acesso a dados que podem potencialmente ser taints. Pontos-chave em um programa que podem ser suscetíveis a permitir a entrada de taints são chamados taint sinks. Esses dados podem ser propagados aos sinks através de chamadas a funções ou de atribuições.

Se você fizer uma taint analysis manual, deverá identificar todos os lugares onde você aceita dados de usuários externos e seguir cada um desses dados através do sistema — os dados com taints podem ser usados em dezenas de nós. Depois, para evitar a propagação dos taints, você deve fazer uma das duas abordagens descritas abaixo:

Higienizar os dados, isto é, colocá-los em um estado seguro. No exemplo abaixo, removemos tags para resolver o taint. 

Validar os dados, isto é, assegurar-se de que os dados adicionados seguem um padrão necessário. No exemplo abaixo, ativamos a validação da variável $email. 

Em outras palavras, a inspeção da taint analysis rastreia dados de usuário com taints desde a sua fonte até os seus sinks e dá o alarme quando você trabalha com esses dados sem higienizá-los ou validá-los. 

Como funciona a taint analysis no Qodana

A taint analysis é efetuada pelo Qodana para PHP a partir da versão 2023.1 EAP. Este recurso inclui uma inspeção que varre o código e realça o taint e a vulnerabilidade em potencial, tem a capacidade de abrir o problema no PhpStorm para resolvê-lo na mesma hora e inclui um grafo de fluxo de dados para visualizar o fluxo do taint. 

Exemplo nº 1. Injeção de SQL 

Vamos dar uma olhada em um exemplo de injeção de SQL e como o Qodana a detecta:

Aqui, o Qodana mostra os seguintes taints na função system_admin():

Marcadores 1-2: Dados de entrada do formulário do usuário são obtidos do array global $_POST, sem nenhuma higienização ou validação, e são atribuídos à variável $edit. Isto é um taint.

Marcador 3: A variável com taint $edit é passada como argumento à função system_save_settings sem nenhuma higienização adequada.

Marcador 4: Agora os dados da variável $edit estão no parâmetro $edit.

Marcador 5: A variável $edit é passada ao foreach com a chave $filename e o valor $status. As duas variáveis contêm os dados com taint da variável $edit concatenada à string. A chave $filename está concatenada a uma string de SQL com taint e irá propagar dados com taint para um argumento passado a db_query.

Marcador 6: A chave $filename contém os dados com taint da variável $edit concatenada à string.

Marcador 7: A chave $filename está concatenada a uma string de SQL com taint.

Marcador 8: A string de SQL com taint irá propagar dados com taint a um argumento passado a db_query.

Agora, vamos dar uma olhada em db_query:

Marcador 9: A string com taint estará localizada no parâmetro $query.

Marcador 10: Este parâmetro será um argumento da função _db_query.

Vamos prosseguir para a função _db_query:

Marcador 11: Os dados com taint estão localizados no primeiro parâmetro $query da função _db_query.

Marcador 12: Os dados do parâmetro são passados à função mysql_query, que é um sink.

Todo o fluxo de dados acima ilustra como os dados se movem de $_POST[„edit“] até mysql_query($query) sem nenhuma higienização ou validação. Isso permite a um atacante manipular a consulta SQL que foi concatenada a uma chave de $_POST[„edit“] e assim acionar a injeção de SQL

O Qodana identificará esses riscos na sua base de código, juntamente com todos os nós onde se usam dados com taint, para que você possa higienizar a tempo todos os dados com taint. 

 

Abrindo o problema no PhpStorm.

Exemplo nº 2. Problema de XSS

Na interface de usuário do Qodana, você poderá ver um grafo que mostra todo o fluxo do taint. É assim que o Qodana mostrará a vulnerabilidade de XSS, que contém 2 fontes que seriam reunidas no marcador 5.

Fonte 1

Marcadores 1-2: Serão lidos os dados do arquivo searchUpdate.pos e dados com taint serão atribuídos à variável $start.

Fonte 2

Marcadores 3-4: Serão lidos os dados dos arquivos cujos caminhos estiverem localizados em $posFile e dados com taint serão atribuídos à variável $start.

Marcador 5: Um estado com taint reunindo todos os ramos condicionais na variável $start será passado como argumento ao método doUpdateSearchIndex.

Vamos dar uma olhada dentro do método doUpdateSearchIndex():

Marcadores 6-8: O parâmetro $start conterá dados com taint nesta parte do fluxo de dados e será passado dentro de uma string concatenada como argumento para o método output.

Vamos dar uma olhada dentro do método output:

Marcador 9: Os dados com taint contidos dentro da string transmitida estarão localizados no parâmetro $out.

Marcador 10: Os dados do parâmetro $out serão transferidos à função print sem nenhuma higienização. Esta função é um sink e causa uma vulnerabilidade de XSS, que pode ser usada com más intenções.

Para se aproveitar dessa vulnerabilidade, um atacante pode, por exemplo, fazer o upload de um script de shell, em vez dos arquivos esperados nos marcadores 1 e 2, e pode colocar qualquer informação na página da Web, como resultado de uma função print não higienizada.

O Qodana irá alertar sobre esta vulnerabilidade e dará a ela uma prioridade alta, para que você possa resolvê-la o mais rapidamente possível e evitar o hack.  

Conclusão

A taint analysis ajuda a eliminar superfícies de ataque que possam ser usadas com más intenções. Portanto, é um método eficaz para reduzir riscos no seu software. Para saber mais detalhes sobre a taint analysis e o Qodana, explore a documentação do Qodana.

INTRODUÇÃO AO QODANA

Bom desenvolvimento e mantenha o seu código saudável!

Artigo original em inglês por:

Valerie Kuzmina

The PhpStorm Blog : The Lightning-Smart IDE for PHP Programming | The JetBrains Blog

Read More

Latest News

PHP-Releases

PHP 8.3.9 released!

PHP 8.2.21 released!

PHP 8.1.29 released!

Generated by Feedzy