0


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

 这段时间研究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
版权归原作者 manok 所有, 如有侵权,请联系我们删除。

“几款AI工具代码安全漏洞分析能力对比”的评论:

还没有评论