Qodana
The code quality platform for teams
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.
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.
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.
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.
Bom desenvolvimento e mantenha o seu código saudável!
Artigo original em inglês por: