rbash启动后cd报错是因为其受限模式直接拦截cd内置命令调用,仅允许不带斜杠的命令名且依赖PATH中预置的可执行文件,本质是初始化时通过$0 basename触发的轻量级限制机制。
rbash 启动后为什么 cd 报错?
因为
默认禁止所有目录切换操作,哪怕你当前在
,执行
或
都会返回
。这不是权限问题,是 shell 自身限制机制触发的——它直接拦截了
内置命令的调用路径。
真正起作用的是启动方式:
或以
名字调用(如
),两者等价。系统通过
的 basename 判断是否进入受限模式,所以软链接必须叫
,不能叫
。
验证当前 shell 是否受限:运行
,输出
表示生效
不要试图在用户登录后手动执行
—— 这无效,受限模式只能在 shell 初始化时启用
被禁,但
、
仍可用,前提是这些命令在
中且路径不含
用户能运行哪些命令由什么决定?
不是靠白名单配置文件,而是靠
和命令调用方式。受限 shell 禁止执行含
的路径,所以
、
全部失败;唯一允许的是不带斜杠的命令名,比如
,但前提是该命令在
搜索路径中存在可执行文件。
典型做法是为用户创建专属 bin 目录(如
),只放软链接到允许的命令,并把
改成仅包含这个目录:
必须用
创建软链接:
用户自己的
或
必须由
设置所有权和权限:
,否则用户可篡改
不能依赖
—— rbash 默认不读取它,除非你在
里显式
为什么用户还能逃出 rbash?常见绕过点在哪?
rbash 不是沙箱,只是轻量级限制层。只要用户能执行某个程序,而该程序又支持交互式 shell 调用,就可能逃逸。最典型的是
、
、
、
、
等工具内置的
命令:
例如用户能运行
,那在 vim 里输入
或
就直接获得非受限 shell。
Docker Desktop(linux)
当前 Docker 最新稳定版本之一,主要针对稳定性和兼容性进行了修复优化,适合生产环境与日常开发使用。该版本继续强化 AI 开发支持、容器日志管理以及 Docker Engine 的安全能力,对 Windows/macOS/Linux 平台兼容性进行了进一步优化。
下载
检查用户能用哪些命令:
后挨个
看有哪些二进制文件
测试重定向是否真被禁:
—— 如果成功,说明限制未生效或被绕过
检查是否有
、
、
等解释器:
是高危信号
注意
输出 —— 若用户对某些命令有免密 sudo 权限,
一步到位
rbash 适合什么场景?不适合什么?
适合短期、低信任度的临时账户,比如外包人员查日志、学生做实验、CI 构建账号。它成本低、无需额外服务、开箱即用。
不适合生产环境核心权限隔离。它的限制太容易被已有工具链绕过,且无法阻止进程间通信、内存读取、ptrace 注入等深层行为。
真正需要强隔离时,应转向
、
、
或容器方案。rbash 只是一个“礼貌性围栏”,不是防火墙。
最容易被忽略的一点:rbash 用户的
目录本身必须严格设权 —— 如果用户能写
,他就能覆盖
或注入任意命令;如果能写
,就可能通过 SSH 密钥登录并绕过 shell 限制。
rbash/home/usercd ..cd /tmpbash: cd: restrictedcdbash -rrbash/bin/rbash$0rbashmybashshopt restricted_shellrestricted_shell onset -rcdpwdls$PATH/$PATH//bin/ls./script.shls$PATH/home/user/.bin$PATHexport PATH="/home/user/.bin"rootsudo ln -s /bin/ls /home/user/.bin/ls.profile.bash_profilerootchown root:root .profile && chmod 755 .profilePATH~/.bashrc.profilesourcevimlessmanftpgdb!vim:!sh:!/bin/bashecho $PATHls -lecho test > filepythonperlawkpython -c "import os; os.system('/bin/sh')"sudo -lsudo /bin/bashsystemd --scopecgroups v2firejail$HOME/home/user/.bash_profilePATH/home/user/.ssh/authorized_keys