浅析node应用的timing-attack安全漏洞


Posted in Javascript onFebruary 28, 2018

前言

假如你在项目中遇到过 eslint 报错 Potential timing attack ,不可忽视!这是一个涉及到安全的问题:时序攻击。
eslint 报错原因

首先eslint引入了一个叫做eslint-plugin-security的插件,这个插件有助于识别出潜在的安全问题,但同时也会产生误报的问题,附上插件 源码地址。

var keywords = '((' + [
  'password',
  'secret',
  'api',
  'apiKey',
  'token',
  'auth',
  'pass',
  'hash'
 ].join(')|(') + '))';

 var re = new RegExp('^' + keywords + '$', 'im');

 function containsKeyword (node) {
  if (node.type === 'Identifier') {
   if (re.test(node.name)) return true;
  }
  return
 }
 if (node.test.operator === '==' || node.test.operator === '===' || node.test.operator === '!=' || node.test.operator === '!==') {
  // 在这里 console 出错误
 }

首先这个插件会判断本次的运算符是否为 ==、===、!=、!==其中一种,其次检查标识符(字段名)是否包含特殊字符串password、secret、api、apiKey、token、auth、pass、hash,如果同时满足二者情况,eslint 就会编译报错 Potential timing attack。

攻击定义

timing attack:时序攻击,属于侧信道攻击 / 旁路攻击,侧信道攻击指的是利用信道外的信息,比如加解密的数据、数据比较时间、密文传输的流量和途径进行攻击的方式,相当于是“旁敲侧击”。

攻击点

首先讲讲js比较两个字符串大小的原理:

  • 判断字符串长度是否为0,如果为0,就可以直接比较出结果;反之,进入到第二步。
  • 字符串是由一个个字符组成,通过每个字符的charCode进行比较。
  • 在第二步中,只要出现一个字符不同,就 return false,剩余的字符不再做比较。

单个字符的比较是很快的,攻击者可以细化测量时间精度到微秒,通过响应时间的差异推算出是从哪一个字符开始不用的,这样一次次实验或者用 Python 写个脚本去跑,就可以试出正确的密码,密码破解的难度也降低了不少。

容易受攻击的写法

if (user.password === password) {
  return { state: true }; // 登录成功
 }

防御措施

每次不同的输入会造成处理时间的不同。为了防止它,我们需要使字符串比较花费相同的时间量,无论输入的密码是什么。
不容易受攻击的写法

系统中每一个密码的长度是固定的,每次比较密码是否相同时,使用正确密码的长度作为比较次数,使用异或比较每一个字符的 Unicode 编码是否相等,并且把每一次的比较结果存放到一个数组中,最后再判断数组的每一个元素是否为0(为 0 表示两个字符相同)。

// psdReceived 为用户输入密码;
 // psdDb 为系统中存储的正确用户密码
 const correctUser = (psdDb, psdReceived) => {
  const state = [];
  for (let i = 0; i < psdDb.length; ++i) {
   if (!psdReceived[i]) {
    state.push(false);
   } else {
    state.push(psdReceived.charCodeAt(i) ^ psdDb.charCodeAt(i));
   }
  }
  return state.length !== 0 && state.every(item => !item);
 }

三方包推荐

也可以使用 cryptiles 这个 npm 模块来解决这个问题

import cryptiles from 'cryptiles';

......
return cryptiles.fixedTimeCimparison(passwordFromDb, passwordReceived);
Javascript 相关文章推荐
键盘 keycode的值 javascript时触发事件时很有用的要素
Nov 02 Javascript
javascript使用定时函数实现跳转到某个页面
Dec 25 Javascript
js确认删除对话框适用于a标签及submit
Jul 10 Javascript
jquery显示隐藏input对象
Jul 21 Javascript
JavaScript将数字转换成大写中文的方法
Mar 23 Javascript
javascript实现拖放效果
Dec 16 Javascript
JS中BOM相关知识点总结(必看篇)
Nov 22 Javascript
Canvas实现放射线动画效果
Feb 15 Javascript
说说AngularJS中的$parse和$eval的用法
Sep 14 Javascript
Vue入门之数据绑定(小结)
Jan 08 Javascript
vue-cli3.0 特性解读
Apr 22 Javascript
JavaScript怎样在删除前添加确认弹出框?
May 27 Javascript
vue组件传递对象中实现单向绑定的示例
Feb 28 #Javascript
在Vue组件中使用 TypeScript的方法
Feb 28 #Javascript
React组件中的this的具体使用
Feb 28 #Javascript
浅谈Vue网络请求之interceptors实际应用
Feb 28 #Javascript
Node.js中DNS模块学习总结
Feb 28 #Javascript
Vue自定义指令实现checkbox全选功能的方法
Feb 28 #Javascript
如何在vue中使用ts的示例代码
Feb 28 #Javascript
You might like
phpMyAdmin下载、安装和使用入门教程
2007/05/31 PHP
php设计模式之命令模式的应用详解
2013/05/21 PHP
smarty高级特性之对象的使用方法
2015/12/25 PHP
PHP实现搜索地理位置及计算两点地理位置间距离的实例
2016/01/08 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
2020/02/15 PHP
List the Codec Files on a Computer
2007/06/18 Javascript
jquery之empty()与remove()区别说明
2010/09/10 Javascript
jQuery下实现等待指定元素加载完毕(可改成纯js版)
2013/07/11 Javascript
JavaScript静态类型检查工具FLOW简介
2015/01/06 Javascript
javascript中对变量类型的判断方法
2015/08/09 Javascript
BOM系列第三篇之定时器应用(时钟、倒计时、秒表和闹钟)
2016/08/17 Javascript
JS实现向iframe中表单传值的方法
2017/03/24 Javascript
基于AGS JS开发自定义贴图图层
2017/03/31 Javascript
详解vue-cli脚手架build目录中的dev-server.js配置文件
2017/11/24 Javascript
Angular2使用vscode断点调试ts文件的方法
2017/12/13 Javascript
Bootstrap开发中Tab标签页切换图表显示问题的解决方法
2018/07/13 Javascript
详解Angularjs 自定义指令中的数据绑定
2018/07/19 Javascript
Vue动态创建注册component的实例代码
2019/06/14 Javascript
iview form清除校验状态的实现
2019/09/19 Javascript
解决vuex数据异步造成初始化的时候没值报错问题
2019/11/13 Javascript
js实现上传图片并显示图片名称
2019/12/18 Javascript
[01:06]DOTA2亚洲邀请赛专属珍藏-荧煌之礼
2017/03/24 DOTA
python爬虫入门教程--快速理解HTTP协议(一)
2017/05/25 Python
python 中random模块的常用方法总结
2017/07/08 Python
python Flask实现restful api service
2017/12/04 Python
PyCharm 常用快捷键和设置方法
2017/12/20 Python
python之yield和Generator深入解析
2019/09/18 Python
详解python中的三种命令行模块(sys.argv,argparse,click)
2020/12/15 Python
伦敦剧院门票:From The Box Office
2018/06/30 全球购物
小学毕业感言50字
2014/02/16 职场文书
优秀毕业生自荐信
2014/06/10 职场文书
2014大四本科生自我鉴定总结
2014/10/04 职场文书
员工工作及收入证明
2014/10/28 职场文书
2015年路政工作总结
2015/05/22 职场文书
2015年中学团委工作总结
2015/07/22 职场文书
Python Matplotlib绘制两个Y轴图像
2022/04/13 Python