ForesightNews文章 2024年09月12日
慢雾:Toncoin 智能合约安全最佳实践
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

慢雾安全团队发布了「Toncoin智能合约安全最佳实践」,旨在帮助开发者更好地理解Toncoin智能合约的安全风险,并提供实用的解决方案,以降低潜在的安全威胁。该最佳实践整合了TON社区分享的安全开发实践,并结合慢雾安全团队多年积累的安全审计经验。

👨‍💻 **缺少impure修饰符:** 当用户发送“check”请求时,Vault没有退回处理程序或代理消息至数据库,导致数据库尝试解析“msg_addr_none”,但解析失败,消息从数据库退回到Vault,且操作不是“op_not_winner”。攻击场景:Vault在数据库消息处理器中包含以下代码: if (msg.value > 0) { // ... if (msg.value > 0) { // ... if (msg.value > 0) { // ... if (msg.value > 0) { // ... // 执行一些操作 } } } } 建议:检查代码中是否有缺少`impure`修饰符的情况,并确保代码逻辑清晰,避免错误的代码逻辑导致安全漏洞。

🔐 **错误使用修改/非修改方法:** Func变量和函数可能包含几乎任何合法字符,例如“var++”、“~bits”、“foo-bar+baz”及逗号“,”都是有效的变量和函数名称。攻击场景:攻击者可能会利用这些特点进行代码混淆,导致代码难以理解和维护。 建议:编写和检查Func代码时,应该使用Linter工具,并确保代码逻辑清晰,避免错误的代码逻辑导致安全漏洞。

⚠️ **错误使用有符号/无符号整数:** 读取意外变量的值,并在不应有此类方法的数据类型上调用方法(或者其返回值未正确存储)是错误的,不会作为“警告”或“通知”被跳过,而是导致无法取到代码。攻击场景:请记住,存储意外值可能是可以的,但是读取它可能会导致问题。例如,对于整数变量,错误代码5(整数超出预期范围)可能被抛出。 建议:密切跟踪代码的操作和它可能的返回值。请记住,编译器仅关心代码及其初始状态。

🔑 **合约代码可以更新:** TON完全实现了Actor模型,这意味着合约的代码可以更改。代码可以通过“SETCODE”TVM指令永久更改,或者在运行时设置TVM代码寄存器为新的单元值,直到执行结束。攻击场景:不道德的开发者可能会恶意更新代码以窃取资金。 建议:注意合约代码是可以更新的,确保任何更新都遵循安全实践,并使用例如治理模型或多签名批准等机制进行更改。

🛡️ **交易和阶段:** 计算阶段执行智能合约代码,然后执行操作(如发送消息、修改代码、更改库等)。与基于以太坊的区块链不同,如果你预计发送的消息会失败,你将看不到计算阶段的退出代码,因为消息并不是在计算阶段执行的,而是在稍后的操作阶段执行。攻击场景:在操作阶段消息失败时产生意外行为,导致对交易状态的错误假设。 建议:了解每个交易最多包含五个阶段:存储阶段、信用阶段、计算阶段、操作阶段和反弹阶段。

🚀 **使用可反弹消息:** 可反弹消息可以帮助开发者在消息失败时进行重试,提高合约的可靠性。 建议:在必要的情况下,使用可反弹消息,并确保代码逻辑正确,避免消息重试导致的错误。

🚨 **小心退还多余的燃料费:** 如果合约退还了多余的燃料费,可能会导致攻击者利用这个漏洞进行攻击。 建议:确保合约退还的燃料费是合理的,避免退还多余的燃料费。

🕵️ **检查函数返回值:** 确保正确检查函数返回值,避免错误的返回值导致代码逻辑错误。 建议:在调用函数后,务必检查函数返回值,并根据返回值进行相应的处理。

🚫 **检查假冒的Jetton代币:** Jetton代币是一种基于TON的代币,开发者需要确保代码能够识别和处理假冒的Jetton代币,避免攻击者利用假冒的Jetton代币进行攻击。 建议:使用安全的Jetton代币库,并确保代码能够正确识别和处理假冒的Jetton代币。

💎 **使用携带值模式:** 携带值模式可以帮助开发者在发送消息时携带一些额外的信息,例如交易ID、签名等,提高消息的安全性。 建议:在必要的情况下,使用携带值模式,并确保代码逻辑正确,避免消息携带值导致的错误。

🤝 **避免执行第三方代码:** 避免执行来自第三方合约的代码,因为第三方代码可能会包含恶意代码,导致安全漏洞。 建议:只执行来自可信来源的代码,并确保代码逻辑清晰,避免错误的代码逻辑导致安全漏洞。

🤝 **消息的竞态条件:** 在处理多个消息时,需要确保代码能够正确处理消息的竞态条件,避免多个消息同时处理导致的错误。 建议:使用锁机制或其他方法来确保代码能够正确处理消息的竞态条件。

🤝 **名称冲突:** Func变量和函数可能包含几乎任何合法字符,例如“var++”、“~bits”、“foo-bar+baz”及逗号“,”都是有效的变量和函数名称。攻击场景:攻击者可能会利用这些特点进行代码混淆,导致代码难以理解和维护。 建议:编写和检查Func代码时,应该使用Linter工具,并确保代码逻辑清晰,避免错误的代码逻辑导致安全漏洞。

🤝 **检查throw的值:** 确保正确检查throw的值,避免错误的throw值导致代码逻辑错误。 建议:在使用throw语句时,务必检查throw的值,并根据throw值进行相应的处理。

🤝 **读/写正确类型数据:** 读取意外变量的值,并在不应有此类方法的数据类型上调用方法(或者其返回值未正确存储)是错误的,不会作为“警告”或“通知”被跳过,而是导致无法取到代码。攻击场景:请记住,存储意外值可能是可以的,但是读取它可能会导致问题。例如,对于整数变量,错误代码5(整数超出预期范围)可能被抛出。 建议:密切跟踪代码的操作和它可能的返回值。请记住,编译器仅关心代码及其初始状态。

🤝 **两个预定义的method_id:** TON中有两个预定义的method_id,分别为0和1,开发者需要避免使用这两个method_id,因为它们可能会导致安全漏洞。 建议:使用其他method_id,避免使用这两个预定义的method_id。

🤝 **不能从其他合约中拉取数据:** TON合约不能从其他合约中拉取数据,开发者需要确保代码逻辑正确,避免尝试从其他合约中拉取数据。 建议:使用其他方法来获取数据,避免尝试从其他合约中拉取数据。

🤝 **重放保护:** 开发者需要确保代码能够识别和处理重放攻击,避免攻击者重复发送相同的交易来攻击合约。 建议:使用随机数或其他方法来实现重放保护。

🤝 **在链上发送私人数据:** 开发者需要避免在链上发送私人数据,因为链上的数据是公开的,任何人都可以查看。 建议:使用加密或其他方法来保护私人数据。

🤝 **漏掉对退回消息的检查:** 开发者需要确保代码能够正确处理退回消息,避免退回消息导致的错误。 建议:使用try-catch语句或其他方法来处理退回消息。

🤝 **在竞争条件下销毁账户的风险:** 开发者需要确保代码能够正确处理竞争条件,避免在竞争条件下销毁账户。 建议:使用锁机制或其他方法来确保代码能够正确处理竞争条件。

🤝 **使用可反弹消息:** 可反弹消息可以帮助开发者在消息失败时进行重试,提高合约的可靠性。 建议:在必要的情况下,使用可反弹消息,并确保代码逻辑正确,避免消息重试导致的错误。

TON(The Open Network) 是一个由 Telegram 团队最初设计和开发的去中心化区块链平台,一经上线就获得了关注。TON 的目标是提供一个高性能和可扩展的区块链平台,以支持大规模的去中心化应用 (DApps) 和智能合约,关于 TON 的基础知识可查阅初识 TON:账号、Token、交易与资产安全。值得注意的是,TON 与其他区块链有着截然不同的架构,TON 的智能合约除了主要使用 FunC 语言来编程,也有使用更高级的 Tact,或者更底层的 Fift。这些都是原创程度很高的语言,因此,确保智能合约的安全性很关键。慢雾安全团队整合吸收了 TON 社区分享的安全开发实践,并结合自身多年积累的安全审计经验,发布「Toncoin 智能合约安全最佳实践」,旨在帮助开发者更好地理解 Toncoin 智能合约的安全风险,并提供实用的解决方案,以降低潜在的安全威胁。由于篇幅限制,本文仅罗列「Toncoin 智能合约安全最佳实践」的部分内容,欢迎大家在 GitHub 上 Watch、Fork 及 Star:https://github.com/slowmist/Toncoin-Smart-Contract-Security-Best-Practices。Toncoin 智能合约常见陷阱1. 缺少 impure 修饰符2. 错误使用修改 / 非修改方法3. 错误使用有符号 / 无符号整数4. 不安全的随机数5. 在链上发送私人数据6. 漏掉对退回消息的检查严重性:高描述:用户发送 "check" 请求时,Vault 没有退回处理程序或代理消息至数据库。我们可以在数据库中将 "msg_addr_none" 设置为奖励地址,因为 "load_msg_address" 允许这样做。我们请求 Vault 检查,数据库尝试使用 "parse_std_addr" 解析 "msg_addr_none",但解析失败。消息从数据库退回到 Vault,且操作不是 "op_not_winner"。攻击场景:Vault 在数据库消息处理器中包含以下代码:7. 在竞争条件下销毁账户的风险8. 避免执行第三方代码9. 名称冲突严重性:中描述:Func 变量和函数可能包含几乎任何合法字符。攻击场景:"var++"、"~bits"、"foo-bar+baz" 及逗号 "," 都是有效的变量和函数名称。建议:编写和检查 Func 代码时,应该使用 Linter 工具。10. 检查 throw 的值11. 读 / 写正确类型数据严重性:中描述:读取意外变量的值,并在不应有此类方法的数据类型上调用方法(或者其返回值未正确存储)是错误的,不会作为“警告”或“通知”被跳过,而是导致无法取到代码。攻击场景:请记住,存储意外值可能是可以的,但是读取它可能会导致问题。例如,对于整数变量,错误代码 5(整数超出预期范围)可能被抛出。建议:密切跟踪代码的操作和它可能的返回值。请记住,编译器仅关心代码及其初始状态。12. 合约代码可以更新严重性:中描述:TON 完全实现了 Actor 模型,这意味着合约的代码可以更改。代码可以通过 "SETCODE" TVM 指令永久更改,或者在运行时设置 TVM 代码寄存器为新的单元值,直到执行结束。攻击场景:不道德的开发者可能会恶意更新代码以窃取资金。建议:注意合约代码是可以更新的,确保任何更新都遵循安全实践,并使用例如治理模型或多签名批准等机制进行更改。13. 交易和阶段严重性:中描述:计算阶段执行智能合约代码,然后执行操作(如发送消息、修改代码、更改库等)。与基于以太坊的区块链不同,如果你预计发送的消息会失败,你将看不到计算阶段的退出代码,因为消息并不是在计算阶段执行的,而是在稍后的操作阶段执行。攻击场景:在操作阶段消息失败时产生意外行为,导致对交易状态的错误假设。建议:了解每个交易最多包含五个阶段:存储阶段、信用阶段、计算阶段、操作阶段和反弹阶段。14. 不能从其他合约中拉取数据15. 两个预定义的 method_id16. 使用可反弹消息17. 重放保护18. 消息的竞态条件19. 使用携带值模式20. 小心退还多余的燃料费21. 检查函数返回值22. 检查假冒的 Jetton 代币写在最后对开发者而言,遵循这些最佳实践,可以有效提升智能合约的安全性,减少潜在的安全风险。在区块链技术日新月异的今天,安全永远是重中之重。希望这一最佳实践可以帮助更多的开发者打造安全可靠的智能合约,推动区块链技术的健康发展。参考链接:[1] https://dev.to/dvlkv/drawing-conclusions-from-ton-hack-challenge-1aep[2] https://docs.ton.org/develop/smart-contracts/security/ton-hack-challenge-1[3] https://docs.ton.org/learn/tvm-instructions/tvm-overview[4] https://docs.ton.org/develop/smart-contracts/messages[5] https://docs.ton.org/develop/smart-contracts/security/secure-programming[6] https://docs.ton.org/develop/smart-contracts/security/things-to-focus作者 | Johan编辑 | Lisa排版 | Liz慢雾导航慢雾科技官网https://www.slowmist.com/慢雾区官网https://slowmist.io/慢雾 GitHubhttps://github.com/slowmistTelegramhttps://t.me/slowmistteamTwitterhttps://twitter.com/@slowmist_teamMediumhttps://medium.com/@slowmist知识星球https://t.zsxq.com/Q3zNvvF

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

Toncoin 智能合约 安全最佳实践 慢雾安全 区块链安全
相关文章