ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Havenlon 执行控制工程 15|从密钥保管,到密钥使用边界

Havenlon 执行控制工程 15|从密钥保管,到密钥使用边界 提到安全芯片Secure Element多数人的第一反应是把私钥放进去。密钥不再躺在普通文件系统里应用程序读不到它即使操作系统被攻破攻击者也很难把它直接导出。这个理解没有错但它只覆盖了安全芯片价值的一部分。如果它的作用仅仅是把一段秘密从软件存储搬进一个更难读取的硬件空间那么被解决的只有一个问题攻击者能不能把秘密拿走。而在高风险执行系统里还有另一个同样重要、也更贴近现实的问题即使秘密永远不会被拿走谁可以让这把密钥替他工作私钥无法导出并不意味着它不会被错误使用。攻击者不一定非要拿到私钥本身——如果他已经控制了能够调用芯片的软件而芯片对所有格式合法的请求都无条件响应那么他根本不需要知道那把私钥长什么样只需要让芯片替自己签一次。秘密是否安全和秘密是否会在错误条件下被合法使用是两个不同的问题。一、拿不走解决了什么又没解决什么传统软件密钥最直接的困难是密钥材料终究要存在于某个软件可以访问的位置——文件、数据库、内存、配置或者操作系统的密钥区。一旦攻击者取得足够权限就有机会读取、复制或转移它。安全芯片提供了一种重要能力密钥可以在芯片内部生成或安全导入之后外部系统不再获得完整的私钥材料。软件能做的只是请求对这段数据完成某项密码学操作计算发生在芯片内部返回的是结果。这是一个实质性的变化。过去攻击者的目标可能是拿走密钥现在即使主机系统出现问题私钥仍有机会留在独立的硬件边界之内。但这只是第一层。拿不走不等于用不了。可以用一个现实中的保险箱来理解。一把关键钥匙永远锁在里面谁也取不出来听上去很安全但如果箱子外面有一个按钮任何拥有主机最高权限的人都可以无限次按下它那么风险只是从偷钥匙变成了调用钥匙。钥匙没有泄露密码学完全正常所有签名都是真签名唯一的问题是这把钥匙替错误的人完成了正确的操作。这类风险值得警惕因为不少系统会把私钥没有泄露近似当成签名能力没有失陷。实际上如果恶意软件能够调用合法的签名接口它产生的签名在外部验证者看来与正常业务签名并无区别。密钥的保密性和密钥的使用控制是两个不同的安全问题——芯片天然擅长前者后者取决于整个系统怎么设计。二、硬件签名边界和一个不同的信任域当私钥无法离开芯片之后密码学操作本身也搬进了另一个执行域。软件不再是读出私钥、本地计算签名而是准备好待签对象、请求硬件操作、由硬件完成并返回结果。这条硬件签名边界的价值不只在于密钥藏得更深更在于真正产生签名的那一步已经离开了普通软件运行环境。系统因此第一次有机会在签名真正发生之前建立额外条件调用者身份是否正确设备当前是否处于允许状态请求是否属于正确的协议用途必要的上下文是否存在内部安全状态是否有效。不同硬件提供的能力各不相同完整的执行判断也不该被一股脑塞进芯片。但工程上的关键变化在于密码学能力有了自己的边界——软件可以请求硬件可以决定是否完成它被允许承担的操作。这背后是一种信任分离。硬件之所以有价值并不是因为它天然绝对安全而是因为它与普通软件构成了不同的信任域主机有最高权限账户容器有管理员平台有控制面而芯片内部通常拥有自己的密钥存储、密码学引擎、内部状态、访问控制和设备身份。攻击者即使已经控制某个软件层也不会自动获得对硬件内部状态的同等控制力。一次软件失陷不再天然等于密钥材料同时失陷。三、它能提供的不止是存放密钥除了不可导出的密钥安全芯片还能提供几类常被低估的能力它们的共同点是都与执行边界有关。随机性。密码学系统高度依赖高质量随机数——生成密钥需要它某些协议参数、挑战值和一次性对象也需要它。如果随机源出现严重问题即使算法完全正确整个系统的安全基础也会受影响。这说明密钥安全并不只在生成之后如何保存还在更早的位置这把密钥最初是不是在足够可靠的随机条件下产生的。独立的硬件随机能力让这一点不完全依赖普通操作系统或单一软件环境。当然用了硬件随机源也不等于自动安全系统仍需考虑随机能力是否健康、异常时如何处理、状态无法确认时是否应当继续。状态连续性。有一类问题靠私钥解决不了这是不是第一次执行某个动作是否已经发生过某个状态是否被回滚到了旧版本某个序列有没有倒退。它们的核心不是数据有没有签名而是系统有没有可靠地记住自己走到了哪里。普通数据库里的一个计数值权限足够的人可以随手改回过去而硬件中受保护的单调状态能力提供的是一种更难随意回退的基础——某些状态一旦向前就不能像普通文件那样轻易复原。这对重放防护、证据序列和设备生命周期都有意义。安全芯片保护的不只是秘密也可以帮助保护历史。设备身份。现代系统大量关注用户身份而当执行链里出现独立硬件节点时还需要回答这一步究竟由哪一台设备参与完成。这不能靠主机自己声明——主机若已失陷它同样可以改写这个字符串。与硬件绑定的密码学身份让后续系统可以验证某一步确实由某个特定硬件参与设备因此不再只是运行软件的机器而成为具有密码学身份的执行参与者。原语隔离。普通应用往往拥有庞杂的能力读网络、写文件、加载模块、处理输入、访问数据、执行大量业务逻辑。代码越多攻击面通常越大。而签名、密钥生成、随机数这些高敏感原语并不需要如此复杂的运行环境。把它们收进一个更受限的边界符合一条相当经典的原则把高价值能力放进尽可能小的可信计算范围。边界越小越容易分析、测试、限制和隔离。这不保证里面永远没有问题但比让所有高价值秘密与普通业务代码共享同一个巨大运行环境更容易形成明确的责任划分。四、它知道我有这把钥匙未必知道为什么现在要用这里必须开始保持克制。芯片很强但它不是一套完整的执行控制系统。假设上层软件递来一份待签数据内容是向某个账户转出一笔款项。芯片可以很好地完成密钥选择、密码学计算、私钥保护甚至依据自身能力做一些受限检查。但它通常并不知道这个收款方是谁、这笔款为什么产生、审批人当时看到了什么、规则有没有被污染、上游是否受到提示注入、账户风险状态有无变化、这是不是一笔重复付款。这些都是高层语义而芯片的优势恰恰来自它不运行如此庞大的业务逻辑。所以反过来推导用了安全芯片执行就是安全的是另一种过度简化。把问题拆成三层会更清楚。第一层是密钥存放——它在哪里能否被导出这是安全芯片最擅长的部分。第二层是密钥操作——谁可以请求请求属于哪一类用途硬件当前是否处于允许状态这是硬件签名边界开始介入的地方。第三层是执行语义——这次签名背后的现实动作究竟该不该发生这需要理解意图、审批、规则、状态、上下文和证据。从密钥没有泄露到现实执行正确中间还隔着相当长的一段路。五、最大的误用一个随时愿意签名的盒子如果一套系统的结构是软件生成数据、递给芯片、芯片无条件签名、软件拿着签名继续执行那么这枚芯片主要解决的是密钥被提取的风险而没有触及执行授权的风险。一旦上层失陷攻击者仍然可以持续提交格式合法的请求芯片会非常安全、非常正确地为错误目的产出合法签名。密码学组件工作得越完美错误请求产生的签名反而看起来越合法。所以要让硬件真正进入执行控制体系问题不能停在密钥能不能被导出还要继续问什么条件下这把密钥才获得被使用的资格。与之配套的是密钥的用途。此前讨论域分离时提到语义不同的协议对象不该共享同一种密码学含义同样的原则适用于硬件里的密钥能力。一把密钥不该只被理解成某台设备的私钥还应尽可能明确它为什么存在、允许用于哪一类操作、不应该被用来证明什么。如果一把万能密钥可以同时证明身份、授权执行、签署证据、批准更新那么它一旦被错误调用影响范围就会非常大。这与此前讨论过的不要让任何单一角色拥有全部能力是同一种思路——不要让任何单一能力拥有无限用途。由此可以推出硬件真正有意义的那一步如果软件说签硬件必定签那么软件仍是最终权力中心硬件只是密码学外设。有意义的边界必须允许另一种可能——软件请求硬件拒绝。而这个拒绝不是随机故障是因为当前状态不满足、必要条件尚未建立、请求不属于允许用途、安全状态无法验证。到这一步围绕硬件构建的边界才拥有真正的否决能力这与安全存储是完全不同的价值层次。六、边界要小不要把整套规则搬进芯片走到这里又容易滑向另一个极端既然硬件要判断是否允许签名是不是应该把完整的业务规则都搬进去未必。芯片最重要的优势之一恰恰是边界小、职责明确、攻击面有限。若为了让它什么都懂而不断加入复杂业务逻辑、网络状态、动态规则和外部数据硬件边界会越来越像另一个复杂软件平台反而削弱它原有的长处。更稳妥的分工是只让硬件掌握那些它真正需要独立坚持的不变量。复杂的业务判断留在上层组织审批留在上层策略计算留在适合的软件系统里而靠近最终执行的位置保留少数不能被上层轻易覆盖的条件。策略引擎擅长处理丰富上下文、组织规则、复杂逻辑和大量外部输入硬件边界更适合保护关键密钥、维持独立状态、验证必要的密码学关系、执行少量明确约束并在条件不足时保留拒绝。不是让硬件比软件更聪明而是让硬件在少数事情上更难被说服。还需要再抽象一层不可导出的密钥、随机能力、受保护状态、设备身份、签名操作这些终究都只是安全原语。原语是构建安全系统的材料不是安全系统本身。一个算法安全不意味着使用它的系统自动安全同样芯片安全也不意味着所有调用它的执行流程自动正确。真正的工程工作是把这些原语放到正确的位置保护该保护的状态拒绝不该拥有的用途参与需要参与的环节同时不去承担它无法理解的业务语义。七、Agent 时代从保管密钥到约束密钥的使用Agent 正在越来越多地持有接口凭据、服务账户、签名能力和基础设施权限。如果这些秘密直接暴露在它所处的软件环境里风险相当明显。把密钥移进不可导出的硬件边界可以显著降低运行环境失陷后密钥被直接复制的可能这是有价值的。但同一个时代也让另一个问题更突出Agent 不需要偷钥匙它只需要合法地调用钥匙。如果因为提示注入、上下文污染、规划偏差或判断错误而生成了一次危险的签名请求而硬件对任何请求都照签那么不可导出并没有阻止错误执行。所以硬件安全需要从密钥保管进一步走向密钥使用边界。如果最终设计只是私钥在硬件里软件可以随意请求签名物理边界保护的仍然只是秘密的提取。更强的目标是让使用这个秘密本身也必须穿过一道明确的边界——拥有接口权限不一定够拥有主机最高权限不一定够拥有云端管理权限也不应该天然够某些高风险的密码学动作仍需满足另一组独立条件。这也解释了硬件证据在执行链中的正确位置。某一步能够证明这次密码学动作确实由某个特定硬件身份完成这是重要的事实但它无法单独说明上游意图是否正确、审批是否有效、规则是否合理、状态有没有变化。正确的读法不是硬件签了所以一切正确而是硬件签了因此可以确认执行链中的这一层确实由指定的硬件边界参与。它只证明自己负责的那部分——不要求任何一个节点去证明整个世界。八、从保险箱走向执行边界安全芯片既容易被低估也容易被高估。低估它的人会说不就是存个私钥吗实际上它还能提供独立的密钥域、硬件签名边界、随机能力、受保护状态、设备身份和原语隔离这些都会实质性地改变系统的信任结构。高估它的人则会说私钥进了芯片系统就安全了。这同样不成立——芯片无法独自知道这次动作是不是使用者真正想要的审批有没有被污染规则是否仍然有效状态有没有改变最终执行是否应该发生。换个角度看会更清楚攻击者真正想要的往往不是私钥本身而是产生一个系统会接受的合法结果。只要能做到这一点密钥有没有被复制出去甚至并不重要。所以高风险系统需要保护的对象不只是秘密材料还包括密码学能力本身——谁能够让这个秘密参与一次有效的操作。这份能力应当有用途、有边界、有状态、有责任、有上下文。如果把密钥比作一把枪安全存储解决的是谁能把枪拿走执行控制还要解决谁能扣动扳机以及在什么条件下扳机应当是锁住的。需要说清楚的是这些设计都不消除风险。硬件同样有漏洞、固件、供应链和物理攻击面它做的是增加一个与普通软件不同的失陷条件让一次完整失陷需要跨越更多彼此独立的边界而不是成为一个新的、必须被无条件信任的中心。把私钥藏起来只解决了秘密是否会泄露执行控制还要解决秘密什么时候允许被使用。成熟的硬件安全不该满足于密钥永远不离开芯片。它还应继续追问即使密钥永远不会离开谁有资格让它在这一刻发挥作用。当这个问题被认真回答时安全芯片才从一个存私钥的保险箱变成现实执行之前的一部分边界。
返回列表