1.1 代码审计的意义
2020年10月的CNVD安全月报显示,Web应用程序的漏洞占比34%,显而易见,Web应用程序仍然是安全防御的重中之重,因此对业务代码进行安全审计是十分重要的,如图1-1所示。
图1-1 Web应用程序漏洞影响重大
随着Java Web应用越来越广泛,安全审计已经成为安全测试人员需要直面的工作。虽然PHP在中小型互联网中仍占据一席之地,但在主流的大型应用中,Java仍是首选的开发语言,国内外大型企业大多以Java作为核心的开发语言。因此对于安全从业者来说,Java代码审计已经成为需要掌握的关键技能。
代码审计对攻防研究有着重要的意义。在“攻”方面,如果渗透测试人员、漏洞研究人员不了解代码审计,则在渗透测试的实战过程中难以“细致入微”,可能遇到的麻烦包括但不限于以下几种。
遗漏在网站代码里的潜在漏洞。
盲目测试,做无用功。
举例说明,以往的通过扫描器扫描站点或利用NDay进行渗透测试的方式已经受到了很大的制约,现在及未来比较典型的渗透测试流程是:确定站点指纹→通过旁站扫描备份或开源程序得到源代码→代码审计→利用审计出来的漏洞。因此对于渗透测试人员而言,代码审计能力也显得越发重要。
在“防”方面,国内有大量网站曾遭到拖库,其中相当一部分漏洞就是因为代码导致的。本书作者也曾经帮助多家企业开展过Java代码审计项目以及Java安全开发培训。在工作中发现,即使对于有着雄厚的研发能力、完备的安全合规要求以及明确的人员分工的IT巨头,其应用系统的源码也可能存在“阿喀琉斯之踵”般的致命弱点;而小型单位则经常有着“重业务,轻安全”或者“对Web安全漏洞了解得不全面、深入”的通病(这在注入、越权、反序列化、应用程序依赖库等漏洞类型显得较为明显)。如果企业安全人员具备代码审计的能力,就能提前做好代码审计工作,在黑客发现系统漏洞之前找出安全隐患,提前部署好相应的安全防御措施,落实“安全左移”,提高应用系统的安全性,从而“治未病”。
唯一不变的是变化本身,随着云计算技术的蓬勃发展,传统上云实践中的应用升级缓慢、架构臃肿、无法快速迭代等“痛点”日益明显。基于此,云原生技术蓬勃发展;变化中亦有不变,通过分析云原生的代表技术微服务和声明式 API的安全风险可以发现,应用安全仍是其中的防护重点。因而,若在云原生安全建设初期践行“源代码安全审计”,将安全投资更多地放到开发安全,包括安全编码、供应链(软件库、开源软件)安全、镜像(仓库)安全等,可起到减少安全投资、增加攻击难度的效果。代码安全审计在当下以至未来均可对Web应用安全的防护重要作用。
术业有专攻。安全人员与研发、测试人员看代码的视角也往往不同。基于此,我们认为从安全人员的角度帮助对Java安全经验有所欠缺的研发、测试人员快速地了解并掌握高频且重要的Java代码审计知识、搭建知识技能框架,亦或是帮助已具备相关经验的人士进行查缺补漏均具有重要意义。