漏洞随笔:通过Jet Protocol任意提款漏洞浅谈PDA与Anchor账号验证_UNT:giccoin

据 Jet Protocol 官方博客披露,他们近期修复了一个赏金漏洞,这个漏洞会导致恶意用户可以提取任意用户的存款资金,慢雾安全团队对此漏洞进行了简要分析,并将分析结果分享如下。

(来源:https://www.jetprotocol.io/posts/jet-bug-disclosure)

相关信息

Jet Protocol 是运行在 Solana 上的一个借贷市场,用户可将账号里的代币(如:USDC、SOL)存入金库,赚取年化收益,同时也可以按一定的比例借出另一种代币。在这个过程中合约会给用户一个 note 凭证,作为用户未来的提款凭证,用我们熟悉的字眼来说就是 LP,而本次漏洞发生的原因也和这个 LP 的设计有关。

我们知道和以太坊合约相比,Solana 合约没有状态的概念,取而代之的是账号机制,合约数据都存储在相关联的账号中,这种机制极大提升了 Solana 的区块链性能,但也给合约编写带来了一些困难,最大的困难就是需要对输入的账号进行全面的验证。Jet Protocol 在开发时使用了 Anchor 框架进行开发,Anchor 是由 Solana 上的知名项目 Serum 团队开发的,可以精简很多账号验证及跨合约调用逻辑。

EOS EVM发布v0.4.2版本,包含严重安全漏洞修复:5月16日消息,EOS网络基金会发推文称,EOS EVM已发布v0.4.2版本,此版本修复了EOS EVM中发现的一个严重安全漏洞。EOS主网实施的EOS EVM合约、EOS EVM节点和EOS EVM RPC组件都需要升级。[2023/5/16 15:05:17]

Anchor 是如何工作的呢?我们可以从 Jet Protocol 的一段代码说起:

programs/jet/src/instructions/init_deposit_account.rs

这里的 deposit_account 账号就是用于存储 LP 代币数据的账号,用户在首次使用时,需要调用合约生成该账号,并支付一定的存储费用。

而这里的 #[account] 宏定义限定了这个账号的生成规则:

BitKeep完成对800万美元APK漏洞的补偿:金色财经报道,多链钱包BitKeep宣布已对受7.2.9影响的用户进行全额补偿。截至3月29日,受事件影响的 11,090 个钱包已获得全额赔偿。此外,BitKeep表示其客户服务渠道仍然开放,以处理一些非常规的索赔和申诉。

此外,继上周Bitget加密货币衍生品交易所以 3 亿美元的估值投资 3000 万美元后,BitKeep将更名为Bitget Wallet。作为整合的一部分,BitKeep 将能够在未来出现安全威胁时使用 Bitget 的 3 亿美元 Bitget 用户保护基金。[2023/3/29 13:33:17]

规则 1:#[account(init, payer = <target_account>, space = <num_bytes>)]这个约束中,init 是指通过跨合约调用系统合约创建账号并初始化,payer=depositor 意思是 depositor 为新账号支付存储空间费用。

OpenSea向两名发现漏洞的白帽黑客各奖励10万美元赏金:9月28日消息,OpenSea 已向两名发现漏洞的白帽黑客奖励 20 万美元赏金。其中一人是安全公司 Zellic 的安全专家兼首席营销官 Corben Leo,其通过漏洞赏金平台 HackerOne 发现了一个关键的 OpenSea 漏洞,并表示该漏洞可能会被利用以盗取资产;另一名白帽黑客名为 Nix,未透漏有关漏洞的信息。两人各获得了 10 万美元的赏金奖励。OpenSea 发言人证实了赏金的真实性并表示已经发布了针对漏洞的补丁。(The Block)[2022/9/28 22:37:27]

规则 2:#[account(seeds = <seeds>, bump)]这个约束中将检查给定帐户是否是当前执行程序派生的 PDA,PDA (Program Derived Address) 账号是一个没有私钥、由程序派生的账号,seed 和 bump 是生成种子,如果 bump 未提供,则 Anchor 框架默认使用 canonical bump,可以理解成自动赋予一个确定性的值。

以太坊开发者修复测试网上的EIP-1559相关漏洞:以太坊开发人员一直在努力解决测试网上的代码和客户端出现的问题,以为下一次网络重大升级——伦敦升级做好准备。7月21日,以太坊首席开发人员Tim Beiko发布了一份“伦敦测试网回顾”报告,详细介绍了即将到来的以太坊升级测试阶段的最新进展。

根据报告,OpenEthereum客户端在7月21日注意到他们的节点在Ropsten测试网上停止了运行。经查,问题不在该客户端,而是在go-ethereum协议和Geth客户端上,后者检查EIP-1559交易的发送方余额。据悉,当时一些客户端拒绝了该区块,而另一些客户端接受了该区块并继续处理:“具体而言,OpenEthereum和Besu拒绝了该笔交易/区块,而Nethermind、go-ethereum和Erigon接受了它们。”之后,通过向EIP-1559交易的有效性添加新的断言(assertions),这个问题得以修复,并且测试仍在继续。据悉,测试于6月24日在Ropsten测试网上率先激活;本月早些时候,Rinkeby测试网也启动了最后的测试阶段。(BeInCrypto)[2021/7/22 1:09:15]

使用 PDA,程序可以以编程方式对某些地址进行签名,而无需私钥。同时,PDA 确保没有外部用户也可以为同一地址生成有效签名。这些地址是跨程序调用的基础,它允许 Solana 应用程序相互组合。这里用的是 "deposits" 字符 + reserve 账号公钥 + depositor 账号公钥作为 seeds,bump 则是在用户调用时传入。

NEO系代币共49种,DBC声明未受漏洞影响:据NEO官网显示,目前基于NEO发行的NEP-5代币共有49种,其中包括ONT(本体)、DBC(神脑链)、GAS等市值排名前百币种。目前,神脑链官方已告知社区称,神脑链可支配代币总数仍为100亿个,此漏洞不会对DBC造成任何影响。[2018/5/19]

规则 3:#[account(token::mint = <target_account>, token::authority = <target_account>)]

这是一个 SPL 约束,用于更简便地验证 SPL 账号。这里指定 deposit_account 账号是一个 token 账号,它的 mint 权限是 deposit_note_mint 账号,authority 权限是 market_authority。

Account 的宏定义还有很多,这里略表不提,详细可以考虑文档:https://docs.rs/anchor-lang/latest/anchor_lang/derive.Accounts.html

有了这些前置知识,我们就可以直接来看漏洞代码:

programs/jet/src/instructions/withdraw_tokens.rs

正常情况下,用户调用函数 withdraw_tokens 提币时,会传入自己的 LP 账号,然后合约会销毁他的 LP 并返还相应数量的代币。但这里我们可以看到 deposit_note_account 账号是没有进行任何约束的,用户可以随意传入其他用户的 LP 账号。难道使用别人的 LP 账号不需要他们的签名授权吗?

通过前面分析宏定义代码,我们已经知道了 market_authority 账号拥有 LP 代币的操作权限,确实不需要用户自己的签名。那么 market_authority 又是一个怎么样的账号呢?我们可以看这里:

programs/jet/src/instructions/init_market.rs

这个 market_authority 也是一个 PDA 账号。也就是说合约通过自身的调用就可以销毁用户的 LP 代币。那么对于恶意用户来说,要发起攻击就很简单了,只要简单地把 deposit_note_account 账号设置为想要窃取的目标账号,withdraw_account 账号设置为自己的收款账号,就可以销毁他的 LP,并把他的存款本金提现到自己的账号上。

最后我们看一下官方的修复方法:

补丁中并未直接去约束 deposit_note_account 账号,而是去除了 burn 操作的 PDA 签名,并将 authority 权限改成了 depositor,这样的话用户将无法直接调用这里的函数进行提现,而是要通过另一个函数 withdraw() 去间接调用,而在 withdraw() 函数中账号宏定义已经进行了严密的校验,恶意用户如果传入的是他人的 LP 账号,将无法通过宏规则的验证,将无法通过宏规则的验证,因为 depositor 需要满足 signer 签名校验,无法伪造成他人的账号。

programs/jet/src/instructions/withdraw.rs

总结

本次漏洞的发现过程比较有戏剧性,漏洞的发现人 @charlieyouai 在他的个人推特上分享了漏洞发现的心路历程,当时他发现 burn 的权限是 market_authority,用户无法进行签名,认为这是一个 bug,会导致调用失败且用户无法提款,于是给官方提交了一个赏金漏洞,然后就去吃饭睡觉打豆豆了。

而后官方开发者意识到了问题的严重性,严格地说,他们知道这段代码没有无法提现的漏洞,而是人人都可以提现啊,老铁,一个能良好运行的 bug 你知道意味着什么吗?!所幸的是没有攻击事件发生。

目前在 Solana 上发生过多起黑客攻击事件均与账号校验问题有关,慢雾安全团队提醒广大 Solana 开发者,注意对账号体系进行严密的审查。

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

水星链

LTC浅谈DAO 估值框架_DAO:web3.0币龙头

苹果是世界上估值最高的公司,目前估值约为 2.83 万亿美元,我们都知道为什么它的估值如此之高--丰厚的现金流!所有公司都以利润/收入为核心动机,整个估值是根据收入潜力计算的.

[0:0ms0-1:647ms