
최소한의 Redis 허니팟으로 RediShell(CVE-2025-49844) 악용을 탐지합니다.
RediTrap은 CVE-2025-49844("RediShell")을 악용하려는 초기 시도를 탐지하기 위해 설계된 경량 Redis 허니팟입니다. 이는 Wiz Research가 설명한 치명적인 원격 코드 실행 취약점입니다. 이 익스플로잇은 내장 Lua 엔진의 13년 된 use-after-free 버그를 악용합니다. Redis는 Lua 청크 이름을 스택에 먼저 고정하지 않고 저장하여, C 코드가 포인터를 계속 사용하는 동안 가비지 컬렉션 주기가 문자열을 회수할 수 있게 했습니다. Redis 패치
d5728cb
는 파싱 전에 Lua 스택에 청크 이름을 푸시하고(setsvalue2s/incr_top 사용) 이후에 팝하여 이 문제를 수정하며, 오래된 포인터를 방지하고 RCE 프리미티브를 차단합니다.
공개된 익스플로잇 경로는 EVAL, EVALSHA 또는 SCRIPT LOAD를 통해 악성 Lua 스크립트를 전송하는 데 의존하므로, 허니팟은 패치되지 않은 Redis 노드인 척하면서 이러한 상호작용을 표면화하는 데 초점을 맞춥니다.
6379)에서 수신 대기하며 기본 프로브가 성공하도록 작은 RESP 하위 집합을 지원합니다(PING, , 등).INFOAUTHHELLO 거부) 공격자가 작업 흐름을 계속하도록 유도합니다.python3 reditrap.py --host 0.0.0.0 --port 6379 --log-file logs/redis-honeypot-events.ndjson
개발 중 추가 stdout 로깅을 위해 --verbose를 사용하세요.
경량 이미지(Alpine 기반) 빌드:
docker build -t reditrap .
# 또는: podman build -t reditrap .
Redis 포트를 노출하고 로그 디렉터리를 호스트에 마운트하여 실행:
mkdir -p honeypot-logs
docker run -d --name reditrap \
-p 6379:6379 \
-v "$(pwd)/honeypot-logs:/data" \
reditrap
컨테이너는 기본적으로 --host 0.0.0.0 --port 6379 --log-file /data/redis-honeypot-events.ndjson을 사용하므로 로그는 호스트의
honeypot-logs/redis-honeypot-events.ndjson에 저장됩니다.
Podman도 동일한 방식으로 작동합니다(해당되는 경우 SELinux 플래그 추가):
podman run -d --name reditrap \
-p 6379:6379 \
-v "$(pwd)/honeypot-logs:/data:Z" \
reditrap
이미지 이름 뒤에 인수를 추가하여 기본값을 재정의할 수 있습니다. 예:
docker run --rm -p 6379:6379 reditrap --redis-version 7.0.15 --log-file /data/attempts.ndjson
각 수신 요청은 NDJSON 항목이 됩니다. 의심스러운 Lua 활동에는 분류를 더 쉽게 하기 위한 휴리스틱이 포함됩니다. 예:
{
"action": "lua_eval",
"args": ["return debug.getregistry()", "0"],
"command": "EVAL",
"info": {
"arg_count": 2,
"heuristics": {
"length": 26,
"matched_tokens": ["debug."],
"preview": "return debug.getregistry()"
},
"key_count": "0",
"script_hash": "763200efa15885c9fa970d45cc2b11711c739c13"
},
"remote": {"host": "203.0.113.42", "port": 58231},
"timestamp": "2025-10-07T15:04:12.123456+00:00"
}
로그를 네트워크 텔레메트리와 결합하여 공격 소스를 추적하고 대응 조치를 결정하세요.