VQL 函数功能描述

taintPropagation taintPropagation(List<Long> Source, List<Long> sink, Integer flag, List<Long> should, List<Long> shouldNot) 参数 List<Long> source: source 点 ID 集合 List<Long> sink: sink 点 ID 集合 Integer flag: 默认为空为从source和sink中较少的一方传递 flag=1 时为有方向从 source 到 sink flag=2 时为有方向从 sink 到 source flag=3 时污点分析为无向 List<Long> should: 期望经过的点ID集合 List<Long> shouldNot: 排除点ID的集合 功能 找出 source 到 sink 之间的传输路径 返回 通路上点的集合 样例 查找集合[845623]到集合[845593, 845664]之间的单向污点路径,并且途中需要经过集合[845658] CALL VQL.taintPropagation([845623], [845593, 845664], 1, [845658]) doubleTaintPropagation doubleTaintPropagation(Long sourceId, Long sinkId, Integer flag, List<Long> should, List<Long> shouldNot)...

2023年10月17日 · 4 分钟 · 奇安信天工实验室

VQL使用手册

简介 VQL(Vulnerability Query Language)是基于 Cypher(一种声明式的图数据库查询语言)开发的漏洞查询语言插件,它既包含了 Cypher 精简和灵活,同时也兼顾了简单和实用的特性,能够帮助用户更好地进行漏洞挖掘。本平台的图中包含函数调用图、控制流图、数据流图等多种能辅助漏洞挖掘的的图,用户可以使用VQL和Cypher结合在图中进行批量漏洞挖掘工作。 Cypher 语句使用 Cypher 是 一种图数据库的查询语言,就如同 SQL 之于其他关系型数据库一样。在图数据库中,数据均以节点、关系来存储。所以 Cypher 应该能够有某种语法来描述节点和关系,并能表征他们之间的关系。 节点查询 MATCH (n:identifier) RETURN id(n) LIMIT 25 说明:查询变量节点,并返回其节点 id 限制数量为 25 路径查询 MATCH p=()-[r:dfg]->() RETURN p LIMIT 25 说明:查找节点关系为数据流图关系(dfg,data flow graph)的路径限制数量为 25 子句 如同 SQL 中的 SELECT、WHERE 等子句,在 cypher 中也有这类子句,用来进行查找、过滤、排序等操作。 MATCH (n:identifier) WHERE n.callee = "lxmldbc_system" AND (n.index=2 or n.index=3 or n.index=4) WITH collect(id(n)) AS sinkSet RETURN sinkSet 说明:查找调用函数 lxmldbc_system 第 3,4,5 参数位置上的所有变量(注:函数调用输出值为-1,index从0开始计数),并将其节点 id 作为集合输出...

2023年10月18日 · 2 分钟 · 奇安信天工实验室

CVE-2018-18708: 腾达路由器缓冲区溢出漏洞

0x00 漏洞介绍 CVE-2018-18708,多款Tenda产品中的httpd存在缓冲区溢出漏洞。攻击者可利用该漏洞造成拒绝服务(覆盖函数的返回地址)。 附件: httpd 991088 0x01 固件逻辑分析 首先httpd会进行端口和 ip绑定,然后会调用initWeb函数对路由进行绑定。 if ( initWeb_2E9EC(v9) >= 0 ) { .... .... .... } else { puts("main -> initWebs failed"); return -1; } 在initWeb中首先进行了handler的绑定,这里绑定了/goform,/cgi-bin等路由,后面的websFormHandler即对应的处理函数 if ( sub_29510(port, retries) >= 0 ) { sub_179A8(&unk_DC618, 0, 0, R7WebsSecurityHandler, 1); sub_179A8("/goform", 0, 0, websFormHandler, 0); sub_179A8("/cgi-bin", 0, 0, webs_Tenda_CGI_BIN_Handler, 0); sub_179A8(&unk_DC618, 0, 0, websDefaultHandler, 2); init_register(); sub_179A8("/", 0, 0, sub_2ECD0, 0); return 0; } else { printf("%s %d: websOpenServer failed\n", "initWebs", 499); return -1; } 在后续的init_register 对进入handler后分发进行处理的函数进行了注册...

2023年10月16日 · 2 分钟 · 奇安信天工实验室

CVE-2019–17621: D-Link DIR-859 未授权命令执行漏洞

0x00 漏洞描述 D-Link DIR-859设备LAN层中出现未经身份验证的命令执行漏洞(CVE-2019-17621) 附件: cgibin 160576 0x01 漏洞分析 这个漏洞是在SSDP协议处理过程中造成的,我们向D-Link发送http请求报文,报文的HTTP头字段都会存储到环境变量中,这意味着getenv所获取到的值都是我们可控的。 如下,HTTP_ST是可控的,最终参数传入了lxml_dc_system中进行命令执行 我们使用破壳平台进行漏洞检测该种模式的漏洞。 0x03 漏洞检测 首先按照source点是getenv的返回值,sink点是lxmldbc_system来进行分析,根据此编写规则 MATCH (n:identifier) WHERE n.callee = "getenv" AND n.index=-1 WITH collect(id(n)) as sourceSet MATCH (n:identifier) WHERE n.callee = "lxmldbc_system" AND (n.index=2 or n.index=3 or n.index=4) WITH sourceSet,collect(id(n)) as sinkSet call VQL.taintPropagation(sourceSet,sinkSet) YIELD taintPropagationPath RETURN taintPropagationPath 最后结果应为 点击第一个查看详细路径 寻找到了这条漏洞触发路径。

2023年10月16日 · 1 分钟 · 奇安信天工实验室

CVE-2021-27239: Netgear strncpy栈溢出漏洞

0x00 漏洞介绍 漏洞位于/usr/sbin/upnpd,是ssdp(UDP 1900)协议的解析过程中,对MX字段的strncpy引发的栈溢出。 附件: challenge 523564 0x01 漏洞分析 漏洞成因是因为直接将MX字段到”\r\n”字段中间的的内容拷贝到了缓冲区上,然而却并没有判断这段字符的长度是不是要小于要拷贝的缓冲区的大小,因此造成了栈溢出。 可以观察到造成这个漏洞的危险函数是strncpy 我们想直接定位一下二进制程序里有没有这种类似的漏洞的话直接使用交叉引用查看strncpy的调用发现有350处,直接人工去过工作量太大了 0x02 漏洞查询 观察此处漏洞点的漏洞模式,strncpy的第三个参数n首先不是一个定值且这个值和第一个参数没有关系即他们空间大小没有来自于同一个变量 根据这种漏洞模式的查询思路我们可以构造出下面的查询语句: match (n:identifier{callee:"strncpy",index:0}), (m:identifier{callee:"strncpy",index:2})where n.function=m.function and m.line=n.line and not (m)-[:dfg]-(n) return m.function limit 1000 其中not (m)-[:dfg]-(n)这一句是过滤了第一个参数和第三个参数存在数据流的情况 在破壳平台上执行查询指令得到结果,查询结果缩减为了22条,且漏洞所在函数位于查询结果中。这个查询方法不受source,sink点的影响可以更广泛的用在多数固件上。

2023年10月16日 · 1 分钟 · 奇安信天工实验室

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....

2023年10月16日 · 6 分钟 · 奇安信天工实验室