Java代码审计——初识Java代码审计
CNVD漏洞周报月报中,web端占比往往较高,显而易见,Web应用程序安全仍然是网络安全防御中的重中之重,因此对业务代码进行安全审计十分重要。
CNVD周报
随着Java Web
应用越来越广泛,安全审计已经成为安全测试人员需要直面的工作,虽然PHP
在中小型互联网中仍然占据着一席之地,但在主流的大型应用中,Java
仍然是首选的开发语言,国内外大型企业以Java
作为核心的开发语言。因此对于安全从业者来说,Java
代码审计已经成为必须要掌握的关键技能。
代码审计的意义
“攻”
在“攻”的方面,如果是渗透测试人员、漏洞研究人员不了解代码审计,在渗透测试的实战过程中难以做到“细致入微”,可能会遇到各种麻烦比如:遗漏在网站代码里的潜在漏洞,盲目测试做无用功。
举例说明一下,以往的通过扫描器扫描站点或利用NDay
进行渗透测试的方式已经收到很多的制约(大部分都被之前的大佬前辈们挖掘进行修复),现在及未来比较典型的渗透测试是:确定站点指纹➡通过旁站扫描备份或开源程序得到源代码 ➡代码审计➡利用审计出来的漏洞。因此对于渗透测试人员而言,代码审计能力也显得越发重要。
“防”
国内有大量网站都曾遭遇到过拖库,其中相当一部分漏洞都是因为代码导致的。即使对于有着雄厚的研发能力、完备的安全合规要求以及明确的人员分工的IT巨头,奇应用系统的源码也可能存在“阿喀琉斯之踵”般的致命漏洞,而小型单位则经常有着“重业务,轻安全”以及“对Web安全漏洞了解得不全面、深入”的通病(在注入、越权、反序列化、应用程序依赖库等漏洞类型显得尤为明显)。如果企业安全人员具备代码审计的能力,就能够提前做好代码审计工作,在不法人员发现系统漏洞之前找出安全隐患,提前部署好相应的安全防御措施,就能够提前规避掉很多安全问题。
唯一不变的是变化本身,随着云计算技术的蓬勃发展,传统上云实践中的应用升级缓慢、架构臃肿、无法快速迭代等“痛点”日益明显。基于此,云原生技术蓬勃发展;变化中亦有不变,通过分析云原生的代表技术微服务和声明式 API 的安全风险可以发现,应用安全仍是其中的防护重点。因而,若在云原生安全建设初期践行“源代码安全审计”,将安全投资更多地放到开发安全,包括安全编码、供应链(软件库、开源软件)安全、镜像(仓库)安全等,可起到减少安全投资、增加攻击难度的效果。代码安全审计在当下以至未来均可对 Web 应用安全的防护重要作用。
Java代码审计的基础能力
Java代码审计要求代码审计人员能够“动静结合”。在“动”的方main,要求代码审计人员具备调试程序的能力。若代码逻辑较为复杂,那么可以通过多次调试或关键位置设置断点来进行辅助理解。在“静”的方面,要求代码审计人员具备一定的编程基础,了解基本语法与面向对象思想。若代码审计人员能够通过阅读理解代码逻辑,并善于查阅文档和资料,就能解决大多数的问题
代码审计常用思路
代码审计常用思路
- 接口排查(“正向追踪”):先找出外部接口接受的参数,并跟踪其传递过程,观察是否有参数校验不言的变量传入高位方法中,或者在传递的过程中是否有代码逻辑漏洞。
- 危险方法溯源(“逆向追踪”):检查敏感方法的参数,并查看参数的传递与处理,判断变量是否可控并且已经经过严格的过滤。
- 功能点定向审计:根据经验判断该类型应用通常会在哪些功能中出现漏洞,直接审计该类功能的代码。
- 第三方组建、中间件比对:检查Web应用所使用的第三方组件或中间件的版本是否收到已知漏洞的类型。
- 补丁比对:通过对补丁做比对,发推出漏洞所在处。
- “黑盒测试”+“白盒测试”:虽然代码审计的过程需以"白盒测试"为主,但是在过程中辅以"黑盒测试"将有助于快速定位到接口或做更全面的分析判断。交互式应用安全测试技术IAST就结合了"黑盒测试"和"白盒测试"的特点。
- “代码静态扫描工具”+“人工研判”:对于某些漏洞,使用代码静态扫描工具代替人工漏洞挖掘可以显著提高审计工作的效率。然而,代码静态扫描工具也存在"误报率高"等缺陷,具体使用时往往需要进一步研判。
- 开发框架安全审计:审计Web应用所使用的开发框架是否在自身安全性问题,或者由于用户使用不当而引发的安全风险