简介
GoAhead是美国Embedthis Software公司的一款嵌入式Web服务器,提供开源和企业版本,用于全球数亿台设备中。CVE-2019-5096由思科 Talos 团队的研究员发现,可以在Pre-Auth的条件下触发漏洞。
时间线
- 报告漏洞 2019-08-28
- 漏洞修复 2019-11-21
- 漏洞公开 2019-12-02
漏洞影响范围
- GoAhead 5.0.1
- GoAhead 3.6.5
- GoAhead 4.1.1
复现
PoC
1 | import requests |
调用栈
1 | ... |
漏洞分析
函数调用流程为
- websProcessUploadData
- initUpload
- processContentBoundary
- processUploadHeader
- processContentData
其中 processUploadHeader
函数会调用 freeUploadFile
free 掉 wp->currentFile
1 | static void processUploadHeader(Webs *wp, char *line) |
processContentData
函数会把上传文件加入到 wp->files
中
1 | static bool processContentData(Webs *wp) |
在请求执行完毕后,会进入 termWebs
-> websFreeUpload
的执行流,将 wp->files
中的 WebsUpload
对象全部 free 一次。
1 | PUBLIC void websFreeUpload(Webs *wp) |
可以看到漏洞触发点是在 freeUploadFile
函数,这里仅仅检查了 up->filename
的值。但是在上传多个文件时,之前的 WebsUpload
对象被 free 掉后仍然在链表中,会触发第二次 free。
1 | static void freeUploadFile(WebsUpload *up) |
漏洞Patch
补丁修补方式为在 processContentData
函数加入链表后置 wp->currentFile
为空。
1 | static bool processContentData(Webs *wp) |