
# ماسح ودليل تعليمي لـ CVE-2025-49844 (RediShell)، ثغرة استخدام بعد التحرير في برمجة Lua النصية في Redis. يفحص خوادم Redis للتحقق من التعرض، ويوفر خطوات المعالجة، ويشرح آليات الاستغلال لأغراض التعلم.
مرحبًا! هذه أداة بسيطة صنعتها لمساعدة الناس على التحقق مما إذا كانت خوادم Redis الخاصة بهم معرضة لهذه الثغرة. ليست مخصصة للهجمات الفعلية - فقط للتعلم وحماية أغراضك الخاصة.
حسنًا يا أصدقائي، إليكم واحدة من أكثر الأخطاء إثارة للاهتمام في عام 2025، وهي CVE-2025-49844. باختصار، إذا كان بإمكان أي شخص تشغيل نصوص Lua على خادم Redis الخاص بك، فيمكنه الوصول إلى الذاكرة.
# أولاً، جهّز أدوات Go
cd scanner
go mod tidy
# ثم قم ببناء الماسح الضوئي
go build -o rscan redis-scanner.go
# فحص خادم واحد
./rscan -host your-server.com -port 6379
# الفحص بكلمة مرور (إذا كان لديك واحدة)
./rscan -host your-server.com -port 6379 -auth yourpassword
# فحص عدة خوادم دفعة واحدة
./rscan -host server1.com,server2.com,server3.com
# أو الفحص من ملف
./rscan -file hosts.txt
# إيقاف تشغيل نصوص Lua (هذا يوقف الهجوم)
redis-cli ACL SETUSER default -@scripting
# أو فقط قم بتحديث Redis إلى أحدث إصدار
هذا ما يسمى بخطأ "الاستخدام بعد التحرير" (use-after-free). باختصار، لدى Redis نظام لإدارة الذاكرة يرتبك أحيانًا بشأن الذاكرة التي قام بتنظيفها بالفعل.
كيف يجب أن تعمل:
كيف تعمل فعليًا (الثغرة):
EVAL و EVALSHA (هذه تشغل نصوص Lua)# إيقاف تشغيل نصوص Lua (هذا يوقف الهجوم)
redis-cli ACL SETUSER default -@scripting
# أو قم بتحرير ملف redis.conf وأضف هذا السطر:
disable-commands eval evalsha
# ثم أعد تشغيل Redis
sudo systemctl restart redis
# السماح فقط لعناوين IP محددة بالاتصال بـ Redis
iptables -A INPUT -p tcp --dport 6379 -s 10.0.0.0/8 -j ACCEPT
iptables -A INPUT -p tcp --dport 6379 -j DROP
# اجعل Redis يستمع فقط على واجهات شبكة محددة
bind 127.0.0.1 10.0.0.100
# تعيين كلمة مرور قوية
redis-cli CONFIG SET requirepass "fuckredis1234ilovehacking!"
# إنشاء مستخدمين بصلاحيات محدودة
redis-cli ACL SETUSER appuser on >password +@read +@write -@scripting
redis-cli ACL SETUSER readonly on >password +@read -@scripting
# قم بنسخ بياناتك احتياطيًا أولاً (افعل هذا دائمًا!)
sudo cp -r /var/lib/redis /var/lib/redis.backup.$(date +%Y%m%d)
# تحديث Redis إلى الإصدار المُصلح
# على Ubuntu/Debian:
sudo apt update && sudo apt install redis-server=8.2.2*
# على CentOS/RHEL:
sudo yum update redis
# تحقق من أن التحديث نجح
redis-server --version
# هذا يجب أن يفشل إذا كان إصلاحك يعمل
redis-cli -a "YourPassword" EVAL "return 'test'" 0
# يجب أن يقول: (error) ERR unknown command 'EVAL'
# تحقق مما إذا كان Redis يمكن الوصول إليه من الشبكة
nmap -p 6379 your-redis-server
# اختبر ما إذا كانت كلمة المرور مطلوبة
redis-cli -h your-redis-server -p 6379 ping
# يجب أن يطلب كلمة المرور
# ابحث عن نشاط نصوص Lua الغريب
grep -i "eval\|evalsha" /var/log/redis/redis.log
# تحقق من محاولات تسجيل الدخول الفاشلة
grep -i "auth" /var/log/redis/redis.log
# ابحث عن أخطاء النصوص
grep -i "script" /var/log/redis/redis.log
eval و evalsha)تحدث الثغرة عندما:
-- هذا فقط ليعرض لك شكل البنية
local function create_memory_pattern()
-- إنشاء كائنات تعبث بتنظيف ذاكرة Redis
local objects = {}
for i = 1, 1000 do
objects[i] = {data = "pattern_" .. i}
end
return objects
end
local function trigger_gc()
-- إجبار Redis على تنظيف الذاكرة في الوقت الخطأ
collectgarbage("collect")
-- هنا تحدث ثغرة الذاكرة
end
-- بنية الهجوم الرئيسية
local objects = create_memory_pattern()
-- العبث بمراجع الذاكرة
-- إجبار جمع القمامة
-- استخدام الذاكرة المكسورة لتشغيل الكود
إذا كنت تريد رؤية كيف يعمل هذا دون كسر أي شيء حقيقي، يمكنك استخدام Docker:
# ابدأ Redis للاختبار (هذا معرض للخطر)
docker run -d --name redis-test -p 6379:6379 redis:6.0
# اختبره
cd scanner
./rscan -host localhost -port 6379
# أوقف المعرض للخطر وابدأ المُصلح
docker stop redis-test
docker run -d --name redis-fixed -p 6379:6379 redis:6.0 redis-server --rename-command EVAL "" --rename-command EVALSHA ""
./rscan -host localhost -port 6379
# نظف بعد الانتهاء
docker stop redis-fixed && docker rm redis-fixed
cd scanner
./rscan --help
أنشئ ملف hosts.txt هكذا:
# ضع خوادمك هنا
server1.com
server2.com:6380
192.168.1.100
redis.example.com:6379
# استخدم المزيد من العمال للفحص بشكل أسرع (إذا كان لديك الكثير من الخوادم)
./rscan -host server1.com,server2.com -workers 20
# التراجع إلى النسخة الاحتياطية
sudo systemctl stop redis
sudo rm -rf /var/lib/redis
sudo cp -r /var/lib/redis.backup.$(date +%Y%m%d) /var/lib/redis
sudo systemctl start redis
هذا فقط للتعلم وحماية أغراضك الخاصة. لا تستخدمه لاختراق خوادم الآخرين - فهذا غير قانوني. لا تكن غبيًا.