
← Andrej Karpathy的RSS订阅清单5 days ago · 6 min
作者实测:「999999」竟能让Polkit直接拒绝
当管理员希望彻底禁止某个账户执行管理操作时,Polkit 的默认行为却可能将“拒绝”转化为一次 root 密码认证机会。本文通过实测和源码追踪,揭示了 Polkit 在管理员身份解析、空候选身份与回退逻辑上的关键设计假设。
文章还发现了一个颇具启发性的边界案例:返回一个不存在的数字 UID(如 `999999`),反而能得到干净的 “Access denied”。这不仅是一个实用技巧,更是一堂关于验证顺序、失败关闭与安全边界设计的深度解析。节目将带你理解其机制,也提醒你为何不应将长期安全性押注在实现细节上。
原文链接:
https://utcc.utoronto.ca/~cks/space/blog/linux/PolkitAlwaysAnAdmin
原文标题:Polkit insists on there always being administrative users
主要内容:
• Polkit 的 `addAdminRule` 机制隐含“始终存在可认证管理员”的设计前提,难以原生表达“完全没有管理员可用”的拒绝状态。
• 空数组、无效用户名、空组、无效组以及 `polkit.Result.NO` 等看似明确的拒绝写法,都会在不同环节触发 root 认证回退。
• 不存在的数字 UID(如 `999999`)可绕过早期用户名存在性校验,直到认证阶段才失败,从而直接返回 “Access denied”。
• 该技巧依赖当前实现中“先构造 UID 身份、后验证账户存在性”的顺序,未来实现变化可能改变其行为。
• 更稳妥的长期方案,是使用一个真实存在但密码已锁定的账户,建立不依赖偶然实现细节的失败关闭边界。
推荐理由: