{"content":{"title":"用于安全审计的ChatGPT","body":"作者：**Konstantin Nekrasov**， MixBytes 的安全研究员\r\n\r\n![](https://img.learnblockchain.cn/2025/03/09/46.jpg)\r\n\r\n## 引言\r\n\r\n![](https://img.learnblockchain.cn/2025/03/09/FBTn5C5.gif)\r\n\r\n[ChatGPT](https://chat.openai.com/) 在编程和研究领域带来了重大变革。本文将深入探讨各种提示，这些提示对安全审计员将极为有益。\r\n\r\n## 开始之前\r\n\r\n为了确保在审计时 OpenAI 不会将你的对话用于模型训练，请记得禁用复选框：\r\n\r\n![](https://img.learnblockchain.cn/2025/03/09/eb0a444b92.jpg)\r\n\r\n## 警惕输入大小问题\r\n\r\n正如你可能预料到的，GPT 在输入大小方面有其限制：\r\n\r\n![](https://img.learnblockchain.cn/2025/03/09/b965d6ede7.jpg)\r\n\r\n我们还遇到了一个意外的 GPT-4 错误，它在没有任何错误提示的情况下，静默忽略了输入的下半部分。\r\n\r\n例如，当我们将一个大合约输入 GPT-3.5，并要求它忽略上面的所有内容，只回答 “1+1=?”，它巧妙地提供了正确的答案：\r\n\r\n![](https://img.learnblockchain.cn/2025/03/09/upload_1733ddbcee9cb.png)\r\n\r\n然而，GPT-4 则简单地总结了输入的上半部分，完全忽略了问题：\r\n\r\n![](https://img.learnblockchain.cn/2025/03/09/upload_1733ddbcee9cb.png)\r\n\r\n这可能导致一个消极的情况，GPT-4 看似提供了分析，但实际上切断了你的请求，错过了底部的重要信息。要小心！\r\n\r\n## 1\\. “查找漏洞！”\r\n\r\n使用 ChatGPT 的最明显方法是要求 ChatGPT 在代码中发现漏洞。\r\n\r\n让我们尝试对一个小的质押合约进行此操作 [\\[→ 查看代码\\]](https://gist.github.com/knek-little-projects/51e59a52f15e21cf83893c03f58c27b4)。\r\n\r\n该合约有几个我们希望通过 GPT 确定的问题：\r\n\r\n1. 在处理大金额质押时，unstake() 存在 DOS 漏洞。\r\n2. 在 unstake() 中，\\_reward 和 \\_amount 之间存在混淆。\r\n3. 调用 stake() 两次会覆盖用户之前的质押。\r\n\r\n我们使用了以下提示：“查找漏洞” → “更多” → “更多”：\r\n\r\n![](https://img.learnblockchain.cn/2025/03/09/upload_1733ddbcee9cb.png)\r\n\r\n结果：\r\n\r\n| 版本 | 漏洞 #1 | 漏洞 #2 | 漏洞 #3 | 虚警 |\r\n| --- | --- | --- | --- | --- |\r\n| GPT-3.5 | - | - | - | 18 |\r\n| GPT-4 | FOUND | - | FOUND | 20 |\r\n\r\n版本;漏洞 #1;漏洞 #2;漏洞 #3;虚警\r\n\r\nGPT-3.5;-;-;-;18  \r\nGPT-4;FOUND;-;FOUND;20\r\n\r\nGPT-3.5 和 GPT-4 都提出了几个虚警，其中 GPT-3.5 的表现最差。然而，GPT-4 令人印象深刻地识别出了三种漏洞中的两种！做得好！\r\n\r\n总之，GPT 可以有效地用于小型、独立合约或功能的扫描，从而提高审计的质量。然而，要做好面对大量虚警的准备，也不要期望它发现所有漏洞。\r\n\r\n请记住，将此方法应用于大型合约会面临挑战：\r\n\r\n- GPT 无法处理大型输入，需要将合约分为几部分。但要小心，因为当你发送部分内容时，GPT 开始忘记对话开始时的各种细节，从而影响结果。\r\n- 此外，如果你正在审计的合约涉及外部集成或继承自其他合约，请确保向 GPT 提供这些依赖项的文档。如果没有理解上下文，GPT 可能会产生劣质的 [结果](http://results.so/)。因此，请小心行事！\r\n\r\n## 2\\. “简化代码…”\r\n\r\n在审计的初始阶段，你的主要任务是高层次地理解协议的内部运作。在 GPT 的帮助下，你拥有强大的工具，可以简化复杂代码，阐明变量名称，去除不必要的注释或事件，通过替换某些参数来减少代码量。所有这些加快了你对协议的沉浸过程。\r\n\r\n让我们通过一个实际例子来开始——简化来自 crvUSD 的 liquidate\\_extended() 和 \\_liquidate() 函数 [\\[→查看代码\\]](https://github.com/curvefi/curve-stablecoin/blob/64dc13db563ec6067c75c662ee71a285442ef638/contracts/Controller.vy#L994-L1106)。\r\n\r\n将这些函数的代码输入到 GPT-4 中，逐条使用提示，并观察结果：\r\n\r\n```sql\r\n1. 将 _liquidate() 合并到 liquidate_extended() 中\r\n2. 简化代码，知道参数 `user` 始终等于 `msg.sender`\r\n3. 简化代码，知道参数 `use_eth` 始终等于 `true`\r\n4. 简化代码，知道参数 `frac` 始终等于 `10**18`\r\n5. 简化代码，知道参数 `min_x` 始终等于 `0`\r\n6. 去除类型\r\n7. 将 `xy = ...` 替换为 `stablecoin_amount, collateral_amount = ...`\r\n8. 简化代码，添加 `require(debt > stablecoin_amount)`\r\n9. 简化代码，知道 `callbacker` 始终为 `empty(address)`\r\n10. 将 unsafe_ 替换为相应的数学运算\r\n```\r\n\r\n最终我们得到的结果是：\r\n\r\n```python\r\ndef liquidate_extended():\r\n    \"\"\"\r\n    如果健康状况不好，执行一次坏的自清算\r\n    \"\"\"\r\n    debt, rate_mul = self._debt(msg.sender)\r\n\r\n    stablecoin_amount, collateral_amount = AMM.withdraw(msg.sender, self._get_f_remove(10**18, 0))\r\n\r\n    require(debt > stablecoin_amount)\r\n    STABLECOIN.transferFrom(AMM.address, self, stablecoin_amount)\r\n\r\n    to_repay = debt - stablecoin_amount\r\n\r\n    self._withdraw_collateral(msg.sender, collateral_amount)\r\n    STABLECOIN.transferFrom(msg.sender, self, to_repay)\r\n\r\n    self.redeemed += debt\r\n    self.loan[msg.sender] = Loan({initial_debt: 0, rate_mul: rate_mul})\r\n    self._remove_from_list(msg.sender)\r\n\r\n    d = self._total_debt.initial_debt * rate_mul / self._total_debt.rate_mul\r\n    self._total_debt.initial_debt = max(d, debt) - debt\r\n    self._total_debt.rate_mul = rate_mul\r\n```\r\n\r\n结果显示，代码已被改造，现在比其 [原始版本](https://github.com/curvefi/curve-stablecoin/blob/64dc13db563ec6067c75c662ee71a285442ef638/contracts/Controller.vy#L994-L1106) 明显更易于理解。\r\n\r\n现在我们可以向上滚动与 GPT-4 的对话，并调整某些提示。例如，我们可以让它简化 callbacker==msg.sender 的代码，以查看该函数的不同代码流。\r\n\r\n这些简化在审计的初始阶段尤其有益，特别是当你需要快速理解协议的高层次运作时。\r\n\r\n重要说明：\r\n\r\n- GPT-4 表现出色！\r\n- GPT-3.5 失败并产生了错误代码。\r\n- GPT-4 也会失败，当我们让它一次性处理所有请求，而不是进行 10 次连续请求时。\r\n\r\n## 3\\. 检查不变量\r\n\r\n利用 GPT 解锁不变量的秘密，特别是在面对复杂任务时，如穿越广泛的函数和揭示具有重要意义的代码路径。\r\n\r\n让我们以 Ethos（LUSD 的克隆）中的 adjustTrove() 和 \\_adjustTrove() 函数为例 [\\[→查看代码\\]](https://github.com/code-423n4/2023-02-ethos/blob/73687f32b934c9d697b97745356cdf8a1f264955/Ethos-Core/contracts/BorrowerOperations.sol#L268-L373)。\r\n\r\n假设我们寻求揭示费用无法被调用者抓住的场景。我们使用的提示是：\r\n\r\n![](https://img.learnblockchain.cn/2025/03/09/upload_1733ddbcee9cb.png)\r\n\r\nGPT-4 准确地建议费用仅在特定条件下征收： \\_isDebtIncrease=true && isRecoveryMode=false。\r\n\r\n太好了！\r\n\r\n凭借自动识别具有特定后果的逻辑路径的能力，你可以快速而轻松地检查不同漏洞的怀疑。\r\n\r\n## 4\\. 问题挖掘\r\n\r\n审计员的能力随着他们提出并回答每个挑战性问题而提升，因为这丰富了审计质量的锦缕。为什么不利用 GPT 的智慧为我们生成问题呢？我们不希望平凡的检查清单；我们渴望相关的、易于验证的敏锐询问。\r\n\r\n请看我们 conjured 的魔法模板：\r\n\r\n```sql\r\n想象你是一名安全研究员，你正在审计 [描述项目]。 [描述技术细节]。为了找到项目中的漏洞，你必须阅读这些函数，并提出关于它们的三个最重要的边缘案例问题。这将帮助你识别错误或漏洞。那三个问题是什么？请提出非常具体的问题，并提供你想要检查的可疑参数和代码路径。\r\n```\r\n\r\n但请注意微妙的平衡！GPT 响应的质量取决于提示。\r\n\r\n以 [crvUSD](https://github.com/curvefi/curve-stablecoin) 的某些代码为例。首先，我们将其多个函数 \\[ [1](https://github.com/curvefi/curve-stablecoin/blob/64dc13db563ec6067c75c662ee71a285442ef638/contracts/Controller.vy#L574-L617), [2](https://github.com/curvefi/curve-stablecoin/blob/64dc13db563ec6067c75c662ee71a285442ef638/contracts/AMM.vy#L662-L743)\\] 合并为一个 [\\[→查看代码\\]](https://gist.github.com/knek-little-projects/10d9ff262d281212852a31c627eb7ece)。然后提出建议：\r\n\r\n![](https://img.learnblockchain.cn/2025/03/09/upload_1733ddbcee9cb.png)\r\n\r\n为了评估生成质量，我们将结果问题分为三个类别：\r\n\r\n1. 无意义。例如，当 GPT 建议检查 uint256 的负值时。\r\n2. 懒惰。例如，当它问如果你传入 collateral==0 会发生什么，尽管代码中已经有检查 assert collateral * X / Y > 100，禁止零值。\r\n3. 含糊。例如，当它建议检查代码中的所有不安全数学运算。这是静态检查清单的典型问题，我们不需要这一点。\r\n4. 好的具体问题。例如，当 GPT 表示 create\\_loan() 可以接受一个值与 msg.value 不匹配的抵押品值，并且对此有一个未知的部分代码调用，\\_deposit\\_collateral(collateral, msg.value)。GPT 问道：这个未知函数是否正确处理这两个值可能不匹配？\r\n\r\n通过合并几个函数，我们让 GPT-4 生成了 15 个问题，得到的结果如下：\r\n\r\n| 生成问题 | 数量 |\r\n| --- | --- |\r\n| 无意义 | 1 |\r\n| 懒惰 | 1 |\r\n| 含糊 | 0 |\r\n| 好的具体问题 | 13 |\r\n\r\n生成问题;数量\r\n\r\n无意义;1  \r\n懒惰;1  \r\n含糊;0  \r\n好的具体问题;13\r\n\r\n好结果！\r\n\r\n## 结论\r\n\r\n我们揭示了一些可以加速你对协议理解和提升审计质量的技巧。AI 的领域是一个蓬勃发展的景观，不要惧怕，因为掌握这一惊人工具将引领你迈向非凡的成就。因此，抓住 GPT 的力量，我们将共同踏上无尽的探索之旅！\r\n\r\n- MixBytes 是谁？\r\n\r\n[MixBytes](https://mixbytes.io/) 是一个由专家区块链审计员和安全研究员组成的团队，专注于为 EVM 兼容和 Substrate 基础的项目提供全面的智能合约审计和技术咨询服务。加入我们，关注 [X](https://twitter.com/MixBytes)，以随时了解最新的行业趋势和见解。\r\n\r\n>- 原文链接： [mixbytes.io/blog/chatgpt...](https://mixbytes.io/blog/chatgpt)\r\n>- 登链社区 AI 助手，为大家转译优秀英文文章，如有翻译不通的地方，还请包涵～"},"author":{"user":"https://learnblockchain.cn/people/24680","address":null},"history":null,"timestamp":1741514410,"version":1}