浅析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 相关文章推荐
jQuery中delegate()方法用法实例
Jan 19 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记6)
Dec 20 Javascript
JavaScript获取当前运行脚本文件所在目录的方法
Feb 03 Javascript
JavaScript代码因逗号不规范导致IE不兼容的问题
Feb 25 Javascript
关于backbone url请求中参数带有中文存入数据库是乱码的快速解决办法
Jun 13 Javascript
微信小程序 触控事件详细介绍
Oct 17 Javascript
Bootstrap CSS组件之面包屑导航(breadcrumb)
Dec 17 Javascript
基于bootstrap的选择框插件icheck
Dec 23 Javascript
解决Vue编译时写在style中的路径问题
Sep 21 Javascript
原生JS实现动态加载js文件并在加载成功后执行回调函数的方法
Dec 30 Javascript
VUE 实现滚动监听 导航栏置顶的方法
Sep 11 Javascript
解决vuejs 使用value in list 循环遍历数组出现警告的问题
Sep 26 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
DOTA2游戏同人动画《龙之血》导演接受采访
2021/03/05 欧美动漫
php用正则表达式匹配中文实例详解
2013/11/06 PHP
Laravel 5框架学习之数据库迁移(Migrations)
2015/04/08 PHP
常用PHP封装分页工具类
2017/01/14 PHP
PHP实现文字写入图片功能
2019/02/18 PHP
thinkphp5.1框架模板布局与模板继承用法分析
2019/07/19 PHP
php更新cookie内容的详细方法
2019/09/30 PHP
判断多个元素(RADIO,CHECKBOX等)是否被选择的原理说明
2009/02/18 Javascript
基于JavaScript 类的使用详解
2013/05/07 Javascript
javascript:FF/Chrome与IE动态加载元素的区别说明
2014/01/26 Javascript
推荐阅读的js快速判断IE浏览器(兼容IE10与IE11)
2015/12/13 Javascript
js实现文字滚动效果
2016/03/03 Javascript
一个简单不报错的summernote 图片上传案例
2016/07/11 Javascript
AngularJS中的DOM操作用法分析
2016/11/04 Javascript
解决Window10系统下Node安装报错的问题分析
2016/12/13 Javascript
slideToggle+slideup实现手机端折叠菜单效果
2017/05/25 Javascript
JavaScript之排序函数_动力节点Java学院整理
2017/06/30 Javascript
vue+webpack实现异步加载三种用法示例详解
2018/04/24 Javascript
react 中父组件与子组件双向绑定问题
2019/05/20 Javascript
VUE写一个简单的表格实例
2019/08/06 Javascript
Vue 动态路由的实现及 Springsecurity 按钮级别的权限控制
2019/09/05 Javascript
Python如何判断数独是否合法
2016/09/08 Python
python进行TCP端口扫描的实现
2018/12/21 Python
python 读取修改pcap包的例子
2019/07/23 Python
css3和jquery实现自定义checkbox和radiobox组件
2014/04/22 HTML / CSS
Herschel Supply Co.美国:背包、手提袋及配件
2020/11/24 全球购物
Internal修饰符有什么含义
2013/07/10 面试题
外企测试工程师面试题
2015/02/01 面试题
大学生农村教师实习自我鉴定
2013/09/21 职场文书
农林经济管理专业自荐信
2014/09/01 职场文书
2014机关党员干部“正风肃纪”思想汇报
2014/09/15 职场文书
酒店宣传语大全
2015/07/13 职场文书
升学宴来宾致辞
2015/07/27 职场文书
2017新年晚会开幕词
2016/03/03 职场文书
高效笔记技巧分享:学会这些让你不再困扰
2019/09/04 职场文书
Windows10安装Apache2.4的方法步骤
2022/06/25 Servers