在Sui上构建任何应用程序的一个关键部分是防止恶意攻击和威胁行为。对安全性的重视对于减少用户的资产损失,以及降低对开发者和企业的声誉损害至关重要。
Sui安全和密码学社区的成员总结了一些开发者在开发过程中应该注意避免的最佳实践。虽然其中一些经验是单独针对Sui的,但其他许多经验同样适用于所有区块链应用程序。
在开发网、测试网和主网上使用不同的地址
在开发网和测试网上存储的资产没有货币价值,并且这些网络可能会不时地被重置。而在主网上存储的资产具有真实的货币价值,不当的访问可能导致财务损失。建议在开发网/测试网和主网之间使用单独的凭据,以便只有具备合法和必要业务原因的人才能访问主网。在不同网络之间重复使用地址可能导致不必要的广泛访问,并增加错误操作的机率。
不要将硬编码的密钥和助记词存储在公共GitHub存储库中
账户密钥和助记词是控制访问链上资产的重要钱包凭据。尽管将这些凭据与其余应用程序代码一起存储在GitHub存储库中可能很便利,但如果该存储库是公共的,就会允许大家公开访问这些关键材料。GitHub还是一个修订控制的存储库。一旦添加了密钥或助记词,即使这些信息被移除,其他人仍然可以通过浏览存储库的历史记录来访问这些凭据。如果密钥材料是硬编码而不是由代码生成的,这将后患无穷。
在链上和链下的UI代码中添加断言条件
一般来说,可以通过CLI工具或机器人直接从UI之外访问公共链上智能合约功能。如果对于您的应用程序存在重要的限制条件,比如最小或最大转账金额,那么在前端代码和智能合约代码中都要添加对这些条件的检查,否则关键的检查可能会被绕过,从而导致漏洞。
对象ID不适合作为随机性或熵的来源
Sui对象ID是由验证节点在对象创建时分配的。一旦创建,对象ID作为全局唯一标识符会在对象的生命周期内保持不变。这种持久性使得对象ID不能成为随机性和熵的来源。错误地依赖对象ID用于依赖伪随机性或随机性(彩票、模拟、密码学)的应用程序可能会导致低级的漏洞。实际上,如果某些字段在对dryRun RPC进行重复调用时始终呈现相同的字节,则这些字段是不适合作为随机性的来源。Clock()也不是一个好的随机性来源,因为它可能会受到操纵。
确保限制应用程序的VRF或签名的访问
VRF(Verifiable Randomness Function,可验证随机性函数)经常用于确保随机化结果(例如,使用概率选择赢家的彩票函数,或者生成带有不同猜测概率的密码签名函数)。然而,如果VRF直接可以被他人访问,并且未在应用程序内部限制,那么参与者可能受到威胁,即可以在正常应用程序代码路径之外调用VRF。在彩票示例中,威胁参与者可以提前调用VRF以预测彩票的结果从而获得财务利益。在密码签名的情况下,获得签名任意输入的能力在安全上等同于签名密钥本身被泄露。
立即采取行动
这个简短的建议清单将使链上应用程序更强劲、更安全,最重要的是最终用户更加信任开发者。如果您有进一步的问题,并希望得到关于如何更好地保护您的Sui应用程序的帮助,请在开发者Office Hour内注册,进行更深入的技术咨询。
关于 Sui Network
Sui是基于第一原理重新设计和构建而成的L1公有链,旨在为创作者和开发者提供能够承载Web3中下一个十亿用户的开发平台。Sui上的应用基于Move智能合约语言,并具有水平可扩展性,让开发者能够快速且低成本支持广泛的应用开发。获取更多信息:https://linktr.ee/sui_apac
官网|Twitter|Discord|英文电报群|中文电报群