bigywater.tech
Redis · 129

Redis 未授权访问

「Redis 未授权访问」这个词被说了很多年。这篇不讲怎么打,只讲怎么自查:站在局域网上一个没有任何凭据的客户端的位置,对自己的实例问一组固定的问题,看每种配置下能得到什么。五种配置,每一种都是本机的临时实例,没有碰任何别人的东西。

全默认
没密码时:陌生客户端能读全部数据、INFO 泄露版本和文件路径;但 CONFIG SET dir 与 DEBUG 默认被拒
yes
把 enable-protected-configs 设成 yes,陌生客户端就能远程改 dir(本次改到自己的临时目录后已恢复)
-@dangerous ≠ 保护数据
default 用户 -@dangerous 后 INFO / KEYS 被拒,但 GET 读数据照样可以

自查:五种配置对同一批问题的回答

实测 · 本机执行输出
  检查项                                                A           B           C           D           E
  PING                                            PONG        PONG        PONG        PONG      NOAUTH
  INFO server                                       OK          OK          OK      NOPERM      NOAUTH
  DBSIZE                                             1           1           1           1      NOAUTH
  GET session:1                                     读到          读到          读到          读到      NOAUTH
  CONFIG GET dir                                   2 项         2 项         2 项      NOPERM      NOAUTH
  CONFIG SET dir(改到我自己的临时目录)                       ERR          OK         ERR      NOPERM      NOAUTH
    dir 真的被改了吗                                       否           是           否           否           否
  DEBUG SLEEP 0                                    ERR         ERR         ERR         ERR         ERR
  MODULE LIST                                      1 项         1 项         1 项      NOPERM      NOAUTH
  KEYS *                                           1 项         1 项         1 项      NOPERM      NOAUTH
  DRYRUN default FLUSHALL                           OK          OK          OK          拒绝          OK
  DRYRUN default REPLICAOF 10.0.0.1 6379            OK          OK          OK          拒绝          OK
  DRYRUN default SHUTDOWN NOSAVE                    OK          OK          OK          拒绝          OK
  default 是否 -@dangerous                             否           否           否           是           否
  A 裸奔(全默认) | B protected-configs=yes | C protected-configs=local | D default -@dangerous | E requirepass

方法:另起一条来自局域网地址(不是回环)的连接,不带任何凭据,依次问:能 PING 吗?能读 INFO 吗?能读数据吗?能读 / 改 dir 吗?能 DEBUG 吗?再让管理员用 ACL DRYRUN default 判定 default 用户对几条危险命令的权限。改 dir 时改到的是我自己的临时目录,随后立刻改回。

几个开关的默认值与泄露

实测 · 本机执行输出
   {'enable-protected-configs': 'no', 'enable-debug-command': 'no', 'enable-module-command': 'no', 'protected-mode': 'no'}
  A 里 CONFIG SET dir 被拒的原文: ERR CONFIG SET failed (possibly related to argument 'dir') - can't set protected config
  B(=yes)里同一条: OK
  C(=local)里: ERR CONFIG SET failed (possibly related to argument 'dir') - can't set protected config
  DEBUG(A): ERR DEBUG command not allowed. If the enable-debug-command option is set to "local", you can run it from a local connection, otherwise you need to set this option in the configuration file, and then restart the server.
  A 上,陌生客户端保持着连接时,管理员的 CLIENT LIST 能看到来源地址吗(是否有来自 10.83.245.179 的连接) → True | addr=10.83.245.179:63766 laddr=10.83.245.179:9170 fd=10 name= age=0 idle=0 flags=N db=0 su
  服务端 INFO 泄露给未登录客户端的字段(A):
    redis_version  8.10.2
    os             Darwin 27.0.0 arm64
    arch_bits      64
    process_id     22116
    run_id         da4e09bf9069c8e1ae57c4da429190801fa3aaf4
    tcp_port       9170
    executable     <实验目录>
    config_file    <实验目录>

三个「危险开关」出厂都是关的:enable-protected-configs no、enable-debug-command no、enable-module-command no。所以没配 requirepass 的实例,陌生人默认也改不了 dir、跑不了 DEBUG——但依然能读走全部数据。INFO server 还会告诉对方版本、操作系统和文件路径,方便对方选择手段。

该怎么办(每一条都对应上面的一个观察)

分步演示:五种配置

未授权访问自查
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 / Redis 8.10.2 独立实例(本机回环端口,save 关闭),redis-cli 风格输出由自写的 RESP 客户端打印;计时用 time.perf_counter,数字每次运行会有小幅抖动。「陌生客户端」是本机对自己的局域网地址 10.83.245.179 发起的连接
    • 没有验证:真实的另一台机器、云环境安全组、容器网络、Unix socket 场景、CONFIG SET dir 之后的其它后续操作(本文刻意没有做)、Redis 8 以前版本的默认值、MODULE LIST 返回 1 项具体是什么
    京ICP备2026067502号-1京公网安备11010502063487号