用于安全审计的ChatGPT

  • mixbytes
  • 发布于 2024-02-25 16:33
  • 阅读 27

文章深入探讨了如何有效利用ChatGPT作为安全审计工具,提供了多种实践提示和示例,包括如何查找合约中的漏洞、简化代码、检查不变式以及生成有针对性的问题。文章强调了GPT在安全审计中的应用潜力,同时也提醒审计人员注意其局限性,例如输入大小的限制和可能存在的误报。

作者:Konstantin Nekrasov, MixBytes 的安全研究员

引言

ChatGPT 在编程和研究领域带来了重大变革。本文将深入探讨各种提示,这些提示对安全审计员将极为有益。

开始之前

为了确保在审计时 OpenAI 不会将你的对话用于模型训练,请记得禁用复选框:

警惕输入大小问题

正如你可能预料到的,GPT 在输入大小方面有其限制:

我们还遇到了一个意外的 GPT-4 错误,它在没有任何错误提示的情况下,静默忽略了输入的下半部分。

例如,当我们将一个大合约输入 GPT-3.5,并要求它忽略上面的所有内容,只回答 “1+1=?”,它巧妙地提供了正确的答案:

然而,GPT-4 则简单地总结了输入的上半部分,完全忽略了问题:

这可能导致一个消极的情况,GPT-4 看似提供了分析,但实际上切断了你的请求,错过了底部的重要信息。要小心!

1. “查找漏洞!”

使用 ChatGPT 的最明显方法是要求 ChatGPT 在代码中发现漏洞。

让我们尝试对一个小的质押合约进行此操作 [→ 查看代码]

该合约有几个我们希望通过 GPT 确定的问题:

  1. 在处理大金额质押时,unstake() 存在 DOS 漏洞。
  2. 在 unstake() 中,_reward 和 _amount 之间存在混淆。
  3. 调用 stake() 两次会覆盖用户之前的质押。

我们使用了以下提示:“查找漏洞” → “更多” → “更多”:

结果:

版本 漏洞 #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 无法处理大型输入,需要将合约分为几部分。但要小心,因为当你发送部分内容时,GPT 开始忘记对话开始时的各种细节,从而影响结果。
  • 此外,如果你正在审计的合约涉及外部集成或继承自其他合约,请确保向 GPT 提供这些依赖项的文档。如果没有理解上下文,GPT 可能会产生劣质的 结果。因此,请小心行事!

2. “简化代码…”

在审计的初始阶段,你的主要任务是高层次地理解协议的内部运作。在 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-4 表现出色!
  • GPT-3.5 失败并产生了错误代码。
  • GPT-4 也会失败,当我们让它一次性处理所有请求,而不是进行 10 次连续请求时。

3. 检查不变量

利用 GPT 解锁不变量的秘密,特别是在面对复杂任务时,如穿越广泛的函数和揭示具有重要意义的代码路径。

让我们以 Ethos(LUSD 的克隆)中的 adjustTrove() 和 _adjustTrove() 函数为例 [→查看代码]

假设我们寻求揭示费用无法被调用者抓住的场景。我们使用的提示是:

GPT-4 准确地建议费用仅在特定条件下征收: _isDebtIncrease=true && isRecoveryMode=false。

太好了!

凭借自动识别具有特定后果的逻辑路径的能力,你可以快速而轻松地检查不同漏洞的怀疑。

4. 问题挖掘

审计员的能力随着他们提出并回答每个挑战性问题而提升,因为这丰富了审计质量的锦缕。为什么不利用 GPT 的智慧为我们生成问题呢?我们不希望平凡的检查清单;我们渴望相关的、易于验证的敏锐询问。

请看我们 conjured 的魔法模板:

想象你是一名安全研究员,你正在审计 [描述项目]。 [描述技术细节]。为了找到项目中的漏洞,你必须阅读这些函数,并提出关于它们的三个最重要的边缘案例问题。这将帮助你识别错误或漏洞。那三个问题是什么?请提出非常具体的问题,并提供你想要检查的可疑参数和代码路径。

但请注意微妙的平衡!GPT 响应的质量取决于提示。

crvUSD 的某些代码为例。首先,我们将其多个函数 [ 1, 2] 合并为一个 [→查看代码]。然后提出建议:

为了评估生成质量,我们将结果问题分为三个类别:

  1. 无意义。例如,当 GPT 建议检查 uint256 的负值时。
  2. 懒惰。例如,当它问如果你传入 collateral==0 会发生什么,尽管代码中已经有检查 assert collateral * X / Y > 100,禁止零值。
  3. 含糊。例如,当它建议检查代码中的所有不安全数学运算。这是静态检查清单的典型问题,我们不需要这一点。
  4. 好的具体问题。例如,当 GPT 表示 create_loan() 可以接受一个值与 msg.value 不匹配的抵押品值,并且对此有一个未知的部分代码调用,_deposit_collateral(collateral, msg.value)。GPT 问道:这个未知函数是否正确处理这两个值可能不匹配?

通过合并几个函数,我们让 GPT-4 生成了 15 个问题,得到的结果如下:

生成问题 数量
无意义 1
懒惰 1
含糊 0
好的具体问题 13

生成问题;数量

无意义;1
懒惰;1
含糊;0
好的具体问题;13

好结果!

结论

我们揭示了一些可以加速你对协议理解和提升审计质量的技巧。AI 的领域是一个蓬勃发展的景观,不要惧怕,因为掌握这一惊人工具将引领你迈向非凡的成就。因此,抓住 GPT 的力量,我们将共同踏上无尽的探索之旅!

  • MixBytes 是谁?

MixBytes 是一个由专家区块链审计员和安全研究员组成的团队,专注于为 EVM 兼容和 Substrate 基础的项目提供全面的智能合约审计和技术咨询服务。加入我们,关注 X,以随时了解最新的行业趋势和见解。

  • 原文链接: mixbytes.io/blog/chatgpt...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
mixbytes
mixbytes
Empowering Web3 businesses to build hack-resistant projects.