关键在于验证sftp是否真正运行在chroot环境中:检查sshd_config中chrootdirectory配置、属主权限、shell设为/nologin、forcecommand internal-sftp启用,并通过sftp登录后执行pwd和ls /确认无法逃逸,同时扫描acl是否误设于chroot外目录。

排查 SFTP 用户结合 ACL 后的目录越权访问漏洞,关键不是“查有没有权限”,而是“验证实际访问路径是否被有效约束”。ACL 和 SFTP chroot 是两套机制:ACL 控制文件系统级读写行为,chroot 控制协议层可见根目录。两者若配置错位或未协同,就会出现“ACL 允许访问、chroot 却没锁住路径”的越权风险。
确认 SFTP 是否真正运行在 chroot 环境中
很多越权问题根源在于 SFTP 根本没 jail 成功,用户仍能通过 cd .. 逃逸到上级目录。必须逐层验证:
- 检查
/etc/ssh/sshd_config中该用户的Match User块是否启用ChrootDirectory,且路径存在、属主为root:root、权限为755(不可含 group/other 写位) - 确认该用户 shell 已设为
/sbin/nologin,且ForceCommand internal-sftp已启用(仅靠 nologin 不足以阻止 SSH 登录) - 用该用户执行
sftp -P 22 user@localhost连入后,立即运行pwd和ls -la /—— 若能看到/etc或/home,说明 chroot 失败 - 重启 sshd 并用
sudo journalctl -u sshd -n 50 --no-pager查看启动日志,确认无fatal: bad ownership or modes类报错
检查 ACL 条目是否覆盖了 chroot 路径外的敏感位置
ACL 是文件系统全局生效的,如果误给用户在 /data 或 /var/www 等非 chroot 目录设置了 r-x,而该用户又通过其他方式(如本地登录、SSH shell 绕过)获得访问能力,ACL 就成了越权入口。
- 用
getfacl -R / | grep -A2 "user:username:"扫描全盘,定位该用户所有 ACL 条目,重点检查是否出现在/、/home、/var等系统目录下 - 对 chroot 目录(如
/sftp/alice)及其子目录运行getfacl . upload download,确认 ACL 权限与业务需求一致(例如upload应有rwx,download可设r-x) - 特别注意默认 ACL(
default:user:alice:r-x)是否被错误设置在父目录上——它会递归影响新建文件,但不应出现在 chroot 根目录以外
模拟真实访问路径,验证最小权限闭环
不要依赖理论推导,直接以用户身份走一遍最危险的操作链:
- 用该用户通过 SFTP 登录后,尝试
cd ..多次,观察是否卡在 chroot 根;再试ls /etc/passwd,应返回 “No such file” 或 “Permission denied” - 若用户同时具备本地登录权限(如 shell 未禁用),切换为该用户执行
find / -type d -user username 2>/dev/null | head -10,确认其 home 或其他可写目录未意外挂载或软链到系统关键路径 - 检查是否存在符号链接绕过:在 chroot 内创建
ln -s /etc ./etc-link,然后ls -l ./etc-link—— 正常应显示 broken link,若能列出内容,说明 chroot 配置不严(需加AllowTcpForwarding no和X11Forwarding no) - 用
sudo -u username ls -ld /sftp/alice/upload验证 Linux 基础权限(owner/group/other)是否与 ACL 不冲突;ACL 优先于传统权限,但基础权限为---时,ACL 的rwx也无效
审计日志与连接上下文
越权常发生在多协议混用场景,单看 SFTP 配置不够:
- 查
/var/log/auth.log或journalctl -t sshd,筛选该用户名的登录记录,确认每次都是internal-sftp会话,而非sshd[pid]: Starting session: shell on pts/ - 检查是否启用了
PermitRootLogin或PasswordAuthentication等宽松策略,避免用户通过密码登录后绕过 SFTP 限制 - 若使用 LDAP 或 PAM 认证,确认其未覆盖本地用户 shell 设置(例如 PAM 模块强制分配
/bin/bash)











