Datacon 2023 漏洞分析赛道赛题二官方题解
0x00 前言 赛题二附件.zip 本题目来源于对openwrt项目源码魔改。基于实战中的场景,在题目中设置了三种相对固定且常见的漏洞模式,希望选手们在对固定漏洞模式理解的基础上,可以利用静态分析工具辅助进行分析,探索各种漏洞分析工具与人工分析相结合的漏洞挖掘模式,减少一定量的重复人工审计。 静态分析工具都有其自身的缺陷,分析的结果很难做到尽善尽美。因此站在一位漏洞挖掘工程师的角度,我设置本题的目标是探索如何合理的使用静态分析工具,并最大程度的利用这种自动化的方式帮助我们减少人工分析的工作。 这里的题解主要使用我们自研的二进制静态分析工具——破壳平台的交互式查询来辅助我们进行分析,大致来说有以下思路: 根据漏洞模式的某些参数特征进行匹配 定义source点和sink点进行污点追踪 根据漏洞模式上下文特征来匹配漏洞 我们将会介绍这三种思路来进行查询解题,具体漏洞的答案和查询规则在文末可见。 0x01 根据参数特征查询 根据参数特征查询适用于过滤一些常见的危险函数的危险操作。 1.1 针对strcat函数 例如如果strcat的二个参数是一个常量字符串的话是很难有溢出的,即使有溢出也难以造成很大的危害。故此这种情况我们一般不需重点关注。 在本次datacon赛题二中,我们对strcat进行查询并设置其第二个参数是一个变量的情况。这里我们的查询规则如下,查找类型为变量(identifier),callee的筛选是为了筛选出调用这个变量的函数要是strcat函数,最后index指定了这个变量是strcat的第二个参数(下标从0开始),as taintPropagationPath RETURN taintPropagationPath 是为了前端将结果显示的更好看一些。 MATCH (n:identifier) WHERE n.callee="strcat" AND n.index=1 WITH [n] AS taintPropagationPath RETURN taintPropagationPath 查询结果如下,可以看到符合的结果只有两条。因为查询到的结果并不多,所以可以进行一下人工验证。验证后发现恰好是我们题目设置的答案odhcpd:0x000036A9 odhcpd:0x000035F9 依据这种思路我们可以查询到 漏洞3,漏洞4 总结 与之类似的情况还有strcpy函数,我们依然可以依照上面的原则进行编写规则进行查询。 在现实情况中,如果我们上传了整个固件可以如此查询一下他system和popen的调用情况,那么如果他执行的是一个常量字符串那么肯定不可能是一个命令注入漏洞。因此我们可以同样对他system和popen的第一个参数类型进行限制,帮助我们初步筛选一下目标,减轻人工逆向的工作量。 1.2 针对memmove函数 首先我们来看下memmove函数的函数定义,第一个参数是dst,第二个参数是src,第三个参数是len void * memmove(void *dst, const void *src, size_t len); 通常memmove安全的使用方法有以下两种 调用memmove函数的时候第三个参数是一个固定的值 memmove(dest, src, sizeof(dest)); memmove的dest大小是根据第三个参数的大小申请出来的 dest = malloc(size); memmove(dst, src, size); 我们针对这两种情况进行排除,编写查询命令。其中not (m)-[:dfg]-(n)即是现在第一个参数跟第三个参数之间不存在直接的数据流关系 MATCH (n:identifier{callee:"memmove", index:0}), (m:identifier{callee:"memmove", index:2}) WHERE n....