跳到正文

密钥必须在线,能拦的是请求

2026年9月15日 3 分钟读完 Paymos Tech Paymos Tech
一条橙色虚线走到矮白围栏唯一的缺口,又拐回围栏外面,里面只有一个小方块,两根高柱立在一旁没被碰过——Paymos 热钱包安全插图

要点速览

托管型处理商签转出不等人批,这既是密钥必须在线的原因,也是「一条看起来合规的 请求」成为真正威胁的原因。围着它的每一道控制,值多少要看它留下的口子有多大: 分权凭证挡的是错的密钥,不是落到别人手上的对的密钥;目的地白名单框住钱能去 哪儿,对金额和对面钱包归谁一个字都不说;冻结拦住新的转出,召不回已经广播的。 在 Paymos 这边扛事的正是那份名单,所以它默认只有所有者能改、只在控制台里改、 没有 API 路由。

托管型处理商手里有一把能动你余额的密钥。下面任何一条都改不了这件事。这些控制改的是:能造出多少种转账让这把密钥点头。每一道关掉一条路,把别的路留着。带边界写出来的控制比不带边界的值钱,边界正是要摆一个人的地方。

密钥在线的理由很平常。商户在某个时区凌晨两点点下发送,服务商那边没人醒着,转账照样要拼出来、签好、发出去。冷钱包的定义恰恰是它答不了这件事。所以真正的问题从来不是密钥在不在线,而是一次请求在见到它之前得先穿过什么。

最大的一笔失窃,密钥没坏在哪儿

因为那笔交易是由本该签它的人签的。

2025年2月21日前后,约 15 亿美元的虚拟资产离开 Bybit,五天后 FBI 把这起盗窃归到朝鲜身上。失窃一周后,Safe 生态基金会在声明里描述了这条路径:针对 Bybit 那个 Safe 的攻击「was achieved through a compromised Safe{Wallet} developer machine」,结果是「the proposal of a disguised malicious transaction」。

好几个人批准了它。多签在一笔错的交易上完成了本职工作,签名个数从头到尾不是变量。下面每一道控制都值得拿这句去量:请求送到跟前时看起来已经合规,它还剩什么?

「隔离签名」隔离掉的是什么

签名的那一步,和商户、付款方够得着的界面。

Paymos 的出账交易在公开 Web 路径之外签名,转出默认只能指向商户事先批准的目标地址。隔离说的是够不够得着:它缩短「能把一次请求摆到密钥面前」的清单。这是实打实的工作,不过没有这个词听上去那么多。一条从正门进来、签名有效的请求,它一点办法没有。

它也不切分签字的权力。这是受管托管:商户授权,服务商运营签名与广播。这笔交换合不合自己的生意,是托管模式的选择,该在读下面任何一道控制之前做完。

财务主管接下来那个问题答案很短:余额放着的时候不出借,也不给 Paymos 产生收益。商户余额在 Paymos 账本里分户记账,复式记账。

两把凭证,只有一把能动钱

两把里恰好一把。这条分界是执行出来的,不是写在文档里的。

商户每个环境各持一把 Payment 凭证和一把 Payout 凭证。Payment 密钥覆盖账单和支付通道;Payout 密钥覆盖转出,以及校验目的地要用的读取。两边互不伸手,从插件、日志或笔记本里漏出去的付款密钥造不出转出,它没有转出权限可用。

检查只在一个地方跑:每条命令都过请求管线里同一步授权,不够的凭证在那里就被拒。一条一条路由自己写的权限检查,总有人在下季度新加的那条上忘掉。

旁边还有两件事。Payout 密钥可以绑一份 IP 白名单,但不是必须:名单为空,密钥从任何地址都能用,serverless 函数和出口 IP 会变的主机要的就是这样。Payment 密钥则根本带不了名单,付款流量本来就该从客户所在的地方打过来。IP 白名单收窄的是被盗的 Payout 密钥能从哪里调用。钱往哪儿去,不由它定,由下面的转出白名单定,有没有 IP 白名单都一样。转出白名单一旦关闭,IP 白名单就变成必须:没有它的 Payout 密钥会被拒绝。也没有按站点、按服务分发的密钥可签:每个环境各一把在用的,合计四把,吊销是终态。这属于事故预案,不属于宣传册。一次泄漏没法靠吊销「漏的那个集成」收口,那个环境里每个集成拿的都是同一把。

白名单管住方向,管不住别的

钱能去哪儿。不管多少,不管谁开的口,也不管那个地址还是不是你的。

机制短到可以摆在一处读:

  • 名单上什么都没有,就什么都出不去。空名单不读成「不限制」,它把转出关掉。
  • 条目按地址加网络族建键。批准一个 EVM 地址,一次盖住 Ethereum、BSC、Polygon、Arbitrum、Optimism、Base、Avalanche 和 Plasma;Tron、TON、Solana 各自成族。
  • 能进白名单的只有四族,所以 NEAR 和 Sui 收款,却收不了转出。
  • 移除是吊销不是删除,谁在什么时候能收到钱,这条痕迹留着。
  • 一次批准最多 1000 个地址,CSV 每份文件最多 1000 行,一个账户最多 5000 条在用条目。
  • 这一整块没有 API 路由。名单住在控制台里,Payout 密钥读得到它去校验目的地,加不了。

最后那一行值得停一下。能动钱的那把凭证扩不了钱能去的地方,这条分界还扛得住一次配置失误:从 API 做这件事的路根本没造出来。

它扛不住的,是转出白名单本身被关掉,而这个开关是存在的。账户所有者可以通过客服申请关闭,由 Paymos 团队成员决定。关闭之后,转出可以发到任何手动填写的地址:控制台里开了第二因素,每笔都要用它确认;Payout 密钥只能从它 IP 白名单里的地址调用。这时拿到账户的人,就能把资金转到自己的地址。所有者随时可以自己把白名单重新打开,已保存的地址都还在。

再看边界。白名单说的是方向,不说归属:商户完全可以有意批准客户或者玩家的地址,给终端用户转账就是这么做的。三月份为某个外包同事的钱包批下来的地址,九月还是已批准地址。

它也不说大小。转出压着两条账户限额:单笔转出的价值上限,和在途转出的并发上限;还剩几个在途名额,在转出表单里还没输入就显示出来。这两条框的是一次移动,白名单框的是方向。一笔转出可以舒服地待在两条限额里,同时去到今天早上你不会挑的地方。

谁可以往名单里加地址

能往那儿打钱的人多,能加地址的人少,这是故意的。

管理白名单默认落在账户所有者手里。财务角色可以往所有者批准过的目的地发转出,批不了新的;管理员角色默认没有转出权限。NIST 的术语表用工资单说完了这个原则:任何用户都不该拿到足以独自滥用系统的权限,批准一张工资支票的人,不该同时是能把它做出来的人。

默认值只是起点,权限还能单独授给某个成员。这条分离撑得住的前提是没人把它授出去又忘了,权限页面也就是这道控制的一部分。

那一刻的第二层是升级认证,而它不是无条件的。既没有 TOTP 也没有通行密钥的商户用户永远不会被问,因为它加强的是已经存在的因素,不存在的要不来。当成账号已经有的防护来读,它不是。两边都成立的是名单本身,只要它开着:转出只能指名单上的地址,加一个地址是单独记录在案的动作,名单为空就没有转出。

真的触发的时候,它绑在自己批准的那个动作上,用掉即失效。注意它站的位置:转出这一步不带验证,改名单这一步带。白名单关闭后,每一笔发往手动填写地址的转出都要验证。守的是门,不是每一次出门,而这正是把名单留短的全部理由。

已经在动的转出,还能拦下什么

越往后越少,这个形状提前知道有用。

取消是开头的一小段窗口,不是召回。转出还在 created 且没开始执行时收得回,往后就晚了;同一笔取消两遍也不出错,响应里还是那一笔转出。过了这一段,转账归链所有,而请求和不可逆交易之间,原来只站着白名单。

冻结工作在单笔转出之上。有一个全局出账冻结,还有一个针对单个资产加网络组合的,后者会自己抬起来:账本和钱包对不上,超过设定容差,这一对就停下,不等谁发现。记账上出了分歧,先停住分歧对准的那件事,再弄清哪边错了。安全机制本来就该这么工作。

另外,一条资产加网络的转出路线可能暂时不可用。这一对不出现在转出选择器里,指名它的请求在创建时被拒,余额分文未动,不进队列。这里的拒绝天生便宜。创建转出会把金额连同网络费一起移进冻结,没上链就结束的,冻结全额回来,网络费一起回来。重跑也便宜:external_order_id 在一个商户内唯一,重复创建返回已有的那笔转出,不再发一笔,保的是半路死掉的结算任务,保不了真的不一样的请求。

转出失败为什么只说一句话

因为另一个选项是把内部异常文本摆到商户屏幕上。

转出失败的原因不给商户看。给商户的那句从状态推出来:这笔转出没有发出去、冻结已经释放,以及去哪儿问。后面那个字段里躺着签名器和 RPC 的原始异常、内部数字和运营方备注,展示的那一端永远用封闭状态。

代价落在商户身上,缺的不只是那个原因。转出没发出去,不发邮件,控制台铃铛里也不放东西,一次失败只在 webhook 里出现,别处没有。转出剩下那段要多久,是另一页的事。

挑托管服务商该问哪几个问题

先问那笔什么都没干的余额,再问人。

它放着的时候,会不会被出借、质押,或者替服务商生息?再问:哪个角色批准目的地,这个角色能不能同时往那儿打钱,以及在没人登记第二因素的账户上,改名单那道验证做了什么?好的回答说得出一个角色和一道验证,不是报一支团队。最后问,转出没发出去时你们怎么告诉我、走哪条渠道。

有一道控制比其余的都重,就是那份已批准地址的名单。它有多短就有多管用,而值得守的时刻是它发生变化的那一刻——所以在 Paymos 这边,这次变化默认只有所有者能做、会记录在案、没有 API 路由,也是唯一会要第二因素的动作,而它后来授权的转出什么都不要。

Paymos 转出路上每一道控制,各自留下什么(2026年9月)
控制它挡住什么它挡不住什么
隔离签名从商户和付款方够得着的界面摸到签名那一步送到跟前时看起来已经合规的请求
Payment 与 Payout 凭证分开被盗的付款密钥造转出,它没有转出权限被盗的转出密钥打给名单上已有的地址;白名单关闭后,打给任何地址
Payout 密钥的 IP 白名单(可选)名单有条目时,从商户没列过的地址使用这把密钥从商户列过的那个网络里发出的请求
转出白名单任何商户没有事先批准的目的地已批准、却已经不归商户的地址;客服应所有者申请关闭名单后,什么都挡不住
改名单默认只有所有者能做财务角色批准自己随后要打钱的地址别人正登录着的所有者账号
改名单时的升级认证在线会话不经任何验证就加地址第二因素登记之前,它什么都挡不住
资产加网络的冻结账本和链对不上时,这一对上的新转出已经广播到网络上的转账

常见问题

加密货币处理商的热钱包指什么?

拼出转出并把它广播出去的那把签名密钥。它保持在线,是因为转出请求任何时刻都 可能来,而没有人守在旁边等着批。按需转出的处理商都在跑热钱包,叫什么名字是 另一回事。

API 密钥被盗,能把我的余额转走吗?

只有 Payout 密钥能创建转出,而且默认只能发到你白名单上已有的地址。Payment 密钥 完全没有转出权限。Payout 密钥的 IP 白名单可加可不加;加了,这把密钥就只认名单 上的地址。如果客服应所有者申请关闭了白名单,Payout 密钥可以发到任何地址, 没有 IP 白名单就会被拒绝。

转出白名单是空的会怎样?

什么都出不去。空名单不读成「不限制」,它把转出关掉,所以第一个目的地要先 批准,才有第一笔转出。

一条白名单条目能盖住所有网络吗?

条目按地址加网络族建键。一个 EVM 地址一次盖住八条 EVM 转出网络,Tron、TON、 Solana 各自成族。NEAR 和 Sui 收款,不能作为转出目的地。

白名单能用 API 管理吗?

不能。Merchant API 没有这条路由,名单在控制台里管。Payout 密钥读得到它去校验 目的地,加不了。

什么时候不该用处理商那一侧的转出控制

  • 如果公司政策要求每一笔出账都由自己的资金团队签名,别人签名器上的任何控制都满足 不了它。那是托管方式的决定,不是配置的决定。
  • 如果每一笔转出的目的地都是另一个客户钱包,已批准地址名单对你就是形状不对的控制, 维护它会变成它本来要省掉的那份活。
  • 如果打算把改名单时那道验证算进已有防护,先确认有人登记过 TOTP 或者通行密钥。没有 第二因素就没有可验的东西,而名单照样改得动。
  • 如果每笔转出发出去之前都要第二个人复核,这里没有审批队列可以打开。转出是创建出来 就发走的,复核只能放在请求之前。

参考来源

  1. 1. FBI IC3 — North Korea Responsible for $1.5 Billion Bybit Hack (accessed 2026-09-15)
  2. 2. Safe Ecosystem Foundation — Statement, 28 February 2025 (accessed 2026-09-15)
  3. 3. NIST CSRC Glossary — separation of duty (accessed 2026-09-15)
  4. 4. Paymos 文档 — 安全 (accessed 2026-09-15)
  5. 5. Paymos 文档 — 创建转出 (accessed 2026-09-15)

最近复核:2026年9月25日

#安全#转出#托管#热钱包
分享