
Análise técnica detalhada de CVE-2024-5452, uma vulnerabilidade de execução remota de código no PyTorch Lightning através de poluição de propriedade delta do DeepDiff, com prova de conceito e orientação de mitigação.
RCE (Remote Code Execution, Execução Remota de Código) é uma vulnerabilidade que permite a um invasor executar código arbitrário remotamente dentro de um sistema ou aplicação, e é CWE-94: Improper Control of Generation of Code ('Code Injection').
PyTorch Lightning é uma biblioteca que ajuda a gerenciar facilmente o treinamento de modelos de aprendizado profundo baseados em PyTorch, e DeepDiff é uma biblioteca que analisa as diferenças comparando dois objetos Python.
CVE-2024-5452 é uma vulnerabilidade que, no processo de utilização do DeepDiff e Lightning nas funcionalidades da aplicação web relacionadas aos pesos do modelo de IA do Lightning, causa RCE durante a desserialização através de uma validação de cabeçalho vulnerável do DeepDiff e contaminação de atributos delta.
Através disso, examinaremos o fluxo de código onde ocorre a vulnerabilidade que permite a um invasor injetar objetos arbitrários ou executar código remoto (RCE), e buscaremos medidas de mitigação.
No pytorch-lightning, entre os endpoints do DeepDiff da aplicação web, é possível atacar enviando para /api/v1/delta a contaminação dos atributos do delta.
Examinando exemplos, vamos entender como a contaminação dos atributos dunder do delta pode causar uma vulnerabilidade de desserialização de objetos.
A primeira requisição é: Exemplo de ataque do Cliente, configuração de contaminação -> Validação de cabeçalho vulnerável em /api/v1/delta do DeepDiff -> Armazenamento de estado através da contaminação configurada.
[Figura 1] POC - Ataque ao Endpoint
[Figura 2] POC - Injeção de Vulnerabilidade / Conteúdo da configuração de contaminação total
[Figura 3] lightning/api/core/api.py / Parte da lógica de verificação de cabeçalho vulnerável
[Figura 4] lightning/api/core/app.py / Seção de configuração
[Figura 5] lightning/api/core/app.py / Seção de salvamento de configuração
A primeira requisição, após contornar a verificação de cabeçalho de /api/v1/delta na [Figura 3] através da [Figura 1], injeta a configuração de contaminação manipulada (delta) [Figura 2] e salva a configuração através das [Figura 4] e [Figura 5]. Agora, vamos ver como essas configurações do delta manipuladas agem na segunda requisição.
[Figura 6] lightning/api/core/app.py / Fluxo do caminho inicial
[Figura 7] Caso de contaminação isinstance
[Figura 8] Caso de contaminação isinstance 1
[Figura 9] Caso de contaminação isinstance 2
[Figura 10] Caso de contaminação isinstance 3
[Figura 11_1] Função de verificação _INTERNAL_STATE_VARS em /lightning/app/core/flow.py
[Figura 11_2] __setattr__ em /lightning/app/core/flow.py
Com a [Figura 11] como último passo, a contaminação e configuração geral foram concluídas.
[Figura 12] Comando RCE
[Figura 13] Resposta RCE
Finalmente, na [Figura 13], o exec com privilégios root é chamado para executar o comando da [Figura 12], concluindo o ataque
Até agora, verificamos o fluxo em que a vulnerabilidade RCE através da desserialização de objetos (CVE-2024-5452) é executada no ambiente Lightning. Por ser um método de ataque que compromete o próprio servidor, as medidas de mitigação são importantes. Para isso, recomendamos a atualização para a versão mais recente.


Até agora, vimos a vulnerabilidade que causa RCE através da contaminação de atributos Dunder via Lightning e DeepDiff. Essa vulnerabilidade ocorreu primeiro através de uma validação de cabeçalho vulnerável e, em seguida, da desserialização de objetos através de uma verificação vulnerável dos atributos delta.