浅析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 相关文章推荐
不安全的常用的js写法
Sep 15 Javascript
基于jquery的禁用右键、文本选择功能、复制按键的实现代码
Aug 27 Javascript
jquery实现两个图片渐变切换效果的方法
Jun 25 Javascript
jquery编写Tab选项卡滚动导航切换特效
Jul 17 Javascript
jQuery获取所有父级元素及同级元素及子元素的方法(推荐)
Jan 21 jQuery
node.js遍历目录的方法示例
Aug 01 Javascript
原生js实现Flappy Bird小游戏
Dec 24 Javascript
微信小程序结合Storage实现搜索历史效果
May 18 Javascript
vue源码中的检测方法的实现
Sep 26 Javascript
vue 翻页组件vue-flip-page效果
Feb 05 Javascript
微信小程序 flexbox layout快速实现基本布局的解决方案
Mar 24 Javascript
基于vue与element实现创建试卷相关功能(实例代码)
Dec 07 Vue.js
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
codeigniter自带数据库类使用方法说明
2014/03/25 PHP
Yii2.0 模态弹出框+ajax提交表单
2016/05/22 PHP
JavaScript实现删除电脑的关机键
2016/07/26 PHP
用JavaScript页面不刷新时全选择,全删除(GridView)
2009/04/14 Javascript
Javascript继承(上)——对象构建介绍
2012/11/08 Javascript
屏蔽网页右键复制和ctrl+c复制的js代码
2013/01/04 Javascript
清除div下面的所有标签的方法
2014/02/17 Javascript
js获取会话框prompt的返回值的方法
2015/01/10 Javascript
JS制作手机端自适应缩放显示
2015/06/11 Javascript
JS实现的网页背景闪电闪烁效果代码
2015/10/17 Javascript
bootstrapValidator表单验证插件学习
2016/12/30 Javascript
微信小程序中post方法与get方法的封装
2017/09/26 Javascript
bootstrap模态框嵌套、tabindex属性、去除阴影的示例代码
2017/10/17 Javascript
vue结合Echarts实现点击高亮效果的示例
2018/03/17 Javascript
详解angular路由高亮之RouterLinkActive
2018/04/28 Javascript
通过一次报错详细谈谈Point事件
2018/05/17 Javascript
vue-router动态设置页面title的实例讲解
2018/08/30 Javascript
vue cli安装使用less的教程详解
2019/07/12 Javascript
jquery添加div实现消息聊天框
2020/02/08 jQuery
[01:15:44]首部DOTA2纪录片今日23时全网上映
2014/03/19 DOTA
[01:03:36]DOTA2-DPC中国联赛 正赛 VG vs Magma BO3 第二场 1月26日
2021/03/11 DOTA
Python实现一个数组除以一个数的例子
2019/07/20 Python
在pycharm中配置Anaconda以及pip源配置详解
2019/09/09 Python
详解torch.Tensor的4种乘法
2020/09/03 Python
英国最大的宝石首饰超市:QP Jewellers
2018/09/23 全球购物
竞聘医务工作人员的自我评价分享
2013/11/04 职场文书
行政助理岗位职责范文
2013/12/03 职场文书
大学三年的自我评价
2013/12/25 职场文书
《春天来了》教学反思
2014/04/07 职场文书
婚礼领导致辞大全
2015/07/28 职场文书
小学三年级数学教学反思
2016/02/16 职场文书
浅谈移动端中的视口(viewport)的具体使用
2021/04/13 HTML / CSS
Mysql Online DDL的使用详解
2021/05/20 MySQL
详解MindSpore自定义模型损失函数
2021/06/30 Python
virtualenv隔离Python环境的问题解析
2022/06/21 Python
纯CSS实现一个简单步骤条的示例代码
2022/07/15 HTML / CSS