登陆

极彩娱乐手机板-甲方代码审计之道与术

admin 2020-02-14 272人围观 ,发现0个评论

作者介绍

林伟壕,腾讯高档工程师,专心于企业SDL、SecDevOps建造。现在从事安全危险点评与代码审计,曾在国内大型电信运营商与顶尖游戏公司从事运维、安全体系建造作业。

注:本文系作者原创投稿,未经dbaplus社群及作者答应,不得私行转载。

布景

1、势在必行

缝隙攻防历来都是不对等的,这句话曾被用来描述防卫方防卫的是整个面,而进犯方只需求打破单个点即可侵入。但在缝隙攻防上,防卫方也有进犯方无法具有的优势:他们具有代码。

比较黑盒测验,代码审计有从代码完结逻辑的本源去发掘缝隙的天然优势;比较教条式的修正指引,代码审计也能够从代码完结逻辑上为缝隙修正提出更有针对性、可行性的计划,乃至能够在此根底上演化出安全开发组件、结构。

在SDLC和DevSecOps大行其道的今日,代码审计已经成为甲方打开深度防护、安全融入事务的必经之路。在此大布景下,甲方推行代码审计势在必行。

别的,需求留意,本文所述代码审计,包括自动化代码缝隙扫描以及人工代码审计两部分。

2、与缝隙发掘的差异

1)对危险项的重视

与缝隙发掘不同,代码审计还会对无法构成缝隙的危险项进行盯梢,或要求或主张事务进行修正,特别是在着重纵深防护的企业安全建造思路之下,尤为留意。

2)对软件供应链的重视

代码审计还重视运用程序或许开发组件依靠安全性,比方npm包是否存在CVE缝隙、pip源是否安全。

3、甲方代码审计与白帽子代码审事计的差异

1)方针与初衷导致掩盖规划、运用办法不同

掩盖面:不只在于发掘缝隙、也在于危险发现,不只在于供给加固定见、更在于整理研制体系为编码标准的制定与安全开发组件建造供给数据支撑,不只在于人工、更在于自动化体系建造,此外甲方代码审计着重完好掩盖面,而白帽子或许仅仅重视单个点,只需打破一个点即可侵略。

2)审计的代码不同

甲方一般审计的是自研代码,而白帽子一般审计的是开源代码,两者在事务逻辑杂乱度、编码可读性差异较大。

流程

代码审计是SDLC、DevSecOps的编码完结阶段需求做的事,别离对应到SDLC中的Implement/Verification阶段和DevSecOps的Development/Build/Test阶段,其间自动化代码缝隙扫描能够在开发与编码构建阶段完结,人工代码审计可在事务测验阶段同步打开,前者作为一切事务上线前必经阶段,后者可先从新增事务、高危事务、重要事务下手逐渐打开,究竟关于甲方巨大的事务代码而言,人工审计所能掩盖的规划一直有限。

办法论

下文开端介绍甲方代码审计之“道”部分,所谓“道”,便是办法论,这一部分包括代码审计的痛点、处理痛点的全体思路以及一些审计技巧。

1、痛点

甲方,特别是大型电信运营商、金融机构、互联网公司,其事务规划巨大,随之而来的是代码与事务架构高度杂乱的问题,尽管市道上有不少SAST(Staic Application Security Tool,静态运用程序安全东西)可进行代码缝隙扫描,但其准确性、误报率难以满意希望,再加上人工审计履行人熟练程度的不同、判别标准的不同,也会引起落地上的一系列困难。

1)代码与架构杂乱

  • 十万、几百万行代码、一个事务分几十个模块几十个代码库房粗茶淡饭;

  • 开发言语多种多样,各种自研结构、盛行结构目不暇接、架构还十分杂乱。

以上两个问题对审计人员、SAST东西来说无疑都是很大的应战。

2)东西准召率

  • 正文文本框没有东西是所谓银弹,官方规矩、插件准召率很低,需求依据开发言语、编码风格自界说;

  • 东西对逻辑缝隙的无力,与事务逻辑缝隙许多曝光的缝隙态势之间的对立;

  • 东极彩娱乐手机板-甲方代码审计之道与术西、体系的运营也需求专门人力投入,然后不断进步东西的准召率。

3)心态

  • 审计新手一致会犯的一个过错便是会判别这段代码是否依照自己的思路去完结。可是却忘记了一道数学题或许有多个解法,特别是在没有一致的编码标准或许最佳实践被咱们认可之前,若不恪守这个规矩,审计起来会遇到许多费事;

  • 审计人员出于KPI的考虑,想着已然花了很长时刻做了代码审计,为了体现作业量就有必要说点什么,假如体系原本没有问题却在那挑刺,开发者会愈加不信任你;

  • 关于甲方代码审计人员,审计使命多、代码巨大是常态,假如不考虑成果的只进步速度,这种办法会遗漏掉细节,导致不能全面的检查;

  • 以为高档程序员编写的代码时没有什么问题的,可是马失前蹄姑且存在,更何况在巨大的开发压力下,怎样能确保高档开发人员就不会犯一些安全编码的过错呢?或许不相信新手编写的的代码,其实只需新手有了对代码的安全意识和杰出的编码习气,也不必定写的代码就有很大的问题。总而言之,需求对开发者天公地道。

2、全体思路

下文将从自动手动结合、是非盒结合、正反向盯梢、动态结合、过往与当下结合、checklist与安全编码标准结合、通读与走读结合等7种办法下手,介绍怎样更好打开代码审计。

1)自动手动结合

代码扫描东西->ast/正则表达式->复核

ast

词法剖析->语法剖析->(语义剖析->中心代码)->AST

依照预订的规矩合并成一个个的标识tokens。一起,它会移除空白符、注释等。最终,整个代码将被切割进一个tokens列表(或许说一维数组)。将词法剖分出来的数组转化成树形的表达形式。一起,验证语法,语法假如有错的话,抛出语法过错。解析器会删去一些没必要的标识tokens(比方不完好的括号),因而AST不是100%与源码匹配的,解析器100%掩盖一切代码结构生成树叫做CST(详细语法树)。

以下介绍一些干流web开发言语的ast parser:

  • 在线parser;

  • php-parsesr;

  • python-parser;

  • go-parser;

  • js-parser;

  • java-parser。

结合开源、商业sast东西进行缝隙和危险扫描输出开端检测陈述,然后人工复核准确性,不断优化sast扫描规矩,一起进步缝隙发掘速度。

2)是非盒结合

黑盒求掩盖->白盒求要点

经过黑盒来悉数掩盖一切事务cgi,一起经过白盒测验掩盖重要事务cgi,黑盒快速验证、白盒发掘根因或许研讨绕过战略,然后完结完结功率与重要性的平衡。别的,这儿主张运用被迫扫描器进行快速流量回放,完结流量收集与缝隙测验的同步履行,大大进步测验功率。一起也主张将cgi与功用整理出来,否则白盒审计在了解事务和代码逻辑上的本钱会十分高。

3)正反向盯梢

①正向:变量->函数/灵敏操作->输出

$_GET->$param->eval($param)->return $param

从参数接纳进口开端盯梢数据流,是一种正向追寻的思路。长处是便利了解程序全体结构,相对简略定位逻辑缝隙。可是在代码量较大、代码结构化不强的状况下人工审计本钱很高,ROI或许不明显,这种状况下结合SAST东西进行审计作用会更好。

②反向:函数/灵敏操作回溯->输出

eval($param)->$param->$GET->return $param

依据灵敏要害字来回溯传入的参数,是一种逆向追寻的思路。长处是仅需求查找相应灵敏要害字,就能够快速发掘缝隙,可定向发掘,高效,高质量,但也由于没有通读代码,对程序全体结构不熟悉,定位时会花费时刻,逻辑缝隙发掘较为困难。同理,这种状况下也需求结合SAST东西来做,由于SAST东西对灵敏函数的操控流盯梢作用较好,便利人工后续回溯变量。

4)动态结合

①静态审计

经过静态剖析源码,发现源码中的逻辑、数据处理、函数运用不当来承认源码中或许存在的缝隙。能够经过规矩匹配和代码解析法打开,不过这块能够交给SAST东西去做。

  • 规矩匹配

经过编写正则表达式匹配开发言语或许开发结构的默许变量与高危函数进行匹配,比方php的默许变量$GET、$POST,高危函数eval、exec等。

  • 代码解析法

经过解析代码的语法,剖分出代码履行流程,这块假如选用自动化手法便归于前文所说AST,所以说不同思路之间也有相通之处。

②动态审计

经过运转需求审计的代码,结合运用断点调试的办法盯梢数据的流转来判别体系中是否存在缝隙。这块能够交给DAST或许IAST东西去做。留意一开端只需求重视咱们关怀的缝隙类型:高危文件、高危函数以及惯例Web缝隙。

5)过往与当下结合

  • 是否选用存在缝隙的结构版别;

  • 是否出自同一个存在不良编码习气或安全意识单薄的开发者之手;

  • 是否呈现过缝隙,或许没彻底修正或许其他事务有相似的问题;

  • 这个功用、模块、类、函数呈现的缝隙是否或许呈现在其他功用模块、类函数。

6)checklist与安全编码标准结合

整理常见缝隙场景、常见缝隙类型、常见功用安全编码模板,比照完结办法,编码标准能够参阅《OWASP安全编码标准》,相关checklist能够下一部分的内容。

7)通读与走读结合

相似英语阅览文章的阅览技巧,先粗略读一遍,再依据缝隙类型与事务场景跳着读。

  • 首要要看程序的大体代码结构

如主目录有哪些文件,模块目录有哪些文件,插件目录有哪些文件,除了重视有哪些文件,还要留意文件的巨细、创立时刻。检查版别办理历史记录,大约了解整套代码更新迭代进程。

  • 重视结构文件、中心功用

函数集文件(公共库类函数)、装备文件(看单引号、双引号,看大局合作或许路由)、安全过滤文件(防护代码)、index文件(进口文件),也看身份认证、权限操控、数据库操作、文件上传之类的中心功用完结逻辑。

3、掩盖

结合上面谈到的全体思路,下文将介绍在事务中详细落地代码审计的三大重要模块,事务根底信息、代码逻辑是根底,渠道化手法是助推器,流程标准化是要害。

1)依靠代码库房和事务根底信息

  • 安全财物办理 进行代码审计前有必要有完善的财物大盘,了解事务、责任人、安排架构的对应联系,这样才能在清晰安全态势的根底上挑选代码审计的目标、优先级、办法、手法;

  • 代码获取 清晰审计目标后,需求经过财物大盘找到开发团队,经过代码库房的权限恳求流程获取代码;

  • 架构、cgi接口、事务逻辑 审计前需求了解事务架构来开端点评审计规划,了解cgi接口和事务逻辑可加速审计速度,快速定位缝隙和危险。

2)渠道化建造

甲方事务的杂乱性决议了代码审计有必要走渠道化建造路途,经过将SAST东西与CI体系打通,完结自动化缝隙扫描,在发现缝隙后可自动创立缝隙工单,并依照已有的审计流程进行复核以及打开人工审计。

  • CI体系与SAST东西 例如sast东西sonarcube及其插件find securit bug与CI体系jenkins便是一套低本钱的完结计划;

  • 缝隙办理体系 进入到代码审计阶段的企业,一般已经有相对完善的缝隙办理体系和工单处理流程,能够将sast生成的报表解析、过滤后再推到缝隙办理体系;

  • 审计流程办理 这块首要清晰审计进程的使命盯梢、检查掩盖率、ROI点评。

3)checklist

这儿的checklist其实是对审计流程的进一步细化,按场景和缝隙进行差异,做了哪些、发现什么问题,多少代码量,什么技能栈,花费了多少人天,调查周期内的准召率。

4)掩盖事务规划

  • 高危事务:一个月内呈现1次高危缝隙或许n次缝隙以上即可断定。

  • 新事务:严格把关新事务上线的安全基线合格状况,要求走一致的自动化代码缝隙扫描与人工审计。

  • 重要事务:筛选出重要事务的域名清单,一致拉取代码、cgi信息进行是非盒审计。

4、Tips

紧接着全体思路,下文将介绍快速阅览代码、从事务思想去发掘缝隙以及进步准召率的小技巧。

1)怎样快速看懂代码

简略来说,便是重视开发形式、开发结构,读尽或许少的代码、从路由与cgi的映射联系下手,结合IDE去阅览代码。

  • 用mvc或许mvvm架构思想去了解 大部分web体系都是依照model(数据库模型)-view(用户交互)-controller(后台事务逻辑)的架构去规划开发的,近年来越来越盛行的mvmm(model-view-viewmodel)架构也是在此根底上演化而来,两种差异在于mvvm的viewcontrol抽离了mvc的controller中的事务逻辑,完结事务逻辑组件的复用。审计时能够直接去controller或许viewmodel中找相应的事务逻辑。

  • 差异前后端代码 前后端别离也是近年来盛行的开发形式,前端部分一般只会呈现xss缝隙,经过差异前后端代码,能够防止在前端代码部分浪费时刻去定位sql注入、越权缝隙之类的后端逻辑才会呈现的缝隙。

  • 先找路由与逻辑代码对应联系 路由一般呈现在装备或许mvc架构的controller中,经过文件目录或许类函数的public特点来定位,或许在url路由表中直接界说。

  • 论IDE的重要性 IDE一般会显现类或许函数的Definition和Reference,经过链接能够快速盯梢代码调用,也能够运用内嵌的查找功用快速定位要害字,比起指令行下查找要害字便利许多。

2)事务思想

这儿着重事务思想,是说越了解事务,越能从开发者和用户视点去考虑规划和运用上或许存在的安全问题,对逻辑缝隙发掘十分重要。

  • 让事务供给运用程序的规划文档、架构文档,以便从功用上快速了解事务逻辑。

  • 一直记住用户能够操控恳求的每一个方面,他们能够依照恣意次序拜访多阶段功用,能够提交变形数据,能够疏忽某些参数,能够假造某些参数,能够修正某些参数。因而在规划的时分必定尽或许要八面玲珑。

  • 从各个视点考虑两个要素:运用程序怎样处理用户的失常操作和输入的,不同代码组件与运用程序功用之间的相互依靠操作或许构成晦气影响。

  • 考虑规划进程中做的每一个假定,并幻想假定被违反的每种状况,特别留意用户能够彻底操控的假定条件。

3)怎样进步准召率

首要关于怎样进步准确性和完好性的问题。

  • 现代编程中重视代码调度、脚手架、一致极彩娱乐手机板-甲方代码审计之道与术结构、高度封装的问题:过滤和预编译等安全防护都在结构层或许公共class/function完结的可疏忽。

  • 传入危险函数的参数用户不可控的可疏忽。

  • 依靠组件扫描仅仅供给一种思路或许缩小审计规划,东西扫出后需求复核,怎样存在问题的函数或许类事务并没有运用,不作为缝隙,只作危险提示。

  • 接入层已运用https的,不需求重视HSTS等安全header反常,但仍主张程序自行装备安全header,特别是secure/httponly/X-Content-Type-Options:nosniff等不适合在接入层一致装备的。

  • 关于常见的运用场景,如文件操作、指令行操作、数据库操作、用户权限及认证等,咱们需求了解结构的完结,给出相应的安全编码典范。结构文档中给出的比如并不必定便是最好的。安全侧有必要对开发进行安全意识的训练,让他知道怎样运用结构的API去安全的组合出常用功用。

  • 关于运用缝隙发掘,咱们需求扩大字典。结构的封装,或许引进更多的危险API或危险特性。在代码审计的进程中,需求将这些内容加入到危险词字典中。

利器

上文许多介绍了代码审计的办法论,下文将要点介绍代码审计进程中运用的开源与商业sast东西。

1、开源东西评测

很少开源sast东西是一起支撑好几种开发言语的,除了cobra系列东西。而独自针对单个言语的开源东西则十分多。

1)cobra

官方版别支撑php/java ast,其他言语运用正则表达式、要害词匹配的办法,但用户可经过重写扫描引擎和自界说规矩进行优化。主张能够重视依据cobra二次开发的cobra-w,该东西重写了ast解析,主攻准确性。

2)bandit

python代码审计东西,支撑ast、支撑丰厚的缝隙类型和陈述格局、可自界说插件和陈述格局。

3)nodejsscan

nodejs代码审计东西,运用正则表达式匹配办法,根本掩盖了nodejs常见缝隙以及nodejs开发最佳实践。

gosec 运用ast parser,支撑20+缝隙类型检测,是一款比较全面的golang代码审计东西。但实践测验作用不太抱负,需求进一步troubleshooting。

4)devskim/auditjs/dependence-check/clockwalk

这几款东西首要用于pip包、npm包和jar包的cve缝隙检测,但误报挺高,由于代码中其实有不少组件引进后并没有运用,可作为危险项进行提示。

2、商业东西评测

下表针对现在主楼的商业sast东西做了简略评测,企业在收购时可略做参阅,由于sa极彩娱乐手机板-甲方代码审计之道与术st东西在不同言语上的体现良莠不齐,或许在企业环境实践测验会更好。

1)CheckMarx

以色列网络安全公司开发的CheckMarx CxSuite现在在业界广泛运用,下文将简略介绍其CxAudit东西。

检测模型

input->sanitize->output

  • 静态元素表明保存在所谓的文档目标模型(DOM)中。

  • 动态元素表明保存在所谓的数据流图(DFG)中。

DOM和DFG被保存在数据库中,能够运用CxSQL创立和查询数据库中的任何东西,包括查找安全缝隙。

2)Fortify

HP旗下的Fortify SCA东西也是现在十分盛行的sast东西,其检测模型简略介绍如下:

检测模型

①Translation-首要经过调用言语的编译器或许说明器把前端的言语代码(如JAVA,C/C++源代码)转换成一种中心媒体文件NST(Normal Syntax Tree)将其源代码之间的调用联系,履行环境,上下文等剖析清楚。

②Analysis-经过8个剖析不同类型问题的静态剖析引擎剖析这个NST,匹配一切规矩库中的缝隙特征,一旦发现缝隙就抓取出来。最终构成包括详细缝隙信息的FPR成果文件,用AWB翻开检查。

3、IDE

下文介绍几款IDE东西。

1)sast软件的插件

像CheckMarx/Fortify等SAST针对IntellijIDEA/VSCode等干流IDE都供给了插件,经过填写服务接口地址和账密信息即可完结自动触发扫描和IDE内陈述阅览,对开发者十分友爱,但实践落地中会遇到License约束的问题,导致很难人手一个账号,无法阻隔权限,不太或许大规划推行。

2)用户自行编写插件

像sublime支撑用户自行编写插件,即可针对代码审计的场景自行编写插件,这儿引荐vulhint+kiwi+devskim,其间vulhint的装备如下,阅览代码时会高亮提示高危函数:

cases

下文将简略介绍怎样对PHP、js、Python这三种干流开发言语进行代码审计,其间,PHP挑选ThinkPHP结构、js挑选NodeJS下的Express结构、Python挑选Flask结构。

1、PHP代码审计

ThinkPHP

缝隙概况

版别:ThinkPHP 5.0.14

影响办法:insert、update

payload:

http://localhost/thinkphp/public/index.php/index/index/in极彩娱乐手机板-甲方代码审计之道与术dex?name[0]=inc&name[1]=updatexml(1,concat(0x7,user,0x7e),1)&name[2]=1

审计流程:

1)下载安装ThinkPHP结构到Nginx/Apache之类的webserver,搭建好测验环境。

2)检查官方文档了解结构目录,承认事务逻辑编写途径在application下,开端编写自己的服务,这儿界说Index.php如下图:

3)先输入payload快速验证一下,发现注入成功。

4)下面开端代码审计,定位缝隙代码,能够看到用户传入的参数是直接进入insert函数操作的,那么盯梢insert函数往下走,经过IDE提示知道insert是在thinkphp\library\think\db\Builder.php中界说,往下走发现有一个剖析数据的函数parseData,盯梢进去:

5)发现parseData有个逻辑,一旦传入参数数组第一个元素是inc时会进入新的函数parseKey处理,再次盯梢进去。

6)发现parseKey没有做任何过滤,直接将履行成果回来给用户,由此输入updatexml或许extractvalue函数可构成sql履行犯错,然后回来当时用户信息。

2、js代码审计

Express

缝隙概况

payload:

POST http://localhost:9090/ping/ HTTP/1.1

xxx

address=127.0.0.1;whoami

审计流程:

1)检查目录结构,很典型的MVC架构,能够猜想router放置路由信息,models放置数据模型,views放置html信息。

2)跟进router发现cgi与后台逻辑对应联系,main是主页面,app才是事务页面,能够看到/ping对应处理模块是appHandler,身份认证是authHandler,然后response回来给view的app/ping烘托。

3)跟进appHandler找到对应的处理逻辑,发现用户可控参数传到指令履行的函数中,并且没有任何过滤,然后构成恣意指令履行缝隙。

3、Python代码审计

Flask

缝隙概况

payload:

http://localhost/xss/reflected/name=

审计流程:

1)检查代码途径,看到run.py,检查经过装修器界说了url与后台逻辑的对应联系,能够直接检查后台逻辑。

2)发现用户传输的参数直接吐到html文件中,而html并未对数据进行转义,构成x极彩娱乐手机板-甲方代码审计之道与术ss。

4、Golang代码审计

缝隙概况

payload:

POST http://localhost:8082/sqli HTTP/1.1

xxx

Uid=1' or 1=1--#回来一切数据

//or

Uid=1' and 1=2--#回来空数据

审计流程:

1)检查代码目录发现,也是很典型的MVC架构,其间app.go是进口文件,util界说了model,templates界说了view,vulnerability界说了详细controller。

2)跟进app.go来看,在main函数初始化路由、注册运用路由。

3)咱们先看sql注入的缝隙类型,依据import的模块可知事务逻辑或许在vulnerability/sqli中,找到vulnerability/functions.go找到详细界说如下:

4)那究竟有没有sql注入就要看UnsafeQueryGetData函数怎样过滤或许是否做预编译了,跟进vulnerability/sqli/sqli.go里检查发现没有任何过滤,直接拼接sql句子,然后构成sql注入。

>>>>

参阅资料

  • 代码审计:审计思路之实例说明全文通读

  • Java代码审计,高手便是这样“硬看”的

  • 通读全文进行代码审计

  • 通用代码审计思路

  • AST笼统语法树介绍

  • thinkphp insert/update sql注入

>>>>

活动引荐

11月15日,广州:Gdevops全球敏捷运维峰会将举行2019年度收官盛会,要点环绕才智运维、DevOps、数据库范畴,携手阿里、腾讯、京东、新浪微博、甜橙金融、联通大数据、微众银行、贝壳找房、新炬网络等技能代表打开年度技能总结与发展趋势展望,扫码罗致全年技能精华。

请关注微信公众号
微信二维码
不容错过
Powered By Z-BlogPHP