
PoC & Exploit for CVE-2025-32023 / PlaidCTF 2025 "Zerodeo"
CVE-2025-32023 के लिए PoC और एक्सप्लॉइट (GHSA-rp2m-q4j6-gr43) / PlaidCTF 2025 "Zerodeo"
redis:7.4.2-alpine3.21@sha256:02419de7eddf55aa5bcf49efb74e88fa8d931b4d77c07eff8a6b2144472b6952 के विरुद्ध परीक्षण किया गया
Redis संस्करण >= 2.8 को प्रभावित करता है। 8.0.3, 7.4.5, 7.2.10, 6.2.19 पर पैच किया गया, देखें redis/redis@5018874।
Redis में HyperLogLog अपने स्वयं के कस्टम एन्कोडिंग के साथ एक और स्ट्रिंग है। एक स्पार्स HLL एन्कोडिंग पर पुनरावृत्ति करने के लिए प्रत्येक स्पार्स प्रतिनिधित्व की रन लंबाई जोड़ने की आवश्यकता होती है, जो एक दुर्भावनापूर्ण HLL पर संचालित होने पर int i में गिनी गई कुल लंबाई को ओवरफ्लो कर एक नकारात्मक मान में बदल सकता है। यह हमलावर को HLL संरचना पर नकारात्मक ऑफसेट पर ओवरराइट करने की अनुमति देता है, जिससे स्टैक/हीप पर आउट-ऑफ-बाउंड्स राइट होता है, यह इस पर निर्भर करता है कि HLL संरचना कहाँ से आई है (जैसे hllMerge() स्टैक-आवंटित एक लेता है, hllSparseToDense() हीप-आवंटित एक लेता है)।
नीचे पैच स्निपेट देखें:
int hllMerge(uint8_t *max, robj *hll) {
struct hllhdr *hdr = hll->ptr;
int i;
if (hdr->encoding == HLL_DENSE) {
hllMergeDense(max, hdr->registers);
} else {
uint8_t *p = hll->ptr, *end = p + sdslen(hll->ptr);
long runlen, regval;
+ int valid = 1;
p += HLL_HDR_SIZE;
i = 0;
while(p < end) {
if (HLL_SPARSE_IS_ZERO(p)) {
runlen = HLL_SPARSE_ZERO_LEN(p);
+ if ((runlen + i) > HLL_REGISTERS) { /* Overflow. */
+ valid = 0;
+ break;
+ }
i += runlen;
p++;
} else if (HLL_SPARSE_IS_XZERO(p)) {
runlen = HLL_SPARSE_XZERO_LEN(p);
+ if ((runlen + i) > HLL_REGISTERS) { /* Overflow. */
+ valid = 0;
+ break;
+ }
i += runlen;
p += 2;
} else {
runlen = HLL_SPARSE_VAL_LEN(p);
regval = HLL_SPARSE_VAL_VALUE(p);
- if ((runlen + i) > HLL_REGISTERS) break; /* Overflow. */
+ if ((runlen + i) > HLL_REGISTERS) { /* Overflow. */
+ valid = 0;
+ break;
+ }
while(runlen--) {
if (regval > max[i]) max[i] = regval;
i++;
}
p++;
}
}
- if (i != HLL_REGISTERS) return C_ERR;
+ if (!valid || i != HLL_REGISTERS) return C_ERR;
}
return C_OK;
}
एक्सप्लॉइट मानक Redis pwnables है: