
# CVE-2025-49844(RediShell) 스캐너 및 교육 가이드 Redis Lua 스크립팅 use-after-free 취약점인 CVE-2025-49844(RediShell)에 대한 스캐너 및 교육 가이드입니다. Redis 서버의 노출 여부를 확인하고, 수정 단계를 제공하며, 학습 목적으로 익스플로잇 메커니즘을 설명합니다.
안녕하세요! 이 도구는 여러분의 Redis 서버가 이 버그에 취약한지 확인하도록 돕기 위해 제가 만든 간단한 도구입니다. 실제 공격용이 아니라, 학습과 자신의 시스템 보호를 위한 것입니다.
자, 사랑하는 여러분, 2025년 가장 흥미로운 사고 중 하나인 CVE-2025-49844에 대해 설명드리겠습니다. 핵심적으로, 누군가 여러분의 Redis 서버에서 Lua 스크립트를 실행할 수 있다면, 메모리에 접근할 수 있게 됩니다.
# 먼저 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
이것은 학습과 자신의 시스템 보호를 위한 것입니다. 다른 사람의 서버를 해킹하는 데 사용하지 마세요 - 그것은 불법입니다. 바보가 되지 마세요.