1、汪昱汪昱快手高级安全工程师Security By Default:MyBatis框架下SQL注入解决方案提纲 背景与现状 初阶安全实践 最佳安全实践:Security By Default闲话 据“非官方”甲方安全数据统计,SQL注入仍然占据不少公司高危安全漏洞Top 3之列,在SQL注入中,order by注入比例最高 0202年都要结束了,为什么SQL注入还是痛点问题之一?RD有犯错的机会MyBatis简介 MyBatis是一款在国内外使用度很高的ORM框架 京东、阿里、美团等以Java为业务主要开发语言的公司均有使用 MyBatis框架下,SQL注入漏洞依旧时常发生MyBatis框架下的
2、SQL注入 众所周知,SQL拼接是SQL注入的罪魁祸首 众所周知,预编译是SQL注入的安全编码方案 众所周知,MyBatis下的SQL动态传参有2种方法:#param是预编译方式$param是直接拼接方式#param不是万能的 MyBatis层order by、group by等地方不能使用#param方式进行预编译,只能使用$param直接拼接 MyBatis给了安全提示,但是也给了RD犯错的机会 Tips from MyBatisNOTE Its not safe to accept input from a user and supply it to a statement unmodi
3、fied in this way.This leads to potential SQL Injection attacks and therefore you should either disallow user input in these fields,or always perform your own escapes and checks.插播甲方代码安全管控 大多数漏洞,任何静态分析技术都不能(接近)零误报零漏报地自动化检测 举个栗子:order by$param拼接了参数,但是在Controller层限制了仅接受“column1”,“column2”的用户输入 将漏洞检测转化成
4、“合理的”规范检测是大型甲方常用“套路”(褒)语法树分析静态污点分析正则提纲 背景与现状 初阶安全实践 最佳安全实践:Security By Default回归MyBatis下的SQL注入“合理的”的安全编码规范?MyBatis下,能用#方式的一律不许用$方式拼接?类似order by、group by这些不能用#的,必须在业务层校验输入解决可以用#传参的SQL注入这种“教育为主”的规范,安全部门无法知道RD到底有没有正确对不能使用#地方进行输入限制 限制污点净化“污点净化”是白盒检测的难点初阶安全实践业务自行限制(污点净化差异性)Mapper处限制(污点净化标准化)初阶安全实践 MyBati
5、s Generator(MBG)是用于自动生成MyBatis Mapper文件的工具,可以有效提高研发效率,使用范围很广 MBG自动生成的Mapper存在使用$直接拼接参数的情况MBG生成的Mapper order by处存在$Example_Where_Clause和Update_By_Example_Where_Clause处存在$MBG生成的Mapper order by处存在$Example_Where_Clause和Update_By_Example_Where_Clause处存在$提纲 背景与现状 初阶安全实践 最佳安全实践:Security By Default问题聚焦 在初阶解
6、决方案中,如果业务手写Mapper,CI/CD已经完成卡点检测(量小反弹小)问题聚焦在使用MBG生成Mapper的安全问题Example_Where_Clause场景$风险分析 操作condition的API全部是protected作用域RD不会使用此API,因此不会有外部可控参数导致SQL注入order by场景$风险分析org/mybatis/generator/codegen/mybatis3/xmlmapper/elements/SelectByExampleWithBLOBsElementGenerato