文章深入探讨了如何有效利用ChatGPT作为安全审计工具,提供了多种实践提示和示例,包括如何查找合约中的漏洞、简化代码、检查不变式以及生成有针对性的问题。文章强调了GPT在安全审计中的应用潜力,同时也提醒审计人员注意其局限性,例如输入大小的限制和可能存在的误报。
作者:Konstantin Nekrasov, MixBytes 的安全研究员
ChatGPT 在编程和研究领域带来了重大变革。本文将深入探讨各种提示,这些提示对安全审计员将极为有益。
为了确保在审计时 OpenAI 不会将你的对话用于模型训练,请记得禁用复选框:
正如你可能预料到的,GPT 在输入大小方面有其限制:
我们还遇到了一个意外的 GPT-4 错误,它在没有任何错误提示的情况下,静默忽略了输入的下半部分。
例如,当我们将一个大合约输入 GPT-3.5,并要求它忽略上面的所有内容,只回答 “1+1=?”,它巧妙地提供了正确的答案:
然而,GPT-4 则简单地总结了输入的上半部分,完全忽略了问题:
这可能导致一个消极的情况,GPT-4 看似提供了分析,但实际上切断了你的请求,错过了底部的重要信息。要小心!
使用 ChatGPT 的最明显方法是要求 ChatGPT 在代码中发现漏洞。
让我们尝试对一个小的质押合约进行此操作 [→ 查看代码]。
该合约有几个我们希望通过 GPT 确定的问题:
我们使用了以下提示:“查找漏洞” → “更多” → “更多”:
结果:
版本 | 漏洞 #1 | 漏洞 #2 | 漏洞 #3 | 虚警 |
---|---|---|---|---|
GPT-3.5 | - | - | - | 18 |
GPT-4 | FOUND | - | FOUND | 20 |
版本;漏洞 #1;漏洞 #2;漏洞 #3;虚警
GPT-3.5;-;-;-;18
GPT-4;FOUND;-;FOUND;20
GPT-3.5 和 GPT-4 都提出了几个虚警,其中 GPT-3.5 的表现最差。然而,GPT-4 令人印象深刻地识别出了三种漏洞中的两种!做得好!
总之,GPT 可以有效地用于小型、独立合约或功能的扫描,从而提高审计的质量。然而,要做好面对大量虚警的准备,也不要期望它发现所有漏洞。
请记住,将此方法应用于大型合约会面临挑战:
在审计的初始阶段,你的主要任务是高层次地理解协议的内部运作。在 GPT 的帮助下,你拥有强大的工具,可以简化复杂代码,阐明变量名称,去除不必要的注释或事件,通过替换某些参数来减少代码量。所有这些加快了你对协议的沉浸过程。
让我们通过一个实际例子来开始——简化来自 crvUSD 的 liquidate_extended() 和 _liquidate() 函数 [→查看代码]。
将这些函数的代码输入到 GPT-4 中,逐条使用提示,并观察结果:
1. 将 _liquidate() 合并到 liquidate_extended() 中
2. 简化代码,知道参数 `user` 始终等于 `msg.sender`
3. 简化代码,知道参数 `use_eth` 始终等于 `true`
4. 简化代码,知道参数 `frac` 始终等于 `10**18`
5. 简化代码,知道参数 `min_x` 始终等于 `0`
6. 去除类型
7. 将 `xy = ...` 替换为 `stablecoin_amount, collateral_amount = ...`
8. 简化代码,添加 `require(debt > stablecoin_amount)`
9. 简化代码,知道 `callbacker` 始终为 `empty(address)`
10. 将 unsafe_ 替换为相应的数学运算
最终我们得到的结果是:
def liquidate_extended():
"""
如果健康状况不好,执行一次坏的自清算
"""
debt, rate_mul = self._debt(msg.sender)
stablecoin_amount, collateral_amount = AMM.withdraw(msg.sender, self._get_f_remove(10**18, 0))
require(debt > stablecoin_amount)
STABLECOIN.transferFrom(AMM.address, self, stablecoin_amount)
to_repay = debt - stablecoin_amount
self._withdraw_collateral(msg.sender, collateral_amount)
STABLECOIN.transferFrom(msg.sender, self, to_repay)
self.redeemed += debt
self.loan[msg.sender] = Loan({initial_debt: 0, rate_mul: rate_mul})
self._remove_from_list(msg.sender)
d = self._total_debt.initial_debt * rate_mul / self._total_debt.rate_mul
self._total_debt.initial_debt = max(d, debt) - debt
self._total_debt.rate_mul = rate_mul
结果显示,代码已被改造,现在比其 原始版本 明显更易于理解。
现在我们可以向上滚动与 GPT-4 的对话,并调整某些提示。例如,我们可以让它简化 callbacker==msg.sender 的代码,以查看该函数的不同代码流。
这些简化在审计的初始阶段尤其有益,特别是当你需要快速理解协议的高层次运作时。
重要说明:
利用 GPT 解锁不变量的秘密,特别是在面对复杂任务时,如穿越广泛的函数和揭示具有重要意义的代码路径。
让我们以 Ethos(LUSD 的克隆)中的 adjustTrove() 和 _adjustTrove() 函数为例 [→查看代码]。
假设我们寻求揭示费用无法被调用者抓住的场景。我们使用的提示是:
GPT-4 准确地建议费用仅在特定条件下征收: _isDebtIncrease=true && isRecoveryMode=false。
太好了!
凭借自动识别具有特定后果的逻辑路径的能力,你可以快速而轻松地检查不同漏洞的怀疑。
审计员的能力随着他们提出并回答每个挑战性问题而提升,因为这丰富了审计质量的锦缕。为什么不利用 GPT 的智慧为我们生成问题呢?我们不希望平凡的检查清单;我们渴望相关的、易于验证的敏锐询问。
请看我们 conjured 的魔法模板:
想象你是一名安全研究员,你正在审计 [描述项目]。 [描述技术细节]。为了找到项目中的漏洞,你必须阅读这些函数,并提出关于它们的三个最重要的边缘案例问题。这将帮助你识别错误或漏洞。那三个问题是什么?请提出非常具体的问题,并提供你想要检查的可疑参数和代码路径。
但请注意微妙的平衡!GPT 响应的质量取决于提示。
以 crvUSD 的某些代码为例。首先,我们将其多个函数 [ 1, 2] 合并为一个 [→查看代码]。然后提出建议:
为了评估生成质量,我们将结果问题分为三个类别:
通过合并几个函数,我们让 GPT-4 生成了 15 个问题,得到的结果如下:
生成问题 | 数量 |
---|---|
无意义 | 1 |
懒惰 | 1 |
含糊 | 0 |
好的具体问题 | 13 |
生成问题;数量
无意义;1
懒惰;1
含糊;0
好的具体问题;13
好结果!
我们揭示了一些可以加速你对协议理解和提升审计质量的技巧。AI 的领域是一个蓬勃发展的景观,不要惧怕,因为掌握这一惊人工具将引领你迈向非凡的成就。因此,抓住 GPT 的力量,我们将共同踏上无尽的探索之旅!
MixBytes 是一个由专家区块链审计员和安全研究员组成的团队,专注于为 EVM 兼容和 Substrate 基础的项目提供全面的智能合约审计和技术咨询服务。加入我们,关注 X,以随时了解最新的行业趋势和见解。
- 原文链接: mixbytes.io/blog/chatgpt...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!