浅析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修改input的type属性及浏览器兼容问题探讨与解决
Jan 23 Javascript
jquery插件开发之实现jquery手风琴功能分享
Mar 10 Javascript
jQuery简单实现禁用右键菜单
Mar 10 Javascript
用js实现简单算法的实例代码
Sep 24 Javascript
jquery ajax后台返回list,前台用jquery遍历list的实现
Oct 30 Javascript
React利用插件和不用插件实现双向绑定的方法详解
Jul 03 Javascript
JS实现遍历不规则多维数组的方法
Mar 21 Javascript
浅谈webpack+react多页面开发终极架构
Nov 11 Javascript
详解Vue实战指南之依赖注入(provide/inject)
Nov 13 Javascript
js实现GIF动图分解成多帧图片上传
Oct 24 Javascript
JSON stringify方法原理及实例解析
Oct 23 Javascript
Node.js文本文件BOM头的去除方法
Nov 22 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
图书管理程序(一)
2006/10/09 PHP
php中删除数组的第一个元素和最后一个元素的函数
2015/03/07 PHP
php递归遍历多维数组的方法
2015/04/18 PHP
jQuery Study Notes学习笔记 (二)
2010/08/04 Javascript
Jquery拖拽并简单保存的实现代码
2010/11/28 Javascript
TextArea不支持maxlength的解决办法(jquery)
2011/09/13 Javascript
Jquery如何实现点击时高亮显示代码
2014/01/22 Javascript
JS获取随机数函数可自定义最小值最大值
2014/05/08 Javascript
javascript中不提供sleep功能如何实现这个功能
2014/05/27 Javascript
关于编写性能高效的javascript事件的技术
2014/11/28 Javascript
jquery中animate的stop()方法作用实例分析
2015/01/30 Javascript
JavaScript类型系统之基本数据类型与包装类型
2016/01/06 Javascript
JS获取和修改元素样式的实例代码
2016/08/06 Javascript
Bootstrap页面缩小变形的快速解决办法
2017/02/03 Javascript
es6基础学习之解构赋值
2018/12/10 Javascript
vue中的mvvm模式讲解
2019/01/31 Javascript
基于mpvue小程序使用echarts画折线图的方法示例
2019/04/24 Javascript
js+css3实现炫酷时钟
2020/08/18 Javascript
python爬虫实现教程转换成 PDF 电子书
2017/02/19 Python
Python3之读取连接过的网络并定位的方法
2018/04/22 Python
Python实现获取汉字偏旁部首的方法示例【测试可用】
2018/12/18 Python
python处理“
2019/06/10 Python
Python 3.6 -win64环境安装PIL模块的教程
2019/06/20 Python
python3获取当前目录的实现方法
2019/07/29 Python
python3 dict ndarray 存成json,并保留原数据精度的实例
2019/12/06 Python
django序列化serializers过程解析
2019/12/14 Python
python中使用paramiko模块并实现远程连接服务器执行上传下载功能
2020/02/29 Python
python能在浏览器能运行吗
2020/06/17 Python
运动会入场词60字
2014/02/15 职场文书
乡镇交通安全实施方案
2014/03/29 职场文书
环保项目建议书
2014/08/26 职场文书
商场父亲节活动方案
2014/08/27 职场文书
三方协议书
2015/01/27 职场文书
2016思想纪律作风整顿心得体会
2016/01/23 职场文书
MySQL 如何分析查询性能
2021/05/12 MySQL
Oracle 死锁的检测查询及处理
2021/09/25 Oracle