sticky bit 限制共享目录中的删除操作
Linux 目录上的 sticky bit,为删除或重命名目录项增加所有权限制。它常与宽松的目录写入、搜索权限一起使用,让多个用户能够创建临时文件,又不能任意删除彼此的条目。普通目录权限检查和 sticky 所有权检查都需要满足;sticky 是额外条件,不会替代正常访问控制,也不能只凭这一位判断整个目录里的数据是否安全。 坏掉的样子 没有 sticky 时,用户只要具备目录所需的写入与搜索权限,通常就能删除另一个用户的文件,即使文件模式完全不允许内容访问。unlink 改变的是目录里的名字与对象关系,不要求调用者能够读取或覆盖文件内容。因此,在广泛可写目录中把文件设为 000,并不能单独保护该路径不被他人删除;应分别检查父目录和文件自身的规则。 启用 sticky 后,普通用户还需要拥有该条目或包含它的目录,才能执行相关删除。具有适当 CAP_FOWNER 能力的特权进程,可以绕过这项所有权限制。因此 sticky 约束的是具体权限模型下的同级用户,并不抵御所有管理员,也不保护文件免受目录所有者删除。把它描述为绝对隔离,会夸大真实保证。 sticky 不阻止本来被允许的内容访问。一个用户可能无法 unlink 某个 0666 文件,却仍然可以读取或覆盖它。新建子目录也不会自动继承父目录的 sticky 位。混淆路径保护、内容隐私和继承,会让共享目录树表现出与顶层看起来完全不同的行为,需要沿实际数据位置检查,而不是只看根部权限字符串。 sticky 限制目录项删除,并有所有权与能力例外。文件模式另行控制内容;实验结果是预期,不是新观察。 快速验证 把脚本保存为 sticky.py,只在获准的一次性 Linux 环境中启用断言运行 python3 sticky.py。控制进程需要 root 权限以分配三个数字身份并启动普通子进程,不会创建账号。历史文章报告 Linux 6.12.76 与 Python 3.11.2,但未找到原始日志,本轮也没有重跑。文件系统所有权、UID 映射与子进程能力必须符合预期权限模型,不能只看数字身份: ...