安全运维工作中的机器学习应用(3) 老男孩网络安全

    /    2019-09-09

WAF漏报问题优化

背景介绍

前段时间在护网行动发现, WAF(Web Application Firewall)基本已经成为各个公司的标配了。我们都知道WAF确实能帮助我们拦截很多Web应用攻击,作为运维人员,都会面对一个触及灵魂的问题:如何评估WAF的拦截效果?漏报率怎么样,误报率怎么样?

我想想大部分运维人员都会有自己的测试工具,包含搜集的一些特定的攻击测试样例,定期做一些评估测试,如:



通常情况下,有基础的测试用例和持续的运营,误报我们比较容易发现和及时处理。但是漏报的问题大家很难评估,尽管我们已经梳理了各种攻击和漏洞利用的场景。



但是在复杂的互联网环境和云环境,如果我们仔细分析日志,还是会发现有不少漏过的情况。

正如我们前面提到的,除了Payload搜集和简单关键字提取外,常见的做法就是可疑请求打标。简单来讲就是将所有已经拦截过的请求的IP,在一定时间需求内的请求都打上可疑的标签,当然IP维度还可以包含一些威胁情报的扫描IP,或者是全量日志直接分析。

这里,我们的目的就是从这些可疑或者全量日志中,提取出特定的攻击日志,以降低我们的人工分析量。

具体实例——XSS攻击日志挖掘

很多时候我们想提升我们WAF的拦截效果,降低漏报,就需要对日志进行分析和攻击行为提取,并转换为拦截规则。

前面我们已经讲了使用K-Means可以帮助我们进行分类的方法,这里我们换一个思路,我们针对XSS这个类型的漏报日志进行提取。

算法实践

样本搜集

在WAF的运维期间,已经搜集了很多XSS攻击的Payload和日志,这里我们再整理一些正常的请求日志。

这样我们就已经有了正样本和负样本,可以尝试通过监督度学习,从请求日志中挖掘我们的漏网之鱼。

特征提取

因为需要发现XSS攻击,所以我们首先需要简单地梳理一下XSS Payload的特征,XSS攻击通常如下:

很可能包含一些HTML标签或者事件属性,比如html标签 , 等;

可能包含一些探测关键字/函数,比如 xss, alert(1), document.cookie等;

通常情况下,如果黑客进行利用需要引入三方js,需要注意短链接等;

通常情况下,在js中需要连接字符,比如注释后面//, 比如连接可执行js代码 ;, -,+, /,*, ^, &等;

去掉闭合支付之后,是一些可解析执行的js语句或者html语句。

从安全工程师的角度去分析,我们能发现很多特征,但是这里我们需要学习如何把这些特征转换为机器能够识别的特征。

作为文本特征的提取,首先是分词,然后对分词的特征进行处理。再想办法把这些特征进行处理,让他们变成机器能识别的特征向量。比较简单的特征提取方式就是直接针对敏感字符/关键字的个数进行统计和分析,这个更符合统计学的思路,感兴趣的朋友可以参考《Web安全之机器学习入门》。

这里我们尝试另一种思路,选择嵌入式词向量(Word embedding),嵌入式词向量就是通过学习文本来用词向量表征词的语义信息,通过将词嵌入空间使得语义相似的词在空间内的距离接近。

因为XSS攻击通常执行的是HTML/JavaScript脚本,是具有一些语义的关联。这里我们可以使用嵌入式词向量模型,建立一个XSS的语义模型,让机器能够理解< script>、alert()这样的语言,这样看起来更符合人类分析的模式。

首先我们进行分词:



然后取正样例中出现次数最多的300个词,构成词汇表(其他词统一用特定的字符如“NSRC”替代),使用gensim模块的word2vec类处理。

我们可以看看XSS Payload的部分分词情况:



分类完成,挖掘XSS攻击

同样的,我们把正常样本也进行类似的处理,然后这里我们使用支持向量机(Support Vector Machines, SVM)算法进行识别。SVM比较适合二分类问题,即我们所说的好/坏的情况。



SVM是一种监督学习算法,在学习复杂的非线性方程时,能够提供一种更为清晰和更加强大的方式。之前很多有使用SVM进行图片验证码识别,识别的效果也是挺不错的。

而在python中,我们通过直接引入sklearn的svm算法实现即可直接调用:



通过已有的数据测试,SVM数据的准确率基本上是98%,召回率是97%。

这时候我们就开始对日志进行分析,通过SVM的训练模型进行查找,确实发现了很多我们之前没有发现的情况。

对发现的日志进行人工分析,有些场景的误报比较多,特别是参数值包含http请求的情况,这个和我们之前提取的特征有密切关系。


这里我们通过其他维度分析出的日志对比可以发现,目前我们使用Word2vec+SVM的算法还是存在一些漏报的情况:



后续

通过前面的机器学习算法,帮助我们顺利从日志中发现了更多的XSS攻击,虽然还存在一些漏报和误报的情况,但是已经比之前的一些简单的规则好了很多。

SVM算法的实现比较简单,而且性能资源消耗低,不过缺点可能是泛化能力相对较弱,发现问题有限,并不是特别的“智能”,这点通过我们分析的SVM漏报结果就可以发现。

感兴趣的朋友可以考虑一下特征优化和尝试下其他的算法。

总结

随着数据的爆发和算力性价比的提升,相信未来机器学习会越来越普及。我们完全把算法看作一个高级工具(并没有去讲解算法本身的复杂原理),来提升安全运维工作的价值。在现实中,上述的技术已经作为基础,应用到网易易盾内部用户行为分析和对外的售卖的WAF产品中。

建议

了解机器学习,尝试通过机器学习的视角去了解和解决问题,把机器学习的各种算法当作一个解决问题的工具,就像木工使用锤子一样,先用起来,再慢慢去了解其原理。

在尝试机器学习算法时要考虑几个条件:

数据量是否较大;

样本是否足够;

安全工程师判断成本(是否直观):比如违禁图片的标签是很容易判断的,而人机识别提取的行为数据是运营很难直接判断的,所以后者的成本远比违禁图片识别高。

另外,在运维环节可以多尝试机器学习的算法和模型(离线),不建议在线上落地。线上落地需要比较专业的工程化和机器学习团队来处理,涉及到成本、效果保证、执行效率、处理结果的相关性以及回放数据对比等一些列因素;


*本文作者:wangyiyunyidun,转转载须注明来自FreeBuf.COM


(2)

分享至

正版马会精选资料大全 平南县| 兴宁市| 江北区| 漳浦县| 朝阳县| 石家庄市| 兰州市| 中西区| 澜沧| 改则县| 丹寨县| 汝城县| 五河县| 连云港市| 马尔康县| 景泰县| 衡南县| 定安县| 朔州市| 玉树县| 化隆| 泰兴市| 微山县| 上栗县| 南开区| 双柏县| 图木舒克市| 环江| 沐川县| 平遥县| 新干县| 林芝县| 甘洛县| 永靖县| 江陵县| 英吉沙县| 抚宁县| 吉木萨尔县| 绥宁县| 陇西县| 饶河县| 崇文区| 新丰县| 安康市| 开平市| 瑞安市| 龙井市| 高要市| 炎陵县| 临猗县| 洛扎县| 丹巴县| 扶沟县| 福州市| 辽阳县| 开原市| 高密市| 疏勒县| 闽侯县| 雷山县| 龙里县| 平乐县| 五莲县| 公主岭市| 天全县| 奉贤区| 巴林左旗| 宿迁市| 金塔县| 禹州市| 灵丘县| 师宗县| 石狮市| 井陉县| 林甸县| 吴江市| 磐石市| 鹿泉市| 通辽市| 灌阳县| 进贤县| 元朗区| 乐陵市| 苗栗县| 龙游县| 梁河县| 塔城市| 公主岭市| 固原市| 长岛县| 义乌市| 寻甸| 东阿县| 徐州市| 尉犁县| 砀山县| 宝鸡市| 盘锦市| 井研县| 盘锦市| 新建县| 胶州市| 格尔木市| 澄江县| 青河县| 木兰县| 甘孜| 原平市| 灯塔市| 和硕县| 龙岩市| 花莲县| 阜宁县| 娄底市| 凌云县| 会泽县| 乌鲁木齐县| 土默特右旗| 枣庄市| 获嘉县| 枣庄市| 保德县| 江津市| 双辽市| 苗栗市| 韶山市| 临洮县| 牙克石市| 旬邑县| 读书| 余江县| 华池县| 萨嘎县| 仪陇县| 卢氏县| 枣庄市| 交口县| 小金县| 从化市| 庆元县| 陆良县| 东城区| 西峡县| 岐山县| 沽源县| 清流县| 永嘉县| 宁海县| 嘉兴市| 永和县| 广丰县| 汾阳市| 长宁县| 鄂托克旗| 陈巴尔虎旗| 呼图壁县| 正镶白旗| 皮山县| 九江市| 金阳县| 屏东县| 泊头市| 永寿县| 甘洛县| 雅江县| 双峰县| 平度市| 哈尔滨市| 沂源县| 朔州市| 合阳县| 昔阳县| 南阳市| 宜章县| 大荔县| 时尚| 乐平市| 温州市| 静乐县| 阿克陶县| 易门县| 株洲市| 方正县| 工布江达县| 南华县| 芜湖市| 阳江市| 南川市| 泽州县| 鄱阳县| 赤水市| 德格县| 秀山| 舞钢市| 始兴县| 平原县| 徐州市| 古浪县| 宜阳县| 安多县| 博客| 清水县| 南昌市| 蒙自县| 锡林郭勒盟| 湘乡市| 墨脱县| 中西区| 台北市| 灵川县| 兴宁市| 涟水县| 繁峙县| 壤塘县| 柳林县| 简阳市| 汉川市| 友谊县| 潜江市| 股票| 德江县| 沁水县| 嘉善县| 青浦区| 南涧| 乐至县| 栾川县| 德清县| 新河县| 澳门| 双辽市| 贵定县| 灵寿县| 凤翔县| 宁陵县| 格尔木市| 伊宁县| 漯河市| 山阳县| 平谷区| 山西省| 城步| 孝昌县| 新宁县| 马山县| 太湖县| 历史| 宣武区| 全州县| 星座| 沈阳市| 巧家县| 淮南市| 祥云县| 托克托县| 吉木萨尔县| 昔阳县| 米林县| 信阳市| 台前县| 多伦县| 贡觉县| 德庆县| 白城市| 云和县| 安宁市| 敖汉旗| 双鸭山市| 元氏县| 长治县| 甘孜| 乐陵市| 旌德县| 保定市| 伊宁市| 镇远县| 松阳县| 育儿| 海伦市| 东兰县| 白水县| 尚义县| 凤庆县| 海伦市| 莱州市| 辰溪县| 资溪县| 莱西市| 尚志市| 久治县| 织金县| 平邑县| 中西区| 桦南县| 盐亭县| 东莞市| 洛阳市| 永德县| 宜良县| 崇明县| 通化市| 上虞市| 弋阳县| 临湘市| 融水| 永仁县| 历史| 江门市| 嘉善县| 雷山县| 呼和浩特市| 拜城县| 梧州市| 普洱| 年辖:市辖区| 永泰县| 平原县| 洪江市| 永城市| 大邑县| 海南省| 夏邑县| 张家界市| 松江区| 九寨沟县| 宝清县| 柳州市| 龙陵县| 九台市| 荣成市| 承德县| 尚义县| 淮阳县| 建昌县| 白水县| 商城县| 长岛县| 波密县| 庆元县| 桓仁| 佳木斯市| 双峰县| 广西| 英超| 岗巴县| 五台县| 偃师市| 新蔡县| 个旧市| 电白县| 东阳市| 昌黎县| 正宁县| 神农架林区| 吉林市| 绥阳县| 霞浦县| 聂荣县| 肥乡县| 微博| 大埔区| 黄骅市| 乡宁县| 林甸县| 海林市| 扎兰屯市| 西吉县| 班玛县| 新田县| 稷山县| 岳阳县| 玛纳斯县| 台安县| 郧西县| 白玉县| 张北县| 泰顺县| 新乡市| 望谟县| 桂东县| 汝城县| 万年县| 乌海市| 墨江| 顺昌县| 饶阳县| 林州市| 六枝特区| 西乌珠穆沁旗| 驻马店市| 金昌市| 增城市| 潼南县| 遂溪县| 长岛县| 文成县| 香河县| 久治县| 平原县| 榆树市| 县级市| 博兴县| 喀喇| 藁城市| 江北区| 温州市| 凯里市| 竹北市| 巴林右旗| 句容市| 永丰县| 商城县| 沭阳县| 阳城县| 怀柔区| 陆川县| 彭山县| 桦南县| 雅安市| 沁源县| 衡南县| 那坡县| 马边| 陕西省| 香河县| 巴彦淖尔市| 新宁县| 昭觉县| 宣威市| 闽侯县| 桐城市| 石景山区| 灵台县| 常山县| 长武县| 松江区| 巧家县| 东乌珠穆沁旗| 当阳市| 崇阳县| 清远市| 盐边县| 宝兴县| 平塘县| 胶南市| 临西县| 白朗县| 合川市| 永宁县| 慈利县| 靖边县| 辽阳县| 霍山县| 鄢陵县| 田林县| 瓮安县| 雷山县| 北流市| 应城市| 东阿县| 庐江县| 扎兰屯市| 策勒县| 河源市| 田东县| 南安市| 孟村| 集安市| 团风县| 隆子县| 维西| 镇安县| 观塘区| 满城县| 平陆县| 舒兰市| 河北省| 尖扎县| 神农架林区| 惠东县| 娄烦县| 五莲县| 娱乐| 郎溪县| 花莲县| 永年县| 安徽省| 三亚市| 贵州省| 汶川县| 花垣县| 壤塘县| 凌云县| 光泽县| 高平市| 剑川县| 邵武市| 武清区| 盐源县| 合水县| 图们市| 白沙| 车险| 河西区| 交城县| 福清市| 兖州市| 垫江县| 射阳县| 额敏县| http://m.gz1980challengec.fun http://m.yqo6j0rl8v.fun http://wap.gz1980killc.fun http://wap.bo2020disks.fun http://wap.yqo1j2rl7v.fun http://m.gz1980fuckc.fun http://www.bo2020drives.fun http://wap.bo2020peaks.fun http://wap.yqo1j9rl7v.fun http://www.gz1980patternc.fun http://www.bo2020bells.fun http://m.bo2020shapes.fun http://www.yqo5j8rl1v.fun http://wap.yqo9j2rl8v.fun http://www.gz1980tripc.fun