为什么空密码可以登录你的 Mac?

0x00

就在今天, macOS 被爆出一个重大缺陷: 任何人都可以使用管理员账户登陆, 用户名为 root, 密码可为空. 最早发现并公布复现过程的是 Lemi Orhan Ergin (@lemiorhan):

那么, 令人十分好奇的是, 这个问题是因为什么样的 bug 才导致的呢?


0x01

首先, 我们观察一下到底发生了什么. 当用户/攻击者尝试登陆一个在当前没有被启用的账户的时候, 系统将会创建一个新账户使用用户指定的任意内容作为密码, 包括空密码, 这就是为什么在 UI 触发时需要点击两次:

更深一点来看, 当用户尝试授给某个被 opendirectoryd handled 账户的时候:


* frame #0: 0x0000000104202acf opendirectoryd`od_verify_crypt_password + 453
frame #1: 0x0000000104487491 PlistFile`___lldb_unnamed_symbol26$$PlistFile + 550
frame #2: 0x000000010448e5a9 PlistFile`odm_RecordVerifyPassword + 158
frame #3: 0x00000001041eb40c opendirectoryd`___lldb_unnamed_symbol37$$opendirectoryd + 930
frame #4: 0x00000001042044a5 opendirectoryd`___lldb_unnamed_symbol313$$opendirectoryd + 56


一旦收到 mach XPC message, opendirectoryd 调用 odm_RecordVerifyPassword 方法, 这个方法之后调用了 od_verify_crypt_password. odm_RecordVerifyPassword 方法在 PlistFile binary 中被执行. 这个 bundle 从 /System/Library/OpenDirectory/Modules/PlistFile.bundle 加载到 opendirectoryd.


odm_RecordVerifyPassword 调用了一个未命名的方法 'sub_826b'. 这个 subroutine 首先调用了另外一个 helper function, 'sub_826b', 来读取 shadowhash(从用户尝试登陆的账户中). 对于一个已经存在的账户来说, 这并不成问题.

但是对于没有启用的账户来说, 这些信息并没有被提供, 所以这个函数会 fail. 这是很关键的一点.

$ dscl . -read /Users/root
AppleMetaNodeLocation: /Local/Default
GeneratedUID: FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000000
NFSHomeDirectory: /var/root
Password: *
PrimaryGroupID: 0
RealName:
System Administrator
RecordName:
root
BUILTIN\Local System
RecordType: dsRecTypeStandard:Users
SMBSID: S-1-5-18
UniqueID: 0
UserShell: /bin/sh

当 shadowhash 不存在的时候, 一个 'else' 代码分支被执行了:

在读取密码之后,它调用了 od_verify_crypt_password 来验证密码是否匹配. 在这里我们输入了 'hunter2'.

如果我们 step over 这个调用, 它将返回 al 的值也就是 01...是不是很有趣!

鉴于一个非零的值被返回了, 它讲继续调用其他方法比如 'sub_13d00'. 这将带来一个重要的影响: 将用户输入的数据作为 shadowhash/securetoken:

我们输入的任意 password 就这么变成了 root password.


0x02

总结一下:

  1. 在未启用的账户(例如 root)中, macOS 将指定用户输入密码作为账户密码;
  2. 在这个过程中, od_verify_crypt_password 返回非零值;
  3. 之后, 用户输入变成账户密码;

很明显, 关键问题就出在了 od_verify_crypt_password.


原文地址: Why <blank> Gets You Root

欢迎关注我们的公众号:SKE安全大事件

文章被以下专栏收录

    本专栏旨在: 1.分享国内外网络安全大事件。 2.科普网络安全。 3.分享技术。 欢迎投稿