2015-09-14时,Marcello Duarte披露漏洞免费Switch并发ugtraq邮件列表.此分配CVE-2015-7392读作:
堆积缓冲溢出剖分函数libs/esl/src/esl_json.c
freeSwitch前 1.4.23和1.6.x前1.6.2允许远程攻击者通过json字符串中的跟踪\u执行任意代码JSON剖析
.
经调查后,Tenable发现这一描述不完全准确,问题未适当补补仍有可能通过FreeSwitch编译JSON从1.4.4至1.6.2版(当前版)和1.7.0版(开发版)触发堆积溢出原创CVE项只提到第三方事件套接字库中的开发问题,
- FreeSwitch命令行通过json命令
开关json.c
本地语)
- freeSwitch命令json通过事件套接字库连接事件套接字模块
开关json.c
本地默认远程潜在)
- 发送编译JSON至Verto模块多播监听器
开关json.c
远程传输)
- 错误/恶意JSON从服务器传输ESL客户端
sljson.c
远程并可能需要MitM
原Bugtraq披露表示易损性2015年9月14日补丁相联Jira票公众可访问性/广度/百度/百度/百度/百度/百度/百度/百度/百度/百度/百度/百度/百度/百度/百度/百度/百度/百度/百度/百度/百度/百度/百度/百度/百度/百度/百度/百度/百度/百度/百度/百度/百度/百度/百度/百度/百度/百度/百度/百度/百度/百度/注意补丁修复剖析字符串 ()
函数内src/switch_json.c
,libs/libks/src/ks_json.c
并libs/esl/src/esl_json.c
后一文件为CVE条目中唯一明文提及的文件
上头剖析字符串 ()
行155函数sljson.c
JSON字符串中应取并转换正常字符串C字符串有两件事情要考虑优先计算字符串缓冲区大小,第二分析器处理Unicode越线值u0001ugtraq披露中提及,回字符串缓冲区计算法从起始引文计数到最后不可避免引文解析符处理越出Unicode识别二字串并传递数据单字节scanf
.下方代码中,*ptr一行包含sCVE-2015-7392描述攻击JSON剖析
.可用两种方式解释:
{ "key" : "value\u" }
{"key" : "value\u
首例JSON失败scanf
因字符''不易换换scanf转换失败 自NULL终结器传递为scanf中断后scanf
失效增量回溯回转回顶端基于CVE-2015-7392中的描述,没有足够的信息导致堆溢出if we观察scanf
使用时,我们可以查找溢出量上头scanf
man页面表示返回值
...函数返回成功匹配和分配输入项数,可比预设少,或提前匹配失效时甚至为零...
字符串指针总加四分JSON字符串,如下文提供,scanf只耗用一个字符,将使解析器跳过 " 并开始写出超出分配缓冲区尾
堆数一aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
上头发布修复CVE-2015-7392修改行42if(*ptr)ptr++
.问题无法解决 根由与scanf
细节漏洞
CVE描述脆弱点在FreeSwitch中远程脆弱点,但引用libs/esl/src/esl_json.c
文件.有意思的是注意到代码ibs/esl/
目录实际上不是本地FreeSwitch代码,而是一个库供用户使用第三方应用与FreeSwitch通信.CVE描述的脆弱点不是FreeSWITCH远程脆弱点,而是第三方应用远程脆弱点,第三方使用事件套接字库与FreeSWITCH通信FreeSwitch工具Fs_cli实例可能受影响第三方FreeSwitch.
原创修复程序还应用到另外两个地点:libs/libks/src/ks_json.c and src/switch_json.c
.基于检验,似乎libs/libks/src/ks_json.c
未使用代码,因此不可使用不过src/switch_json.c
FreeSwitch基础代码使用第一种方法通过FreeSwitch命令行实现指令json使用CLI向本地用户提供启动FreeSwitchgit主版时3f3b855写作时使用下列命令
user:~/freeswitch$sudo/usr/local/freeswitch/bin/freeswitch-conf./conf/-log./log-db
广度攻击面以图远程触发易损性,为各种TCP和UDP端口提供赋能服务具体兴趣有UDP端口1337和TCP端口8021
UDP端口1337是Verto模块的一部分,多播流量接口接受JSON-RPC输入攻击者需要发送单件UDP包和编译JSON
用户:~/freeswitch$nc-u192168.1121337{heaaaaaaaaaaaa
TCP端口8021是事件套接字模块的一部分(事件套接字库服务器端)。从攻击角度来说,这个端口不那么有趣,因为它默认绑定127.0.0.1,密码保护,只有访问控制列表中的IP地址才能连接它。为了与事件套接字库通信,它帮助理解协议或使用事件套接字库可使用事件套接字库查找合适的客户libs/esl/testclient.c
.客户笔录时使用默认密码登录本地主机FreeSwitch实例(无用户名密码Cluec改行12send_recv
函数自定义溢出字符串,我们可以触发完全相同的代码路径,导致前文提到的FreeSWITCH命令行溢出当然,这次攻击假设你可以破解ACL密码 监听者不受本地宿主约束
脆弱JSON解析代码开关json.c
首创代码库2010修订版c5086b15174.官方发布前不得使用上述方法1.4.4版(2014年5月23日)。这是因为代码似乎不接受用户输入直到开关命令引入命令行代码似乎原存系统生成JSON(代之以Plain或xml)