ChatGPTScan:使用ChatGPTScan批量进行代码审计

admin 2023年4月10日09:00:01评论393 views字数 2550阅读8分30秒阅读模式


背景

最近 chatgpt 杀进安全圈,除过各位师傅介绍的使用方法外,微软也公布了Copilot。

在网络安全应用方面,现在chatgpt 的优势是对于代码/日志/混淆等文本类信息有着较好的理解能力。

例如在代码审计时,常常会遇到一些大型项目,里面有很多复杂的函数。使用 chatgpt 辅助代码审计,可以快速理解这些函数的作用,提高代码审计效率。

这里尝试使用 chatgpt 实现一个代码审计平台,让 chatgpt 帮我挖洞。


收获

添加了约 2w 个 github 开源项目进行扫描 ( 因为 api 成本问题,截止目前,扫描了一部分 ), 在 github 某  1k star 和 1.2k star 的 开源项目中扫描到了两个高危问题,目前已经提交修复,并获得 CVE 编号


OPENAI API 简介

为了方便发送代码和获取结果,以及后续实现自动化扫描功能,我们使用 openai 提供的 api 接口来和 chatgpt 交互。

下面先补充一些 api 接口的基本知识。目前 openai 开放了 api 接口,方便用户基于chatgpt的能力开发第三方程序。已经注册的用户访问管理面板可以创建 API key

https://platform.openai.com/account/api-keys

ChatGPTScan:使用ChatGPTScan批量进行代码审计

openai 也有官方文档提供了 API key 的使用教程。

https://platform.openai.com/docs/api-reference

例如,我们可以通过 curl 请求,在 Authorization 头中带上 API key,和 openai 的 api 交互。这里我将OPENAI_API_KEY 写入了环境变量,直接读取发送。

curl https://api.openai.com/v1/models   -H "Authorization: Bearer $OPENAI_API_KEY"

ChatGPTScan:使用ChatGPTScan批量进行代码审计

响应报文会列出可以使用的模型。

这里我们主要使用 gpt-3.5-turbo 这个模型,它也是目前使用最多的模型。

openai 也提供了封装好的 python 库。首先使用如下指令安装。

pip install openai

然后可以编写一段简单的代码进行测试

import openaiopenai.api_key = "sk-XXXXXXXXX"openai.proxy = "http://127.0.0.1:7890"result = openai.ChatCompletion.create(            model="gpt-3.5-turbo",            messages=[{"role": "user", "content": "Say this is a test!"}]        )print(result.choices[0].message.content)

运行之后即可输出 This is a test!。

这里 message 是一个数组,里面存放历史对话信息。

和网页版的 chatgpt 不同,api 版本可以一次性发送所有的历史对话信息,包括用户的历史提问和 chatgpt 的历史回答。

role 字段预设的角色有三个,user, system 和 assistant。其中 user 代表用户说的内容。system 代表系统说的内容,对于 chatgpt 后续的回答具有指示作用。assistant 代表 chatgpt 的回答。

将三个角色的说话内容加入mssages数组里,即可将整个对话的背景信息发送给 chatgpt。



原理


在实现 ChatGPTScan 前,我们先分析一下在 web 版 chatgpt 进行代码审计的基本流程

首先发送一条请求,让 chatgpt 扮演一个安全专家

ChatGPTScan:使用ChatGPTScan批量进行代码审计

然后将准备好的漏洞代码片段发送给 chatgpt,并且提出让它分析代码,找出漏洞然后根据严重程度分级

ChatGPTScan:使用ChatGPTScan批量进行代码审计

chatgpt输出如下

ChatGPTScan:使用ChatGPTScan批量进行代码审计

可以看到 chatgpt 比较清晰地输出了漏洞存在的位置,漏洞描述,以及给漏洞标注的危害等级

其中对于明显存在漏洞的代码,标注了高危;对于存在漏洞但是可能无法利用的代码,标注了中危;对于做了防护的代码,标注了低危

从上面的交互过程中可以总结出,我们需要发送给 chatgpt 的内容分成三个部分

第一,系统指令部分,告诉 chatgpt 扮演一个网络安全专家,引导 chatgpt 进入情景

第二,代码内容部分,将需要分析的代码发送给 chatgpt

第三,用户需求部分,告诉 chatgpt 需要做怎样的分析,以及以怎样的格式输出

设计 ChatGPT 代码审计的 prompt, 可以从这个三段式的结构入手


实现效果

下面展示一下实现好的效果。项目后端采用 python + openai 库,前端采用 vue3 + element-plus

架构上, 扫描器和 web 管理界面分离, 可以支持 web 管理界面远程控制扫描器。

功能上, 实现了运行管理,项目列表,扫描结果,用户管理和密钥管理模块。

性能上,采用多线程加速扫描,理论 api 调用频率可以达到 openai 限制频率。

主要模块截图如下:

运行管理:这里可以监控扫描器运行状态,启动和停止扫描器。

ChatGPTScan:使用ChatGPTScan批量进行代码审计

项目列表: 这里可以查看添加的项目信息,支持多种搜索条件。

ChatGPTScan:使用ChatGPTScan批量进行代码审计

扫描结果:这里可以查看所有扫描结果,支持多种搜索条件,ChatGPT 生成的扫描报告会以 markdown 的形式渲染出来,方便查看。这里也在指令中要求 ChatGPT 明确地用 VulnRh3r3 关键字标注出大概率存在漏洞的报告,方便定位搜索有效漏洞报告。

ChatGPTScan:使用ChatGPTScan批量进行代码审计

用户管理:可以查看用户状态,修改密码。

ChatGPTScan:使用ChatGPTScan批量进行代码审计

密钥管理:可以动态添加和删除密钥, 并且查看余额。

ChatGPTScan:使用ChatGPTScan批量进行代码审计


结语

目前 gpt-3.5-turbo 的 context limit 是 4096个 token,也就是说 messages 所有内容加上 chagpt 最后给出的回答不能超过 4096 个 token,不然就会报错。

4096 个 token 支持的代码片段还比较小,只能审计一些较简单的漏洞。

后续 gpt-4 模型的 context limit 为 8k 个 token,gpt-4-32k 模型的 context limit 为 32k 个 token。

增大的 context limit 会更有利于代码审计,可以期待一下。

命令行版本的ChatGPTScanner已经开源:https://github.com/YulinSec/ChatGPTScanner

完整项目后续会在 github 账号 YulinSec 上开源,欢迎持续关注。



原文始发于微信公众号(乌雲安全):ChatGPTScan:使用ChatGPTScan批量进行代码审计

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年4月10日09:00:01
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   ChatGPTScan:使用ChatGPTScan批量进行代码审计http://cn-sec.com/archives/1663890.html

发表评论

匿名网友 填写信息