
CVE-2025-49844(RediShell)のスキャナーおよび教育用ガイド。Redis Luaスクリプティングのuse-after-free脆弱性です。Redisサーバーの露出をチェックし、修復手順を提供し、学習目的でエクスプロイトの仕組みを解説します。
やあ!これは、自分のRedisサーバーがこのバグに対して脆弱かどうかを確認するために作ったシンプルなツールです。実際の攻撃用ではなく、学習と自分の環境を守るためのものです。
さて、親愛なる皆さん、2025年で最も興味深い失敗の一つ、CVE-2025-49844についてです。基本的に、誰かがあなたのRedisサーバーでLuaスクリプトを実行できる場合、メモリへのアクセスを獲得できる可能性があります。
# まず、Goの環境を準備します
cd scanner
go mod tidy
# 次にスキャナーをビルドします
go build -o rscan redis-scanner.go
# 1台のサーバーを確認
./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
# Redisへの接続を特定のIPのみに許可
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
これは学習と自分の環境を保護するためのものです。他人のサーバーをハッキングするために使用しないでください。それは違法です。バカなことはしないでください。