美剧 WestWorld 第二集里有个场景十分有意思:游客来到西部世界公园,遇到了一个漂亮的女接待员,但无法区分对方是否是人类,于是产生了如下对话:

Guest: "Are you real?"  -- Are you a Human or a Host?

Host: "If you can't tell, Does it matter?"

可以说科技尤其人工智能的发展,机器人已经足以模拟人类达到以假乱真的地步,不过今天要谈的并不是人工智能、不是机器学习。诚然AI可以在人机识别及诸多方面做得很好(假设有足够的训练样本),但它未必是最好、也不是唯一的选择,至少在我所说的当前场景中。

作为科普和背景铺垫,感兴趣的可以检索:

验证码的前世今生(前世篇)

验证码的前世今生(今生篇)

直入主题,安全领域中爬虫、暴力破解、扫描、DDoS等攻击行为都是通过工具发起,操纵者预设指令而工具去自动执行直到任务完成或出于某种原因中断运行。传统安全机制而言,WAF、IPS等这类产品的确在一定程度能够保护用户免受攻击,但鉴于它们都依赖于特征和规则库又有很多限制。

时代在变化,攻击者也在不断尝试新的机会和场景,比如竞争性爬虫、撞库、薅羊毛、虚假注册、灌水刷评论等等。全局分析时,我们可以认为这些操作都是恶意且应被阻断的,然而单独来看每一个操作又是合法且正常的,没有任何攻击特征,WAF解决不了,代码层面做诸多做限制也解决不了。

没有攻击特征,不代表无法识别,可以肯定的是这些针对业务发起的"定制"攻击绝大多数来自于自动化工具,或者说机器人。然而问题难就难在这里,怎么区分一个请求的发起者是人还是机器?

业务方会做很多事情限制非法机器人的访问,最常见的是使用图形验证码、短信验证码。验证码机制早期确实很有效果,但现在也遭遇着巨大的挑战,比如国内打码平台的出现及使用。另一方面,验证码会对用户体验造成较大伤害,企业不得不做一个安全与使用方便的折中,于是出现了滑块验证码。相比扭曲的图形验证码,理论上基于用户行为的滑块验证码无论从安全级别还是易用性都可以有巨大提升,然而它只是安全防护机制其中的一道,存在被突破的可能,而且已经被突破。

实力较好的公司有人专门负责风险控制(简称风控),国内目前也有很多风控服务和产品的提供商,大多是从多维度的数据层面(如过往操作记录、设备指纹等)为某一个"用户"的操作提供信誉评分,确定其是否合法,例如转账支付是否为本人操作。阿里云是这方面的杰出代表,不仅数据层面而且在用户行为识别方面做了不少工作。不过其在风控方面的成就可复制性并不高,首先不是每家公司都有能力做好海量大数据分析,其次用户行为识别需要有很强的前端技术能力,而这种能力又会以数据的形式转化为大数据的分析能力。

下面介绍一下我们在用户行为特别是人机识别上的一些实践,以下均以Web应用为例说明。

对于Web应用而言,(视情况而定)本身就存在较多敏感信息,比如页面内容、JS源代码、后续链接、表单信息等,它们构成了一个应用的运行逻辑。只要能判断这个逻辑,应用行为就是可以预测的,这也是爬虫、扫描器等工具运作的基本原理。那如果我可以对应用页面的源代码进行混淆或加密,是否能使工具失去作用呢?答案是在一定程度上可以,但这里面临几个问题。

首先,页面中包含各种标签、表单、链接、JS等信息,哪些信息需要混淆需要明确。最重要的是,虽然可以使用算法进行混淆,但是把混淆后的代码还原让浏览器可以解析以保证应用可正常访问则要难得多。正是因为还原混淆代码的难度大,很少有应用采用这种保护方式。

其次,如果算法固定且考虑到性能问题,加密信息和算法可以被逆向还原,稍微做一些定制开发就可以使工具再次自动运行。如果有多种混淆算法,如何决定在某一时刻使用哪种算法?

上述两个问题已经超越了本人能回答的范畴,但可以讲一下我司已经实现的效果:(1)页面的表单、URL、JS代码全部使用专有算法封装,可理解为加密,其余内容不做处理;(2)算法是动态变换的,每次请求譬如刷新页面都会随机使用不同算法,可使用算法数40亿以上;(3)所有封装通过JS实现,用于加密页面的JS本身被混淆且没有逆袭价值;(4)被保护页面具备防止调试和虚拟执行的能力;(5)正常用户通过浏览器进行访问不受任何影响;

根据Distil公司的统计,54%的自动化工具不具备Javascript解析能力,这意味着超过一半的工具将无法使用,无需任何规则即可有效阻拦大量机器,此为人机识别第一步。

虽然商用扫描工具很多都具备JS解析能力,但对于这类机器行为仍有办法识别——动态验证。简单来说,动态验证会校验JS的实际运行环境、获取设备指纹,以及采集客户端行为——例如是否有键盘鼠标操作及在页面停留时间等。通过多维度数据分析可以区分操作的是人还是机器,此为人机识别第二步。

对于提交的表单信息,也可以选择对其进行混淆,即便通过中间人攻击截获了请求,看到的都是乱码,无法窃取信息、无法伪造、无法篡改。由于算法是动态的,同样不担心被逆向或破解。这一步本身不是用于识别工具行为,却可以有效防御借助工具进行的中间人攻击等行为。

动态令牌机制可以作为人机识别的第三步来看,可以有效防止请求重放等非法操作。即便不对页面进行封装,仍然会(根据上一个页面的访问)动态生成每个请求唯一的令牌,存放在Cookie中。保护模式下每个令牌都只能用一次,一旦令牌为空、重复使用、或者被篡改,请求就会被视为无效请求而拦截。

综合以上几个过程,从简单到高级的Burp、爬虫、扫描器、PhantomJS等机器行为都能被有效识别,理论误判概率%0。最重要的是,做这么多事情无须应用改一行哪怕半行代码,客户端无需做任何更改,各大主流及非主流浏览器访问均不受任何影响。

我们使用的方案除了人际识别当然还有更多的能力,这里不做描述,感兴趣的可以联系我。

实际上,如果能在非法请求到达后台之前能够对其进行识别并采取阻断措施,带来的效益除了减缓攻击,还可以节约带宽、服务器资源、过滤大量噪音和垃圾数据。更重要的是,我们使用的是一种全程防护的方式却又很轻量级,变被动为主动,先发制人。

更多信息请见:https://www.riversecurity.com.cn | 私聊

"机器人防火墙":人机识别在应用安全及风控领域的一点实践的更多相关文章

  1. 活动 Web 页面人机识别验证的探索与实践

    在电商行业,线上的营销活动特别多.在移动互联网时代,一般为了活动的快速上线和内容的即时更新,大部分的业务场景仍然通过 Web 页面来承载.但由于 Web 页面天生“环境透明”,相较于移动客户端页面在安 ...

  2. 风险识别系统-大数据智能风控管理平台-企业风控解决方案– 阿里云 https://www.aliyun.com/product/saf

    风险识别系统-大数据智能风控管理平台-企业风控解决方案– 阿里云 https://www.aliyun.com/product/saf

  3. Web前端接入人机识别验证码---腾讯防水墙

    Web前端接入 1. 准备AppID 验证码接入需要先在管理后台中注册获取APPID和APPSECRET,注册步骤请参考 快速开始 2. 快速接入步骤 1.在Head的标签内最后加入以下代码引入验证J ...

  4. 【DDD】领域驱动设计实践 —— 限界上下文识别

    本文从战略层面街上DDD中关于限界上下文的相关知识,并以ECO系统为例子,介绍如何识别上下文.限界上下文(Bounded Context)定义了每个模型的应用范围,在每个Bounded Context ...

  5. 小白日记13:kali渗透测试之服务扫描(三)-SMTB扫描、防火墙识别、负载均衡识别、WAF识别

    SMTP扫描 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式.SMTP协议属于TCP/ ...

  6. 机器人学 —— 机器人感知(Gaussian Model)

    机器人感知是UPNN机器人专项中的最后一门课程,其利用视觉方法来对环境进行感知.与之前提到的机器人视觉不同,机器人感知更侧重于对环境物体的识别与检测.与计算机视觉不同,机器人视觉所识别的物体往往不需要 ...

  7. 如何使用padlepadle 进行意图识别-开篇

    前言 意图识别是通过分类的办法将句子或者我们常说的query分到相应的意图种类.举一个简单的例子,我想听周杰伦的歌,这个query的意图便是属于音乐意图,我想听郭德纲的相声便是属于电台意图.做好了意图 ...

  8. 谷歌开源的TensorFlow Object Detection API视频物体识别系统实现教程

    视频中的物体识别 摘要 物体识别(Object Recognition)在计算机视觉领域里指的是在一张图像或一组视频序列中找到给定的物体.本文主要是利用谷歌开源TensorFlow Object De ...

  9. Ocr答题辅助神器 OcrAnswerer4.x,通过百度OCR识别手机文字,支持屏幕窗口截图和ADB安卓截图,支持四十个直播App,可保存题库

    http://www.cnblogs.com/Charltsing/p/OcrAnswerer.html 联系qq:564955427 最新版为v4.1版,开放一定概率的八窗口体验功能,请截图体验(多 ...

随机推荐

  1. ASP.NET 页面双向静态化

    而我们预期的结果应该如下图,实际只请求两次. 用301重定向可以解决该循环请求产生的问题. OK, let's begin. 本文的Demo和Source是基于上一篇的,如果下面的一些文件或文件夹没有 ...

  2. 谈下spring下的 aop日志记录

    在我们开发当中  我们需要对系统用户行为和 系统异常信息有个统一记录  以便后期的 用户行为分析和bug修复   当我们有这个需求时  我们的通常采取方式很多 1.比如我们定义一个规范 开发一个接口 ...

  3. Fragment加载方式与数据通信

    一.加载方式 1. 静态加载 1.1 加载步骤 (1) 创建fragment:创建自定义Fragment类继承自Fragment类,同时将自定义Fragment类与Fragment视图绑定(将layo ...

  4. [luogu3600]随机数生成器

    题面在这里 题意 给定n个[1-x]的随机整数\(a_1,a_2,a_3,...,a_n\)和q个询问区间\((l_i,r_i)\), 求出\(\max_{i=1}^{q}({\min_{j=l_i} ...

  5. 【NOIP2012】疫情控制(二分,倍增,贪心)

    洛谷上的题目链接,题目不在赘述 题解 既然要时间最短,首先考虑二分. 因此,考虑二分时间,问题转换为如何检查能否到达. 如果一支军队一直向上走,能够到达根节点,那么他可以通过根节点到达其他的节点,因此 ...

  6. [HNOI2015]亚瑟王

    题面在这里 题意 \(n\)张卡按照一定顺序排列,每轮从第\(1\)张开始考虑到最后一张,考虑一张卡时有\(p[i]\)的概率产生\(d[i]\)的贡献,产生贡献时直接退出该轮并在之后的考虑中直接跳过 ...

  7. MongoDB存储引擎(中)——WiredTiger

    上一篇博文介绍了MongoDB的MMAPv1存储引擎,本文接着介绍MongoDB另一个存储引擎--WiredTiger,WiredTiger是在MongoDB3.0版本引入的,并且在MongoDB3. ...

  8. gulp配置

    /* gulp配置 */ /* gulp配置 */ var gulp = require('gulp'), concat = require('gulp-concat'), rename = requ ...

  9. checkBox半选中状态

    checkbox 可以半选中,这个特性,很多浏览器都支持 // 用 input.indeterminate 这个属性来获取或者设置半选中状态,必须要用 js 添加属性,才有效果. input.inde ...

  10. Android开发——设置界面的创建

    前言: 最近忙着搞项目,难得有时间,便来整理搞项目中学习到的知识 使用之前,先介绍一下android这种的五种数据储存方式,分别为文件储存,SharePrefence,SQL,使用ContentPro ...