Back to Blog

#10 全景事件:XOR线性打破位置指纹方案

Code Auditing
February 13, 2026
7 min read

2025年8月25日,在Cantina和Seal911的协助下,Panoptic进行了一次白帽救援行动,成功挽回了约40万美元的风险资金[1]。根本原因是s_positionsHash的构建存在缺陷:协议使用XOR来聚合仓位ID的Keccak256哈希值,形成一个单一的指纹。虽然单个Keccak256哈希值是抗碰撞的,但XOR的数学线性使其复合指纹变得不安全。攻击者可以生成一组伪造的仓位ID,其XOR聚合哈希值与任何目标指纹匹配,从而绕过协议的仓位验证,在不偿还债务的情况下提取抵押品。

背景

Panoptic是一个构建在以太坊上的去中心化永续期权交易协议,允许用户交易看跌期权和看涨期权。

withdraw()函数有一个输入参数positionList,它由一组tokenId组成。每个tokenId代表一个仓位。withdraw()函数根据s_positionsHash检查每个仓位的债务状态,然后提取用户的抵押品。

为了节省Gas,协议不存储用户的每一个仓位(即tokenId)。相反,它根据用户所有tokenId计算一个指纹,并将其记录在s_positionsHash中。每个s_positionsHash的最高8位代表numLegs,而较低的248位代表user position hash

对于每个通过的tokenId,协议会计算其哈希值,取最低248位,并通过与当前s_positionsHash的最低248位进行位异或操作来更新user position hash

同时,countLegs根据tokenId的数值范围进行调整:当tokenId小于2642^{64}时保持不变,当在(264,2112)(2^{64}, 2^{112})(2112,2168)(2^{112}, 2^{168})(2168,2208)(2^{168}, 2^{208})的范围内时,分别增加1、2或3。最后,这些值被写入s_positionsHash的最高8位以更新numLegs

漏洞分析

根本原因是合约构建s_positionsHash的算法存在缺陷,特别是使用XOR操作来聚合Keccak256哈希结果。虽然单个哈希函数是安全的,但XOR操作的数学线性使得整体指纹算法(即哈希的XOR和)不安全[2]。

线性意味着攻击者不需要破解哈希函数本身(即从哈希反向推导tokenId)。相反,他们可以采用组合策略:生成大量随机tokenId,计算它们的Keccak256(tokenId),然后从这些哈希值中选择一个特定子集,使得这些tokenId哈希值的XOR和精确匹配受害者的目标指纹。

这使得攻击者在调用withdraw()时能够传入一组伪造的tokenId,以通过健康检查并提取与s_positionsHash对应的所有抵押品。

理论

假设用户的仓位指纹s_positionsHash具有user position hash TTnumLegs kk,用户tokenId{t1,t2,,tn}\{t_1, t_2, \dots, t_n\}。因此:

i=1k[Hash(ti)(mod2248)]=T\bigoplus_{i=1}^{k} [\text{Hash}(t_i) \pmod{2^{248}}] = T

这里,每个248位哈希值可以看作一个248维向量。

Hash(ti)(mod2248)=[b0,b1,,b247]T,其中 bi{0,1}\text{Hash}(t_i) \pmod{2^{248}} = [b_0, b_1, \dots, b_{247}]^T, 其中\ b_i \in \{0, 1\}

因此,TT位于一个由0和1组成的248维空间(F2248\mathbb{F}_2^{248})中。在这个空间中,XOR操作等同于向量加法(附录I)。

攻击者的目标是找到nn个248维向量{v1,v2,,vn}\{v_1, v_2, \dots, v_n\},这些向量来自所有可用向量,使得它们的XOR和的低248位等于TT。因此,我们可以将攻击者的目标表述为一组线性方程:

x1v1+x2v2++xnvn=Tx_1 v_1 + x_2 v_2 + \dots + x_n v_n = T

具体来说,我们不需要直接尝试构建TT。相反,我们选择nn个线性无关的哈希向量{v1,v2,,vn}\{v_1, v_2, \dots, v_n\}(其中nn等于维度248),并使用它们作为列向量来构建一个n×nn \times n矩阵AA

A=[v1,v2,,vn]A = [v_1, v_2, \dots, v_n]

问题就转化为找到一个系数向量xx,使得:

Ax=TA \cdot x = T

其中x=[x1,x2,,xn]Tx = [x_1, x_2, \dots, x_n]^T,且xi{0,1}x_i \in \{0, 1\}

根据线性代数理论,只要矩阵AA是满秩的,它就张成了整个nn维空间。这意味着对于任何目标TT,方程组都有唯一解。求解xx后,我们只需保留那些xi=1x_i=1的向量viv_i;它们的XOR和就是TT

示例

为便于理解,我们通过一个案例研究来演示这个构建过程。假设向量是3维的,每个维度只包含0或1,目标哈希值为101,即T=[1,0,1]TT = [1, 0, 1]^T

接下来,我们随机生成3个哈希值:

  • v1=[1,1,0]Tv_1 = [1, 1, 0]^T
  • v2=[0,1,0]Tv_2 = [0, 1, 0]^T
  • v3=[0,1,1]Tv_3 = [0, 1, 1]^T

我们使用这三个向量作为列来构建矩阵AA,并设置方程Ax=TAx=T

[100111001][x1x2x3]=[101]\begin{bmatrix} 1 & 0 & 0 \\ 1 & 1 & 1 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \\ x_3 \end{bmatrix} = \begin{bmatrix} 1 \\ 0 \\ 1 \end{bmatrix}

通过高斯消元求解,我们得到x=[1,0,1]Tx = [1, 0, 1]^T。这意味着我们需要选择v1v_1v3v_3(对应于x1=1,x3=1x_1=1, x_3=1),它们的XOR和恰好等于目标TT

选择n个线性无关向量

如前所述,为了求解Ax=TAx=T,我们需要构建一个满秩矩阵AA。考虑到我们处理的是一个极大的向量空间(m=2248m = 2^{248}),核心问题是:如何从这个庞大的空间中快速选择nn个线性无关的向量?

考虑最简单的方法:随机生成nntokenId,并选择它们的哈希结果作为向量。

F2\mathbb{F}_2上,nn个随机选择的nn维向量构成一个满秩矩阵的概率PP为:

P(n)=k=0n1(12k2n)P(n) = \prod_{k=0}^{n-1} \left(1 - \frac{2^k}{2^n}\right)

nn很大时(在本例中,n=248n=248),这个概率收敛到一个常数(附录II):

limnP(n)0.28879\lim_{n \to \infty} P(n) \approx 0.28879

这意味着每次随机尝试大约有**28.9%**的成功率。平均而言,攻击者只需约3.5次尝试即可找到一组线性无关的向量。因此,计算成本极低,攻击者可以快速构建一个满足条件的矩阵AA

为了控制最高8位中的countLegs,我们只需根据目标countLegs调整随机生成的tokenId值的范围。

例如,如果我们希望伪造指纹中的numLegs为0,我们只需确保随机生成的nntokenId都小于2642^{64}。由于该范围内tokenId的legs增量为0,无论高斯消元解xx选择哪些向量,最终累加的numLegs都将不可避免地为0。

攻击分析

白帽救援者发起了多次救援交易。为简化起见,以下讨论仅基于其中一笔交易[3]。

核心逻辑包含以下5个步骤:

  1. 通过Aave的闪电贷借入0.23e8 WBTC和28e18 WETH。
  2. 将0.23e8 WBTC和28e18 WETH存入poWBTC合约和0x1f8d_poWETH合约。
  3. 调用PanopticPool合约的mintOptions(),使用一个正常的positionIdList来借入资金并开立杠杆仓位。
  4. 调用withdraw(),传入伪造的tokenId。由于这些伪造的仓位positionSize为0,该函数返回的tokenRequired为0,意味着所有仓位所需总抵押品被错误地计算为零。同时,由这些tokenId生成的s_positionsHash与步骤3中生成的完全相同,允许救援者在不偿还任何债务的情况下提取所有抵押品。
  5. 偿还闪电贷并执行下一轮。

总结

此次事件暴露了两个叠加的缺陷,共同导致了未经授权的抵押品提取。

  • XOR不是安全的哈希聚合函数。Keccak256是抗碰撞的,但XOR的线性意味着多个哈希的XOR和不具备这种属性。构建一组哈希值XOR为任何目标值的输入集,归结为解决F2\mathbb{F}_2上的线性方程组,这在计算上是微不足道的。哈希组合需要保留抗碰撞性的操作,例如拼接后重新哈希。
  • 仓位ID验证缺失。协议未能验证传入的positionId是否对应于有效的期权仓位。低于2642^{64}的值带有countLegs为0和positionSize为0,意味着伪造的仓位不产生任何债务。这使得攻击者能够以零抵押品要求通过健康检查,同时匹配目标指纹。

参考

  1. https://x.com/Panoptic_xyz/status/1961187739866644524

  2. https://cseweb.ucsd.edu/~mihir/papers/inchash.pdf

  3. https://app.blocksec.com/explorer/tx/eth/0x67a45dfe5ff4b190058674d7c791bbdc48e889f319f937c24fa13a5f9093f088

附录

以下两个附录提供了主文本陈述的数学解释和证明,即XOR操作等同于向量加法(附录I),以及随机矩阵满秩的概率(附录II)。

附录I

在有限域F2={0,1}\mathbb{F}_2 = \{0, 1\}中,加法定义为模2加法:

0+0=00+1=11+0=11+1=0(mod2)\begin{aligned} 0 + 0 &= 0 \\ 0 + 1 &= 1 \\ 1 + 0 &= 1 \\ 1 + 1 &= 0 \pmod 2 \end{aligned}

观察表明,这与逻辑运算异或(XOR,符号\oplus)相同。

对于nn维向量空间F2n\mathbb{F}_2^n(在本例中n=248n=248),两个向量u=[u1,,un]Tu = [u_1, \dots, u_n]^Tv=[v1,,vn]Tv = [v_1, \dots, v_n]^T的加法定义为分量模2加法:

u+v=[u1+v1(mod2)un+vn(mod2)]=[u1v1unvn]=uvu + v = \begin{bmatrix} u_1 + v_1 \pmod 2 \\ \vdots \\ u_n + v_n \pmod 2 \end{bmatrix} = \begin{bmatrix} u_1 \oplus v_1 \\ \vdots \\ u_n \oplus v_n \end{bmatrix} = u \oplus v

因此,在F2n\mathbb{F}_2^{n}向量空间中,向量加法等同于向量分量的按位异或运算。

附录II

为了使矩阵满秩,这nn个向量必须是线性无关的。

第一个向量v1v_1可以是F2n\mathbb{F}_2^n中除了零向量以外的任何向量,有2n12^n - 1种选择;第二个向量v2v_2不能落在{v1}\{v_1\}张成的子空间中,该子空间包含212^1个向量,剩余2n22^n - 2种选择;按照这个逻辑,第kk个向量vkv_k不能落在前k1k-1个向量张成的子空间中,有2n2k12^n - 2^{k-1}种可能选择。

这样(即GL(n,F2)GL(n, \mathbb{F}_2)的阶数)的矩阵总数为:

N=k=0n1(2n2k)=(2n1)(2n2)(2n4)(2n2n1)N = \prod_{k=0}^{n-1} (2^n - 2^k) = (2^n - 1)(2^n - 2)(2^n - 4)\cdots(2^n - 2^{n-1})

所有可能的n×nn \times n矩阵的总数为(2n)n=2n2(2^n)^n = 2^{n^2}

因此,概率PP为:

P=k=0n1(2n2k)2n2=k=0n1(2n2k2n)=k=0n1(12k2n)P = \frac{\prod_{k=0}^{n-1} (2^n - 2^k)}{2^{n^2}} = \prod_{k=0}^{n-1} \left( \frac{2^n - 2^k}{2^n} \right) = \prod_{k=0}^{n-1} (1 - \frac{2^k}{2^n})

j=nkj = n - k,我们可以将此表达式重写为:

P=j=1n(112j)P = \prod_{j=1}^{n} \left(1 - \frac{1}{2^j}\right)

nn \to \infty时,该乘积收敛到一个常数:

P0.288788P \approx 0.288788

这意味着,对于大的nn,随机矩阵满秩的概率约为28.9%


关于BlockSec

BlockSec是一家全栈式区块链安全和加密合规提供商。我们构建产品和服务,帮助客户在协议和平台的整个生命周期内进行代码审计(包括智能合约、区块链和钱包)、实时拦截攻击、分析事件、追踪非法资金,并满足AML/CFT合规要求。

BlockSec已在著名会议上发表了多篇区块链安全论文,报告了多起DeFi应用零日攻击,阻止了多次黑客攻击并挽回了超过2000万美元的资金,保护了数十亿美元的加密货币。

Sign up for the latest updates
Newsletter - April 2026
Security Insights

Newsletter - April 2026

In April 2026, the DeFi ecosystem experienced three major security incidents. KelpDAO lost ~$290M due to an insecure 1-of-1 DVN bridge configuration exploited via RPC infrastructure compromise, Drift Protocol suffered ~$285M from a multisig governance takeover leveraging Solana's durable nonce mechanism, and Rhea Finance incurred ~$18.4M following a business logic flaw in its margin-trading module that allowed circular swap path manipulatio

~$7.04M Lost: GiddyDefi, Volo Vault & More | BlockSec Weekly
Security Insights

~$7.04M Lost: GiddyDefi, Volo Vault & More | BlockSec Weekly

This BlockSec weekly security report covers eight attack incidents detected between April 20 and April 26, 2026, across Ethereum, Avalanche, Sui, Base, HyperLiquid, and MegaETH, with total estimated losses of approximately $7.04M. The highlighted incident is the $1.3M GiddyDefi exploit, where the attacker did not break any cryptography or use a flash loan but simply replayed an existing on-chain EIP-712 signature with the unsigned `aggregator` and `fromToken` fields swapped out for a malicious contract, demonstrating how partial signature coverage turns any historical signature into a generic permit. Other incidents include a $3.5M Volo Vault operator key compromise on Sui, a $1.5M Purrlend privileged-role takeover, a $413K SingularityFinance oracle misconfiguration, a $142.7K Scallop cross-pool index injection, a $72.35K Kipseli Router decimal mismatch, a $50.7K REVLoans (Juicebox) accounting pollution, and a $64K Custom Rebalancer arbitrary-call exploit.

Weekly Web3 Security Incident Roundup | Apr 13 – Apr 19, 2026
Security Insights

Weekly Web3 Security Incident Roundup | Apr 13 – Apr 19, 2026

This BlockSec weekly security report covers four attack incidents detected between April 13 and April 19, 2026, across multiple chains such as Ethereum, Unichain, Arbitrum, and NEAR, with total estimated losses of approximately $310M. The highlighted incident is the $290M KelpDAO rsETH bridge exploit, where an attacker poisoned the RPC infrastructure of the sole LayerZero DVN to fabricate a cross-chain message, triggering a cascading WETH freeze across five chains and an Arbitrum Security Council forced state transition that raises questions about the actual trust boundaries of decentralized systems. Other incidents include a $242K MMR proof forgery on Hyperbridge, a $1.5M signed integer abuse on Dango, and an $18.4M circular swap path exploit on Rhea Finance's Burrowland protocol.

Best Security Auditor for Web3

Validate design, code, and business logic before launch. Aligned with the highest industry security standards.

BlockSec Audit