• 【技术分析】恶意 SPL 代币识别指南


    背景

    在 EVM 生态上,存在各式各样的 ERC20 代币,因其实现方式有着极高的自由度,也催生了花样繁多的恶意代币。这些恶意代币通常会在代码中实现一些恶意的逻辑(禁止用户卖出,特权铸造或销毁等),其目的就是骗取用户买入后把用户的钱卷走。

    诶!为了解决这个情况,Solana 官方提供了官方的代币模板。你要在 Solana 上发行货币,只需要填写一些基本信息,不需要编写代币逻辑,即可部署一个 SPL 代币。

    但是,即使是这种情况, Solana 链上还是存在许多恶意代币,各自用着不同的手法来坑骗代币持有者。所以本篇文章尝试着分析从哪些维度可以判断一个 SPL/SPL2022 代币是否存在安全隐患或恶意倾向。

    有关 SPL 和 SPL2022 的背景与定义,读者可阅读官方文档进行了解:https://spl.solana.com/token

    SPL 代币

    SPL 文档:https://spl.solana.com/token
    SPL 代码:https://github.com/solana-labs/solana-program-library/tree/master/token/program

    SPL 代币实现了 25 个指令,根据 instruction::TokenInstruction 将 SPL 代币的指令根据功能进行分类总结:

    1. 初始化代币铸造: InitializeMint, InitializeMint2 - 初始化新的代币铸造账户。
    2. 初始化代币账户: InitializeAccount, InitializeAccount2, InitializeAccount3 - 初始化新的代币持有账户。
    3. 初始化多重签名: InitializeMultisig, InitializeMultisig2 - 初始化多重签名账户。
    4. 转账: Transfer, TransferChecked - 在账户之间转移代币。
    5. 授权: Approve, ApproveChecked - 授权委托人使用一定数量的代币。
    6. 撤销授权: Revoke - 撤销对委托人的授权。
    7. 设置权限: SetAuthority - 更改铸造或账户的权限。
    8. 铸造代币: MintTo, MintToChecked - 铸造新代币到指定账户。
    9. 销毁代币: Burn, BurnChecked - 从账户中销毁代币。
    10. 关闭账户: CloseAccount - 关闭代币账户并转移剩余SOL。
    11. 冻结/解冻账户: FreezeAccount, ThawAccount - 冻结或解冻代币账户。
    12. 同步原生代币: SyncNative - 同步包装的SOL账户余额。
    13. 获取账户数据大小: GetAccountDataSize - 获取给定铸造的账户所需大小。
    14. 初始化不可变所有者: InitializeImmutableOwner - 为账户初始化不可变所有者扩展。
    15. 金额转换: AmountToUiAmount, UiAmountToAmount - 在原始金额和UI显示金额之间转换。

    当然这么多功能不需全部,我们只需要关注其中的一些有可能为作恶提供条件的功能。

    涉及到管理员权限的特殊函数

    1. InitializeMint

      InitializeMint {
          /// Number of base 10 digits to the right of the decimal place.
          decimals: u8,
          /// The authority/multisignature to mint tokens.
          mint_authority: Pubkey,
          /// The freeze authority/multisignature of the mint.
          freeze_authority: COption<Pubkey>,
      },
      

      参数解释:

      • decimals: 代币的小数位数。
      • mint_authority: 代币铸造权限的地址。
      • freeze_authority: 冻结代币账户的地址(可选)。
    2. SetAuthority

      SetAuthority {
          /// The type of authority to update.
          authority_type: AuthorityType,
          /// The new authority
          new_authority: COption<Pubkey>,
      },
      

      参数解释:

      • authority_type: 指定要更改的权限类型(有 MintTokens, FreezeAccount, AccountOwner, CloseAccount 四类)。
      • new_authority: 新的权限地址。如果设置为 None,则表示移除该权限。

    SPL 代币评价维度

    由于 SPL 代币为官方 Program 统一创建,所以在代码层面不作检查。

    1. 权限地址设置,参数设置
      1. freeze_authority 是否配置。如果配置冻结特权账号,则该账户可以对用户的代币进行冻结。
    2. 是否行使了特权账户的权力
      1. FreezeAccount :是否曾经对用户的代币账户进行冻结。

      2. SetAuthority :(MintTokens, FreezeAccount, AccountOwner, CloseAccount) 权限转移。

        1. Mint Program: MintTokens 权限转移, FreezeAccount 权限转移
        2. Token Account: AccountOwner 权限转移, CloseAccount 权限转移

        Account 初始化的 CloseAccount 权限账户为 None,需要账户 owner 先调用 SetAuthority 配置权限账户后再调用 CloseAccount 指令。

    SPL 2022 代币

    SPL 文档:https://spl.solana.com/token-2022/extensions
    SPL 代码:https://github.com/solana-labs/solana-program-library/tree/master/token/program-2022

    Token-2022 中的所有新指令都从 Token 的指令后面开始添加。 Token 有 25 条独特的指令,索引从 0 到 24。Token-2022 支持所有这些指令,然后在索引 25 处添加了新的功能。

    Mint 扩展目前包括:

    • confidential transfers 保密传输
    • transfer fees 转让费
    • closing mint 关闭铸币厂
    • interest-bearing tokens 生息代币
    • non-transferable tokens 不可转让代币
    • permanent delegate 永久委托
    • transfer hook 转账 Hook
    • metadata pointer 元数据指针
    • metadata 元数据

    Account 扩展目前包括:

    • memo required on incoming transfers 传入转账时需要备注
    • immutable ownership 不可变的所有权
    • default account state 默认帐户状态
    • CPI guard CPI 卫士

    SPL 2022 代币评价维度

    在 SPL 代币的基础上,添加以下评价维度

    1. 权限地址设置,参数设置

      1. Transfer Fees:Fee 的值是否在合理范围。

      2. Default Account State:初始化的 Account 是否默认冻结状态。如果初始化的 Account 处于冻结状态,则无法进行代币的转移(出售)。

      3. Immutable Owner:用户的 ATA 代币账户的 owner 不允许转移。

    2. 是否行使了特权账户的权力

      1. Interest-Bearing Tokens:是否为生息代币(createInterestBearingMint),是否调用(updateRateInterestBearingMint)修改过利息参数。

      2. Permanent Delegate:权限永久委托情况,被委托的账户拥有向任意账户铸造代币和销毁任意账户代币的权限。

      3. CPI Guard:代币是否采用了 CPI Guard 功能(createEnableCpiGuardInstruction)来防止非常规的调用,启用(enableCpiGuard),禁止(disableCpiGuard)

    3. 代码实现是否存在恶意逻辑

      1. Transfer Hook:重点关注 Hook program 的业务逻辑是否存在作恶的可能。Hook program 由管理员部署与指定,在进行代币转移时会调用 Hook program,执行额外的业务逻辑。

    案例分析

    SPL2022 恶意代币:https://solscan.io/token/Bz7vBYYuNuK8Y4KRTjaunFFAjzVbAiE1mFM9EGnZ8SHU

    从交易的行为来看,这个代币的作恶手段是在用户获得代币后,利用特权账户销毁用户的所有代币。

    这就涉及到了 SPL2022的“永久委托”功能,该功能允许委托人“mewfbQ”在任何账户中铸造或销毁代币。这是滥用特权的恶意行为。

    可以从浏览器的信息看到,Permanent Delegate 的账户设置为了 mewfbQ 地址,正是通过这个账户进行了恶意的操作。


    __EOF__

  • 本文作者: ACai's Blog
  • 本文链接: https://www.cnblogs.com/acaigarden/p/18457875
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    为什么要学习----------[澳大利亚]安德鲁·马修斯
    CSAPP 之 DataLab 详解
    车规级共模电感厂家教你贴片共模电感如何选型
    一文读懂PostgreSQL中的索引
    驱动通信:通过PIPE管道与内核层通信
    Flask笔记二之blueprint和session介绍
    【吴恩达机器学习笔记】十二、降维
    【Java】微服务——Gateway网关
    【子序列】522. 最长特殊序列 II
    【分布式任务调度】(二)XXL-JOB执行器配置及定时任务的创建
  • 原文地址:https://www.cnblogs.com/ACaiGarden/p/18457875