几款AI工具代码安全漏洞分析能力对比

发布时间:2023年12月21日

???? 这段时间研究AI平台的能力。 今天我把库博检测工具发现的一个Java安全漏洞相关代码传到几款AI工具上进行分析,看看这几款工具反馈的结果。这些工具包括ChatGPT-3.5、Forefront Claude、AIChat(组合)和清华ChatGlm。

?????? 首先我们看看库博检测出的这个漏洞是否存在。先在代码。

protected?void?doPost(HttpServletRequest?request,?HttpServletResponse?response)?throws?ServletException,?IOException?{

????????//?TODO?Auto-generated?method?stub

????????/**

?????????*?文件下载

?????????*?有目录遍历攻击漏洞的代码

?????????*/

????????????request.setCharacterEncoding("UTF-8");

????????????response.setContentType("text/html;charset=utf-8");

????????????response.setCharacterEncoding("utf-8");

????????????OutputStream?out?=?null;

????????????//获取项目部署绝对路径下的upload文件夹路径,下载upload目录下面的文件

????????????String?root?=?request.getServletContext().getRealPath("/upload");

????????????//获取文件名

????????????String?filename?=?request.getParameter("filename");

????????????File?file?=?new?File(root?+?"/"?+?filename);

????????????//根据文件路径创建输入流

????????????FileInputStream?fis?=?new?FileInputStream(file);

????????????out=response.getOutputStream();

????????????//设置响应头,弹出下载框

???????????System.out.println(root?+?"/"?+?filename);

????????????//response.setContentType("application/x-msdownload");

???????????//?response.addHeader("Content-Disposition",?"attachment;filename="?+?new?String(filename.getBytes()));

????????????

????????????String?agent?=?request.getHeader("USER-AGENT").toLowerCase();

????????????String?name?=?new?String(filename.getBytes(agent.indexOf("msie")?!=?-1???"GBK"?:?CharEncoding.UTF_8),?CharEncoding.ISO_8859_1);

????????????response.setContentType("application/octet-stream");

????????????response.setHeader("Content-Length",?""?+?file.length());

????????????response.setHeader("Pragma",?"NO-cache");

????????????response.setHeader("Cache-Control",?"No-cache");

????????????response.setCharacterEncoding("UTF-8");

????????????response.setContentType("text/html");

????????????response.setDateHeader("Expires",?-1);

????????????

????????????response.setHeader("Content-disposition",?"attachment;filename="?+?name);

????????????//response.addHeader("Content-Length",?""?+?file.length());

????????????//byte[]?b?=?new?byte[fis.available()];

????????????byte[]?b?=?new?byte[1024];

????????????int?len=0;

????????????while?((len=fis.read(b))!=-1)

????????????????out.write(b,0,len);

????????????

????????????if(len==-1)

????????????{

????????????????fis.close();

????????????????request.getSession().setAttribute("message2","下载完成!");

????????????????request.getRequestDispatcher("/filetraversal.jsp").forward(request,?response);

????????????}

? ?????}

库博检测是以安全漏洞维度展示的,所以点击某个漏洞类型,可以看到该安全漏洞对应的代码位置。当前这个版本没有以文件形式展示漏洞方式了(国内工具基本上都没有该功能,库博之前版本是有的)。

首先我们测试一下边界AICHAT,我们使用推荐模型组合,输入代码后,给出分析结果如下。

可以看到,AI引擎给找出来了多个缺陷,其中第一条就是我们最关注的路径遍历,能够给出来。第2条代码中不存在,但是3、5、6还的确是存在的问题。这样看,分析还是比较全面的。

使用国外AI工具Forefront Chat进行分析,该工具也是集成Chatgpt、Claude 1.2,该引擎是需要在互联网进行搜索,大概1分钟没有反馈出结果。

我们看Chatgpt官方网站上,使用Chatgpt-3.5引擎的分析结果。

分析上面的结果,可以看到发现了3个安全问题,第1个事路径遍历,第2个问题,国产AI工具也给出了类似结果。而第3个问题感觉是一个误报,因为在代码中进行流资源释放,但是是在一个分支进行了释放,应该算是一个误报。

我们再看看在清华大学的ChatGlm平台上的分析结果。

……………省略中间代码,见下面。

为了方便,我贴出所有返回的代码。

protected? void? doPost(HttpServletRequest? request,? HttpServletResponse? response)? throws? ServletException,? IOException? {

???? //? TODO? Auto-generated? method? stub

???? /**

?????? *? 文件下载

?????? *? 修复了目录遍历攻击漏洞的代码

?????? */

???? request.setCharacterEncoding("UTF-8");

???? response.setContentType("text/html;charset=utf-8");

???? response.setCharacterEncoding("utf-8");

???? OutputStream? out? =? null;

???? //? 获取项目部署绝对路径下的upload文件夹路径,下载upload目录下面的文件

???? String? root? =? request.getServletContext().getRealPath("/upload");

???? //? 获取文件名

???? String? filename? =? request.getParameter("filename");

???? //? 检查文件名是否符合预期

???? if? (filename? ==? null? ||? filename.trim().isEmpty())? {

???????? response.sendError(HttpServletResponse.SC_BAD_REQUEST,? "Invalid? file? name");

???????? return;

???? }

???? //? 限制用户可以下载的文件类型

???? String? allowedExtensions? =? "txt,jpg,png,gif";

???? String? fileExtension? =? filename.substring(filename.lastIndexOf('.')? +? 1).toLowerCase();

???? if? (!allowedExtensions.contains(fileExtension))? {

???????? response.sendError(HttpServletResponse.SC_BAD_REQUEST,? "Invalid? file? extension");

???????? return;

???? }

???? File? file? =? new? File(root? +? "/"? +? filename);

???? //? 使用ServletContext.getResourceAsStream()代替FileInputStream

????? try? (InputStream? is? =? request.getServletContext().getResourceAsStream("/upload/"? +? filename))? {

???????? if? (is? ==? null)? {

???????????? response.sendError(HttpServletResponse.SC_NOT_FOUND,? "File? not? found");

???????????? return;

???????? }

???????? response.setContentType("application/octet-stream");

???????? response.setHeader("Content-Length",? String.valueOf(is.available()));

???????? response.setHeader("Pragma",? "NO-cache");

???????? response.setHeader("Cache-Control",? "No-cache");

???????? response.setCharacterEncoding("UTF-8");

???????? response.setContentType("text/html");

???????? response.setDateHeader("Expires",? -1);

???????? response.setHeader("Content-disposition",? "attachment;filename="? +? filename);

???????? byte[]? buffer? =? new? byte[1024];

???????? int? bytesRead;

???????? while? ((bytesRead? =? is.read(buffer))? !=? -1)? {

???????????? out.write(buffer,? 0,? bytesRead);

???????? }

???? }? catch? (IOException? e)? {

???????? //? 处理异常,例如记录日志、返回错误信息等

???????? e.printStackTrace();

???? }

???? if? (out? !=? null)? {

????????? try? {

???????????? out.flush();

???????????? out.close();

???????? }? catch? (IOException? e)? {

???????????? //? 处理异常,例如记录日志、返回错误信息等

???????????? e.printStackTrace();

???????? }

???? }

}

突然感觉清华大学的这个AI引擎功能强大,不但给出了4个问题,最亮眼的给出的修复后的代码,这段代码我还没有时间去替换原来代码去编译看看是否存在问题,但是这个功能足于领先了。为了验证引擎,我把返回的代码又贴了回去,让引擎分析分析是否存在漏洞。其反馈结果如下:

在其提供的修复代码的基础上又检测出的问题,其提供的修复代码中,增加了对于文件类型的限制。

通过这个例子说明,国内AI引擎有自己创新之处,但是在一些细节上还是存在瑕疵,需在在引擎或训练数据上做的更精细。

(结束)

文章来源:https://blog.csdn.net/manok/article/details/135127596
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。