Skip to main content

🙅‍♂️ False Checklist

整理一些Solana审计中常见的"假性"漏洞,这些漏洞通常已经被 anchor / solana / rust 的特性所阻止利用,但是如果对底层实现不熟悉通常会在这些问题上花费大量时间,故整理成 checklist 以使大家更高效地入门。

最好对每一个"假性"漏洞解释为什么无法利用,最好能具体到源代码或者 PR。

  1. Anchor Account/AccountLoader owner & discriminator 检查:

    1. account 的 owner 必须是它所在的 crate的 ID(program id)

      1. use了其他 crate 的 account,检查的是其他 crate 的 ID
    2. anchor 定义的 #[account] 的类型不会被混淆,因为开头有8字节的 discriminator 校验

  2. Anchor Account try_deserialize 虽然不会检查 owner ,但是会检查开头8字节 的 discriminator:https://docs.rs/anchor-lang/latest/src/anchor_lang/lib.rs.html#262-264

  3. BorshDeserialize::try_from_slice 和 borsh TS sdk 的 deserialize 方法都会检查传入的数据长度和预期的类型完全一致,不能更短也不能更长。因为方法结尾会校验buf的游标已到结尾!v_mut.is_empty() https://docs.rs/borsh/latest/src/borsh/de/mod.rs.html#49-51

  4. 当前版本的 solana CU Limit 和 CU price 的设置可以在tx ix list的任何位置(非CPI),对整个TX 有效。