Session Key 过期后还能继续操作,大概率是权限验证只看"有效期"字段,而忽略了链上状态变更。过期只代表你预设的时间窗口到了,但智能钱包在验证时,最终看的是该 Session Key 是否还在授权列表里活着。
步骤 1:确认 Session Key 的"过期"机制
先理清你用的钱包采用了哪种验证逻辑,这直接决定了过期后是否真的失效。
情况 A:仅本地时间验证(常见于早期实现)钱包在签名时检查
validUntil这个字段,如果当前时间大于该值,前端直接报错。但这里有个漏洞:如果验证方只信任签名内容而不同步校验链上状态,一个过期的 Session Key 签名仍然可以被 Bundler(打包器)接收,因为链上合约并没有主动删除你的授权。完成标准:查看交易是否被打包。如果过期签名仍能上链,说明验证机制有漏洞。情况 B:链上状态验证(符合 ERC-4337 标准)按照标准实践,Session Key 的权限由账户的验证模块(Validation Module)动态检查。权限是否有效不仅看时间戳,还看该 Session Key 是否被主动移除或覆盖。只要钱包没执行
removeSessionKey()操作,链上就会认为权限依然有效。完成标准:登录钱包后台,查看 Session Key 管理列表,看该 Key 是否仍显示为"已授权"或"有效"。
高危风险:如果你认为"过期即失效"而放松了对该 Key 的监控,恶意方可能在你以为失效的时间窗口内,利用未被及时移除的权限执行操作。正确的做法是:不要依赖过期时间作为唯一的保险,主动清理才是硬道理。只要不主动调用移除函数,权限在链上永远有效,直到你主动撤销。第三方文档也明确指出"授权一旦签署,权限是持久的,必须显式撤销"。
步骤 2:检查是否被"静态授权"机制覆盖
Session Key 的授权模型分为两种:静态授权和动态授权。
情况 A:静态授权(Static Delegation)这种模式下,你给了一个 Key 持续操作账户的权限。这个授权没有自动失效一说,必须通过钱包的管理界面手动点击"撤销"或"移除"。怎么做:进入钱包的"安全设置"或"授权管理",查看 Session Key 列表。如果该 Key 仍在列表中,即使过了你设定的有效期,它的权限标识符仍然是激活状态。完成标准:在列表中看不到该 Key,才算真正失效。
情况 B:动态授权(Dynamic Delegation)这种模式包含
validUntil等约束条件,由账户的验证逻辑(如插件)执行检查。怎么做:检查这笔过期交易调用的合约方法,看是否通过了validateUserOp的校验。如果校验逻辑写得不严格(比如忽略了时间戳),就会放行。完成标准:如果交易成功,说明动态授权中的时间检查被跳过或被漏洞利用。目前行业内尚未将时间检查作为 ERC-4337 的原生强制标准,具体取决于各钱包插件的实现。
常见失败原因
混淆"本地过期"与"链上过期":很多钱包只是在前端 UI 隐藏了操作按钮,但私钥或授权数据仍存在于链上。你的浏览器拒绝调用,不代表链上合约拒绝执行。
未及时调用撤销函数:在 thirdweb 这类 SDK 中,添加 Session Key 时有一个
permissionEndTimestamp,但该参数仅作为执行时的限制条件。如果不执行removeSessionKey交易,旧 Key 在合约层面依然是合法的签名者。
操作完成后
校验方式:立刻在区块浏览器搜索你的钱包地址,在"Internal Transactions"或"Events"日志中搜索
SessionKeyAdded或SessionKeyRemoved。如果你从未发起过移除操作,说明该 Key 依然有效。下一步动作:进入钱包授权管理界面,手动点击移除该过期的 Session Key,并支付一笔 Gas 完成链上状态变更。只有这样,权限才算彻底失效。完成后,重新发起一笔交易尝试,确认系统提示"未授权"或"签名无效"。



