静态代码扫描在360项目的实践

2020-02-27 237浏览

  • 1.静态代码扫描在360项目的实践 Qtest - 刘俊
  • 2.目录 • 需求? • 解决方案 • 效果展示
  • 3.需求? 一行代码的故事
  • 4.需求? 老板:不 能出现 放心吧 老板!
  • 5.需求? • • • • • 项目紧张,增加工作量 牵一发动全身,改出问题谁负责 别人写的代码,我不清楚 历史问题 这个事儿优先级不高,以后…
  • 6.需求? 不同的声音 痛点 • • • • • 假设性问题太多 规则无法定制 使用麻烦 报告可读性差 只说问题,没有方案 需求 • • • • • • • 精准 快速 分级 共享 历史查询 易用 白名单
  • 7.解决方案 名称 Lint Checkstyle FindBugs PMD 是否开源 SDK内置工具 开源:http://checkstyle.sourceforge.net/ 功能列表 无效布局,多重嵌套等 未使用的冗余资源文件 数组资源大小不一致 图标缺失、重复、错误尺寸 AndroidManifest.xml中的错误 检查类及方法的 Javadoc 注释 检查命名是否符合命名规范 检查文件是否以某些行开头 检查 Import 语句是否符合定义规范 即检查类、方法等代码块的行数 检查空白符,如 tab,回车符等 修饰符号的检查,如修饰符的定义顺序 检查是否有空块或无效块 检查重复代码,条件判断等问题 Bad practice:常见代码错误 可能导致错误的代码:如空指针引用等 开源: 国际化相关问题:如错误的字符串转换http://findbugs.sourcef可能受到的恶意攻击:如访问权限修饰符的定义等 orge.net/ 多线程的正确性:如多线程编程时常见的同步,线程调度问题。 运行时性能问题:如由变量定义,方法调用导致的代码低效问题。 开源:https://pmd.github.io检查潜在代码错误,如空 try/catch/finally/switch 语句 检查未使用的变量,参数,方法 检查不必要的 if 语句,可被 while 替代的 for 循环 检查重复的代码 检查在循环体内实例化新对象 检查 Connect,Result,Statement 等资源使用之后是否被关闭掉 集成方式 支持语言 优点 命令行 IDE CI java 专注于安卓的特性检测 命令行 IDE CI java 基于sun公司和google推 出的java编程规范来检测, 严谨和完善 命令行 IDE GUI CI java 只关注潜在缺陷和性能问题, 基于LGPL协议,无需运行 就能对代码解析,从 bytecode入手进行检查,对 空指针检测有独到之处 命令行 IDE GUI CI Java, C, C++, C#, PHP, Ruby, Fortran, JavaScript, PLSQL, Apache Velocity, Ruby, Scala, Objective C, Matlab, Python, Go 语言扩展性出色,资源关闭 和回收,循环创建对象等问 题也是开发人员比较关注的 问题
  • 8.解决方案 工具名称: 火 线(FireLine) 核心规则:奇虎Android开发安全SDL(信息安全部门支持) 应用场景:静态代码扫描 (缺陷模式匹配+字节码解析) 运行方式:GUI、Command、Service 官网地址:magic.360.cn
  • 9.火线的结构 虚拟机集群 入口 获取代码(Git/SVN) 过滤器 GUI 封装 报告 聚合 邮件 规则 配置 内置 过滤 器 启动引擎 自定义规 则A 自定义规 则B 引 擎 。。。 自定义规 则N
  • 10.解决方案 火线得到公司流程的保障
  • 11.解决方案 火线的检查类型
  • 12.解决方案 类型 基础规则 日志类规则 安全类规则 内存管理类 性能优化类 其他类型 稳定性规则 UI性能规则 耗电类规则 常见问题 1. 2. 3. 4. 5. 6. 错位的空判断:if (!string.equals("") && string!=null) 破坏空判断:if (string!=null !string.equals("")) 避免使用 IP硬编码 应该在方法开始处调用super方法 硬编码SDCard路径 资源对象没有在finally中关闭 … 1. 2. 3. 日志敏感信息输出 日志函数中进行变量赋值或调用方法 日志输出没有包裹在DEBUG开关中 1. 2. 3. 4. 5. WebView未禁止访问本地文件系统 敏感信息安全 Android组件安全 SQL注入 目录遍历漏洞 … 1. 2. 3. 4. IO流关闭 Cursor关闭 Bitmap释放 资源对象关闭:Connection,Statement,和ResultSet对象 …
  • 13.解决方案 截止到5月11日火线的数据: 数据指标 工具累计运行天数 累计执行任务次数 已覆盖的项目数 已扫描代码总行数 已扫描总文件数 单个项目平均扫描时间 每千行代码扫描时间 已使用工具的开发人员数量 本周数据 150天 6597次 329个任务 约1.7亿行 约47万个 31.58秒 0.459秒 137位用户
  • 14.解决方案 目前扫描项目: 360手机卫士 360手机助手 360手机浏览器 360游戏大厅 360云盘 360桌面 360 Security 360智能摄像机 360免费WiFi 路由器卫士 360行车记录仪 360商城 手心输入法 360搜索
  • 15.解决方案 数据中心的特征:
  • 16.解决方案 去重后数据显示,项目总的block数量从最高时候的390降低到133,减少了 66%,整体代码质量呈上升趋势!
  • 17.效果展示 代码展示(部分代码改编自公司无线产品项目源码) 扫描结果准确性: 问题 SQL注入检测 IP硬编码 空指针 变量定义未使用 多余的if语句 对象比较用== Stream流没有正常关闭 Stream流没有在finally块中关闭 日志输出了敏感信息 FindBugs Lint PMD √ √ √ √ √ √ √ 火线 √ √ √ √ √ √ √ √ √ 日志输出没有开关项控制 √ I/O对象未关闭 空的 try/catch/finally 块 Sdcard硬编码 Cursor对象关闭 目录遍历漏洞检测 问题命中率 √ √ √ √ √ 100% √ √ √ 26.66% 6.66% 33.33% 缺陷总计 FindBugs:36个 Lint:5个 PMD:331个 火线:33个
  • 18.效果展示 测试报告的可读性 FindBugs报告
  • 19.效果展示 Lint报告 PMD报告
  • 20.效果展示 火线报告 分类 显示 模糊 查询
  • 21.效果展示 合适你的才是最好的
  • 22.谢 谢!