Como parte do nosso serviço de inteligência de vulnerabilidades, Fique Alerta, monitoramos continuamente a segurança dos produtos utilizados por nossos clientes. No início do ano, identificamos uma nova vulnerabilidade no WSO2 API Manager que poderia permitir que um atacante executasse código arbitrário no servidor. Essa vulnerabilidade não está registrada como CVE, o que dificulta para outras empresas se manterem informadas sobre novos problemas de segurança no produto. Agora que todos os nossos clientes aplicaram as correções, estamos divulgando essas informações publicamente para ajudar outras organizações a protegerem seus sistemas.
Devido à validação inadequada da entrada do usuário na funcionalidade "Adicionar Documentação da API", um adversário com as seguintes permissões poderia fazer upload de um arquivo arbitrário para um local controlado pelo usuário no servidor:
- /permission/admin/login
- /permission/admin/manage/api/publish
Explorando esta vulnerabilidade, seria possível executar código remotamente no servidor.
Análise
Ao revisar as mudanças no repositório do WSO2, encontramos um commit intitulado Improve API Doc File Upload que despertou nosso interesse. Como upload de arquivos são um vetor de ataque comum, decidimos analisar as alterações. O commit modificou apenas um arquivo:
- RestApiPublisherUtils.java
Conforme mostrado na imagem acima, o commit alterou as funções attachFileToProductDocument e attachFileToDocument para usar um novo método resolveFilePath, que valida o caminho do arquivo a ser anexado. Esta alteração nos revelou que aparentemente a aplicação estava vulnerável a ataques de path traversal em alguma funcionalidade de upload de arquivos antes deste commit.
Para investigar mais a fundo, rastreamos as funções modificadas e descobrimos que elas são chamadas pelas APIs addAPIProductDocumentContent e addAPIDocumentContent.
Com uma compreensão geral da vulnerabilidade, configuramos um ambiente de teste para confirmar nossa hipótese.
Como o commit que corrige a vulnerabilidade foi incorporado direto no branch master em 3 de janeiro de 2024, precisaríamos utilizar uma versão anterior a essa data. Olhando os releases percebemos que 4.2.0 foi o último release gerado antes da aplicação da correção.
Uma vez identificada a versão ideal para testes, construímos uma imagem Docker com a tag 4.2.0-beta usando o Dockerfile fornecido pelo WSO2 e começamos a testar.
Após fazer login com as credenciais padrão (admin:admin), criamos uma API de teste.
Em seguida, criamos um produto de API, acessível pelo endpoint /api/am/publisher/v4/api-products.
Então, adicionamos um documento ao produto da API.
Após ignorar a validação da extensão do arquivo no lado do cliente, fizemos o upload de um arquivo malicioso para o documento do produto da API.
O próximo passo foi determinar um local apropriado para colocar o arquivo malicioso e explorar efetivamente a vulnerabilidade de path traversal.
Após explorar a aplicação, determinamos que o caminho ideal para fazer upload de uma webshell era /authenticationendpoint/, pois geralmente contém arquivos da interface de autenticação, permitindo acesso não autenticado ao arquivo.
O caminho de upload é /home/wso2carbon/wso2am-4.2.0-beta/tmp/restAPI/documentUpload/RANDOM/, então precisávamos subir quatro diretórios para alcançar a raiz. A imagem abaixo exibe a requisição para a exploração dessa vulnerabilidade:
Finalmente, executamos o payload.
Embora o teste inicial tenha sido bem-sucedido, decidimos verificar se este comportamento também se repete na outra API afetada pelas alterações deste commit, addAPIDocumentContent.
Com as extensões permitidas, poderíamos fazer o upload de um arquivo doc malicioso. Entretanto não conseguimos contornar a validação de extensões implementada e fazer o upload de um arquivo com uma extensão não permitida em um formato passível de execução pela aplicação.
Outras Versões Afetadas
Testamos versões anteriores para determinar a extensão da vulnerabilidade.
Versão 4.0.0
Na versão 4.0.0, as APIs attachFileToProductDocument são acessíveis por /api/am/publisher/v2/api-products, e assim como a versão 4.2.0, é vulnerável ao mesmo ataque.
Além disso, identificamos que nesta versão, não há verificação de validação da extensão do arquivo na chamada para a função addAPIDocumentContent acessível através do endpoint /api/am/publisher/v2/apis/. A próxima imagem ilustra a execução do mesmo exploit descrito anteriormente, entretanto em outro endpoint:
Apesar de não termos testado, acreditamos que versões mais antigas podem estar afetadas por essa vulnerabilidade.
Abaixo temos um sumário das versões testadas e seus respectivos pontos vulneráveis.
- 4.2.0 - /api/am/publisher/v4/api-products
- 4.1.0 - /api/am/publisher/v3/api-products
- 4.0.0 - /api/am/publisher/v2/api-products, /api/am/publisher/v2/apis/
Para finalizar criamos um usuário com permissões limitadas para ter certeza que não precisaríamos ter privilégios de admin para explorar tal vulnerabilidade.
E mesmo utilizando esse usuário, conseguimos explorar com sucesso essa vulnerabilidade.
Conclusão
Esta vulnerabilidade no WSO2 API Manager permite que um atacante devidamente autenticado faça upload de arquivos arbitrários no servidor, possivelmente levando à execução remota de código. Embora a versão mais recente, 4.2.0, possua uma verificação de extensão de arquivo em um endpoint, a vulnerabilidade ainda existe em outra API. Recomendamos atualizar para a versão mais recente, 4.3.0, para mitigar esse risco.
Desenvolvemos uma prova de conceito para demonstrar a vulnerabilidade e seu impacto. Esperamos que essas informações ajudem as organizações a protegerem seus sistemas e dados. A prova de conceito está disponível em nosso repositório no GitHub.