基于TADK的SQLI检测
根据开放web应用安全项目(OWASP)的统计,SQL注入(SQL injection, SQLI) 是web应用程序排名第一的威胁。攻击者通过将恶意SQL查询插入用户输入框来从后端数据库窃取关键信息从而危害web应用程序。传统检测SQLI是利用黑名单过滤机制,使用正则表达式将某些关键字列入黑名单或非法语句。
但这种方法只能检测到已知的攻击,对新的攻击没有效果。此外,规则库的维护和更新也需要专业的知识,门槛相对较高。并且通常情况下用户需要花费一定的费用来获得商业版的规则库。近年来,基于机器学习的检测方法逐渐流行起来,但是对于切词(tokenization),特征提取 (feature extraction) 还没有比较高效的解决方案。
再加上业界一般多采用较为复杂的神经网络来训练模型,导致推理速度难以达到实际部署的要求。目前,比较主流的SQLI检测产品比如Modsecurity都是基于Libinjection库实现的。Libinjection定义了SQLI的28个token 类型,如图1所示。
Libinjection将输入的数据依据图1的定义逐个字符进行分析转换,之后就会得到SQLI的识别特征,或者说指纹 (fingerprint),然后通过二分查找算法,在特征库中进行匹配,匹配到则报SQLI攻击。为了降低特征库的规模以提升二分查找的效率,Libinjection会对原始生成的fingerprint进行压缩,最终库的规模维持在8000+条fingerprint。整个处理流程如图2所示。
图1. Libinjection定义的SQLI token 类型
图2. Libinjection 的SQLI检测流程
Libinjection的分词器 (tokenizer) 采用了很多分支判断,因而CPU的执行效率很低。Intel推出的高性能流量分析开发套件 (Traffic Analytic Development Kit, TADK) 的词法分析库Lexical Parser (LP) 对此进行了优化,提出了基于确定有穷自动机 (DFA) 的tokenizer。
图3 描述了LP切词的整个流程。开发人员基于SQL语法解析过程 (branch based) 定义了一套新的语法并形成Profile文件。其语法可简单的描述为定义不同的状态 (普通状态或带有输出token的状态) 及在当前状态下输入任意字符跳转的下一个状态。
利用DFA Compiler (TADK 提供的Profile 解析器) 生成如图4所示的DFA 状态转移表。该状态转移表描述了在每一个当前状态下输入任意字符的状态转移行为。
如图5所示的DFA engine基于此状态转移表可以快速的获得输出token序列。
图3. TADK LP的tokenizer
图4. SQLI 的DFA状态转移表
图5. SQLI的DFA engine
输出的token 序列包含了不同类型的token在原始输入SQL查询语句中出现的次数及位置。为了方便将token序列转化成特征向量,我们将token 从字符类型映射成数值类型。no1&1o1转化为: [7,11,8,12,8,11,8]。
特征计算的方法可以简单描述为给定一个滑动窗口,在该窗口内,累加每个token数值与其他token数值之间的距离乘以相应的权重得到该token数值的特征值。TADK 的特征提取 (Feature Extraction) 模块利用AVX512进行优化,取得了非常优秀的计算性能。经过特征提取得到最终的特征向量为: [0,0,0,0,0,0 0,100,436,0,0,250,160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]。
TADK提供了训练好的SQLI 检测的参考模型——基于Intel oneDAL 的随机森林模型 (Random Forest, RF model) 。该模型是个二分类模型,class 0表示正常的SQL查询语句; class 1表示SQLI攻击。
由于只有28个特征(经过特征选择后更少) ,构建小规模 (比如只需要16棵决策树,树的深度为10) 的RF 模型即可获得较高的精确度。由于该RF模型相对神经网络来说非常简单,再利用oneDAL提供的优化加速,因而能获得超过3个数量级的性能提升。TADK提供的SQLI 检测流程如图6所示。经过Benchmarking测试,TADK的SQLI方案相较Libinjection具备高检出率,低误报率和低延迟的优势。该结果也表明TADK的方案有着较高的实际部署价值。
图6. TADK 的SQLI检测流程
TADK 21.08 发布包提供了SQLI检测的应用代码 (sqli_detection) 及参考模型, 用户可以快速测试sqli_detection的效果。步骤如下 (Linux 平台) :
>> sh tadk_v21.08.sh
>> cd tadk_v21.08/
>> make
>> ./build-root/install-root/bin/sqli_detection -I “id = 1 AND 1 = 1”
>>
结果表示模型以0.84的概率判定 “id = 1 AND 1 = 1” 是SQLI攻击,符合预期。此外,TADK也提供了将该SQLI检测方法集成到Modsecurity的patch。图7演示了Nginx+Modsecurity搭建的WAF效果图。
图7. 基于TADK 的WAF实现图
转载须知
DPDK与SPDK开源社区
公众号文章转载声明
推荐阅读
SPDK动态负载均衡
2021美国峰会系列二 | SPDK与云原生
基于英特尔平台的三星5G核心网高性能UPF 305 Gbps解决方案
SPDK 负载均衡初探
基于DPDK的设备虚拟化框架
点点“赞”和“在看”,给我充点儿电吧~