关键操作:为什么有些动作会再次索要你的两台设备

·阅读 6 分钟·作者:SSP Editorial Team
SSP Academy 封面:SSP Enterprise 中的关键操作与重新签名

关键操作:为什么有些动作会再次索要你的两台设备

你已经登录。你有管理员角色。你点击「移除成员」——而 SSP 要求你用两台设备签名,就像你从头重新登录一样。

这不是为了摩擦而摩擦。这是在「会话令牌应当能够授权的操作」与「不应当的操作」之间刻意划下的一条线,而这条线背后的推理值得理解,无论你是否使用 SSP。

会话是为了方便,而不是为了承担后果

会话令牌是一种持有者凭证。就服务器而言,谁持有它,谁就是你。这正是会话之所以方便的原因——你认证一次,之后自由行动——也正是它作为不可逆决定之依据的糟糕之处。

会话会被偷走。通过一个跨站脚本漏洞、一台未锁屏的笔记本、恶意软件、一份泄露的备份,或者仅仅是在共享办公室里敞开的一个浏览器。OWASP 的会话管理指南把会话失窃视为一种预期状况而非边缘情形,而任何做出相反假设的设计都是乐观的。

对大多数操作而言这是可接受的风险,因为大多数操作是可逆的。重命名一个金库、添加一位观察者、调整一项通知设置——若一个持有被盗会话的攻击者做了这些,你撤销就是了。

有些操作不是这样。转移一个组织的所有权,是把控制权交给别人。移除一位成员,是切断他的访问。删除一个组织,是终局。对这些操作,SSP 要求证明:行动者此刻仍然同时持有两台设备——而不是他在当天更早的某个时刻曾经持有。

十三项操作

有十三项操作需要重新签名。它们分为四组。

组织控制权

  • 转移所有权
  • 删除组织

成员与角色

  • 移除一位成员
  • 将成员提升为管理员
  • 将管理员降级

账户身份

  • 更改企业邮箱
  • 移除企业邮箱

金库生命周期与管理

  • 归档一个金库,以及取消归档
  • 冻结一个金库,以及解冻
  • 提升一位金库管理员,以及将其降级

把它们联系在一起的,不是它们会转移资金——没有一项会,也没有一项能,因为只有签名人才能动用资金。把它们联系在一起的,是它们改变了此后谁能做事。这些正是攻击者会想要的操作:用来巩固访问权、把真正的所有者关在门外,或者悄悄为日后的盗窃做准备。

值得注意的是,与邮箱相关的操作也在名单上。更改账户的企业邮箱看起来只是行政动作,但它是账户劫持中经典的开局:先把恢复通道改道,然后从容行事。对它要求两台设备,就堵死了这条路。

为什么挑战由服务器撰写

机制与要求同等重要,而一项设计决定完成了其中大部分工作。

你所签名的消息由服务器生成。客户端从不生成。

一次关键操作,逐步拆解

如果由客户端自行拟定挑战,那么一个被攻破的客户端就能拟出一个称心如意的:一条描述无害操作的消息,由一位相信自己在做无害之事的用户签名,随后被重放到一个危险的接口上。让服务器来撰写这条消息,就意味着你所签的正是将被执行的,因为服务器会把签名与它自己签发的那条消息(而非任何其他消息)核对。

这与 SSP 用于登录的模式相同,也与使基于签名的身份验证在一般意义上安全的模式相同:绝不签署任何不是由将要验证它的一方交给你的东西。

挑战绑定了什么

这条消息不是一句泛泛的「同意」。它是一个具体的字符串,包含四样东西,合在一起就让一个被截获的签名在别处毫无用处。

确切的操作。 remove_membertransfer_ownership 会产生不同的消息。为其中一个所作的签名无法授权另一个。

确切的目标。 组织、相关情形下的金库,以及被操作的那个人,都会在消息中被点名。金库范围的操作会显式包含金库 ID,因此为冻结某一个金库而作的签名,无法被重放去冻结另一个。

一个时间戳。 它占据消息的前十三个字符——一个固定位置,因为 SSP Wallet 会在显示任何内容之前先校验该格式。挑战在十五分钟后过期。

一个随机 nonce 十二字节的密码学随机数,使得即便是在同一秒针对同一目标的同一操作,每个挑战也各不相同。

而且挑战是一次性的。当它被兑用时,服务器会在验证它的同一次原子操作中将其标记为已使用——因此一个被重放的签名会以「已使用」被拒绝,而不是悄无声息地第二次生效。过期的挑战由 TTL 索引自动清理。

每一次尝试都被记录,包括失败的

关键操作会写入一份永久日志,而这里有一个容易略过的细节:日志条目是在挑战被请求时写入的,而不仅仅是在操作完成时。

这意味着日志包含了被放弃的尝试、签名失败的尝试,以及被拒绝的尝试。孤立的一次关键操作失败,通常只是有人改了主意。凌晨三点接连出现的一串,则是一个故事。

与 SSP 审计轨迹的其余部分一样,这些记录没有过期时间,也没有清理任务。审计日志的价值,完全在于那些没人预料到会需要的部分。

这在实践中是什么样子

开始之前把两台设备都带在身边。 关键操作无法用一台设备完成,而挑战在十五分钟后过期。如果你的手机在另一个房间,先去把它拿来。

在手机上读那条操作,而不只是在面板上。 你的设备所显示的消息会点名操作与目标。这正是你注意到「目标并不是你以为的那个人」的机会——与你复核一笔交易时保护你的,是同一个习惯。针对加密用户的钓鱼攻击讲了为什么在第二台设备上多看那一眼,值回它花掉的几秒钟。

不要把它们打包。 每一项关键操作都有自己的挑战与自己的签名。如果你要移除三位离职员工,那就是三次签名。这是刻意的:打包意味着一个签名授权了多项变更,而那恰恰是我们想要避免的性质。

要预料到它们出现在最糟的时刻。 关键操作恰恰扎堆出现在有人离职、账户被攻破、金库需要冻结的时候——也就是人们压力最大、最想快点了事的时候。事先知道这些需要两台设备,就把一个意外变成了一个步骤。

关于「什么在强制什么」的更大图景——以及为什么重新签名位于中间那一层而非最强的一层——见究竟什么能拦下一笔交易。关于组织与其金库如何拼合,请从SSP Enterprise:面向团队的多签金库开始。

分享本文

相关文章