使用具有已知漏洞的组件漏洞介绍
漏洞成因
应用程序技术栈中使用的框架、库、工具包出现了已知的安全漏洞。
攻击方式
利用应用程序技术栈中的框架、库、工具等的已知漏洞进行攻击,获取高权限或者敏感数据。
漏洞影响
敏感数据泄露,提升权限,远程代码执行等,具体影响视漏洞可利用程度而定。
漏洞防护
1、删除所有不必要的依赖项。
2、了解并掌握自己所使用的都有所有组件的清单。
3、监视诸如国家信息安全漏洞库cnnvd,通用漏洞库cve,以查找组件中的漏洞。
4、定期更新升级自己所用组件。
5、尽量不采用那些维护不积极的组件。
自动化检查方案
自动化检查展开思路主要分为三部:
1、系统所使用的组件收集。
2、将收集类的组件与漏洞库中的漏洞进行匹配。
3、将匹配到的漏洞提交给项目团队进行修改。
以下对每个步骤的思路进行介绍。
信息收集
这个环节主要是尽可能的收集到准确的组件引用信息,信息中应包含组件的名称以及对应版本版本号。
如典型的后端应用可能用到组件有;
1、中间件:Nginx、Tomcat、Mq等
2、数据库:Oracle、Mysql、Postgresql、ClickHouse、InfluxDB、Rides等
3、后端服务:后端服务一般会引用较多的三方包,也是教容易出现漏洞的地方,如Fastjson,Shiro等组件 。
收集方法
1、中间件与数据库类组件收集
关于中间件以及数据库版本可以采用人工收集的方式进行收集维护,也可以采用引用指纹识别类工具进行自动识别,不过为了准确性这里建议有项目组内的专职人员进行维护,如测试或运维人员
2、后端服务引用组件收集
关于后端服务所引用的三方包建议采用依赖文件解析的方式进行收集,这样效率较高且信息精准,以maven管理的java项目为例,我们可以根据pom文件解析其依赖以及父级依赖,将这些依赖解析并按照规则储存起来即为我们所引用的组件资源,以下为例程(本例为解析本地服务,如有分析远端代码需求,可以集成jgit工具分析git仓库中所有项目);
//用以调用并执行mvn指令
<dependency>
<groupId>org.apache.maven.shared</groupId>
<artifactId>maven-invoker</artifactId>
<version>3.1.0</version>
</dependency>
// 用以解析解析PomTree为Node
<dependency>
<groupId>org.whitesource</groupId>
<artifactId>maven-dependency-tree-parser</artifactId>
<version>1.0.5</version>
</dependency>
public class AnalysisPom {
public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException,
ParseException, MavenInvocationException {
// 定义pom路径
String PomFile = "你的pom所在路径/pom.xml";
// 定义Maven路径
String MavenHome = "你的maven所在路径/apache-maven-3.8.1";
// 定义要执行的mvn指令
String MavenCommand = "dependency:tree -D outputFile=YoursPomTree.txt";
// 需要解析为Node对象的依赖树文件所在路径(即:YoursPomTree)
String PomTreeFile = "YoursPomTree.txt";
InvocationRequest request = new DefaultInvocationRequest();
// 待解析的pom文件路径,不写默认为解析当前项目pom文件
request.setPomFile(new File(PomFile));
Invoker invoker = new DefaultInvoker();
// 你的maven安装路径
invoker.setMavenHome(new File(MavenHome));
// 输入待执行的mvn指令
request.setGoals(Collections.singletonList(MavenCommand));
// 执行
invoker.execute(request);
//解析PomTree为Node
InputType type = InputType.TEXT;
Reader r = new BufferedReader(new InputStreamReader(new FileInputStream("tree.txt"), StandardCharsets.UTF_8));
Parser parser = type.newParser();
Node tree = parser.parse(r);
System.out.println(tree); //此处可以继续递归处理Node,获取所有依赖pom坐标,例程不做具体处理
}
}
3、以项目维度将所有识别出来的三方组件,存入组件仓库
匹配漏洞
匹配漏洞环节主要是将环节中所采集到的组件与漏洞库中漏洞进行匹配,如:三方组件中引用了fastjson-v1.2.62而漏洞库中也存在fastjson-v1.2.62相关的漏洞则完成了漏洞的匹配,如漏洞库中没有fastjson-v1.2.62我们认为目前这个组件为安全的不存在漏洞。具体的匹配方法如下;
匹配方法
1、收集漏洞,并维护自己的漏洞仓库
由于,工业和信息化部,国家互联网信息办公室,公安部在今年7月联合发布了《网络产品安全漏洞管理规定》,以后的漏洞的发现,报告修复,发布,。统一归口到国家部门,所以漏洞的收集建议关注国家级的专业网站,推荐如下;
1、国家信息安全漏洞库cnnvd:http://www.cnnvd.org.cn/
2、国家信息安全漏洞共享平台cnvd:https://www.cnvd.org.cn/
3、工业和信息化部网络安全威胁和漏洞信息共享平台cstis: https://www.cstis.cn/
4、美国Mitre公司维护的通用漏洞库cve:http://cve.mitre.org/
5、美国nist维护的nvd:https://nvd.nist.gov/
其中因为cnnvd,cve有对外提供数据文件且专业度很高,所以在做漏洞收集程序时可以优先对这两个网站提供的漏洞数据文件进行解析。这样可以减少很多投入。
2、将漏洞库中的关键字(如漏洞涉及组件与版本)与三方组件库中的组件进行关联
提交漏洞
将有漏洞的组件提交给对应团队让其整改。