菜鸟的源代码审计之路

一、前言

源代码审计,顾名思义就是检查源代码中是否存在安全隐患,使用自动化工具以及人工的方式对源代码进行分析检查,发现源代码的这些缺陷引起的漏洞,并提供修复措施和建议。

在开始之前,我们先了解一下MVC设计模式的基本概念:

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写。其中:

Model(模型)一般用于放置对数据库进行存取等操作的代码

View(视图)一般用于放置静态资源如前端代码、css等

Controller(控制器)用于存放接受用户输入和业务逻辑处理的代码。

我们以Java的SpringMVC来举例,SpringBoot项目的三层架构如下:

Model层:包含service层和dao层

Service层用来实现业务逻辑

Dao层的作用是封装对数据库的访问:增删改查,不涉及业务逻辑

Controller层:负责业务模块的流程控制

View层:html、css、js等等

过程如下:


有了这些知识之后,我们就可以大致定位到文件位置了。

二、代码审计的方法

下面我们来介绍三种常用的代码审计的方式:

全文通读敏感函数溯源功能点定向审计

说明从系统入口开始审计,分析所有数据流走向。搜索敏感函数,逆向追踪参数的传递过程,分析参数是否可控。定位敏感功能点,分析其是否存在安全缺陷。

优点能够覆盖所有请求入口,避免了遗漏代码的情况。高效。高效

缺点需要足够的时间与精力对系统整体结构了解不够深入,无法覆盖逻辑漏洞。容易出现审计遗漏的情况。

说明:上述三种方法均为纯人工代码审计的方法,一般情况下我们采用静态源代码扫描工具检测 + 人工验证 + 人工检查相结合的方式

三、审计工具介绍

Fortify:通过内置的五大主要分析引擎:数据流、语义、结构、控制流、配置流等对源代码进行静态分析,分析的过程中与它特有的软件安全漏洞规则集进行全面地匹配、查找。

Checkmax:通过虚拟编译器自动对软件源代码分析,并建立了代码元素及代码元素之间关系的逻辑图。然后对这个内部代码图进行查询,包含已知安全漏洞和质量缺陷问题预先设定好的查询列表。

CodeQL:在 CodeQL 中,代码被视为数据(所以进行扫描前,需要先生成源码对应的数据库文件),安全漏洞则被建模为可以对数据库执行的查询语句。

Semgrep: 是一种快速、开源的静态代码分析工具,它提供了强于grep工具的代码匹配检索能力,并支持两种类型的代码模式匹配。一种是基于AST的匹配,另一种是通用文本匹配。

SonarQubec:是一个用于代码质量管理的开源平台,用于管理源代码的质量。可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具检 测出潜在的缺陷。

Fortify和Checkmax属于纯商业软件,各有优缺点,我们重点介绍剩下三款软件。

四、工具的使用

1、Semgrep:

semgrep是一款基于Facebook开源SAST工具pfff中的sgrep组件开发的开源SAST工具,目前由安全公司r2c统一开发维护。

优点:   支持语言丰富,目前已经支持C#, JSON, Json, Kotlin, Rust, Yaml, c, cs, csharp, generic, go, golang, hack, hacklang, html, java, javascript, js, json, kotlin, kt, lua, ml, none, ocaml, php, py, python, python2, python3, rb, regex, rs, ruby, rust, scala, ts, typescript, vue, yaml

开源扫描规则丰富,由社区共同开发维护的扫描规则超过1000条

规则设置简单,采用yaml配置文件编写,语法简单

扫描速度极快:官方称扫描速度大约是每条规则20K-100K loc/sec

生态良好:支持嵌入到几乎所有CI工具中

支持本地扫描:官方不仅提供了VSCode、IntelliJ IDEA、Vim的相关插件,还支持通过pre-commit的方式在代码提交前进行自动扫描

缺点:

数据流跟踪能力较弱

我们通过两小例子来看下semgrep的使用

查找代码中是否使用MD5

Rule

Test code

Result

不安全的命令执行

Rele:

Test Code:

Result:

通过这两个小例子我们可以看到semgrep的使用非常简单。即使非常复杂的规则也极少有超过100行的规则。

接下来我们来通过一个小例子,来看下semgrep的一些参数的用法:

Rule

Test Code

Result

我们可以看到在匹配模式中,sleep函数中用到了int和float两种模式进行匹配,在结果中也确实只匹配到了第五行和第七行代码。而其他行并没有匹配到。

我们来修改下,将sleep函数的参数通过函数返回值的方式传入,看看是否能够匹配

Rule

跟上面的规则保持不变

Test Code

Result

从结果可以看到仍然是只匹配到了第六行和第八行,而在第九行中,函数a的返回值虽然是一个int类型的值,但是并未匹配到,从而也说明了,semgrep的数据流的追踪能力较弱。

如果我们需要匹配到所有sleep的函数,可以在匹配模式中修改

Relue:

再次对上面的代码进行匹配,则可以看到所有函数都被匹配到了。

Result:


当然在匹配模式中也可以排除掉某些条件,比如我们想匹配所有的sleep的函数,但是通过函数传参的排除掉,则可以修改规则:

Relue:

对上述代码进行匹配,可以看到第九行没有匹配到。

Resul

后续计划

codeql和SonarQube工具的使用

典型案例分析

一个完整的项目分析过程

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,270评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,489评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,630评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,906评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,928评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,718评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,442评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,345评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,802评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,984评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,117评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,810评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,462评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,011评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,139评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,377评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,060评论 2 355

推荐阅读更多精彩内容