CodeQL+XNU

入门浅试记录一下,文档还没看完

安装

下载压缩包解压到一个位置

1
export PATH=$PATH:<codeql_path>

建立XNU database

cd 进xnu源码的存放位置

1
codeql database create xnu-database --language=cpp --command="make SDKROOT=macosx ARCH_CONFIGS=X86_64 KERNEL_CONFIGS=RELEASE"

查询测试

首先建立一个CodeQL package

1
codeql pack init xnuql -e cpp

然后添加cpp-all

1
2
cd xnuql
codeql pack add codeql/cpp-all

在package里新建一个ql文件,配合vscode的CodeQL插件就可以简单进行查询,来进行一点简单的测试先,参考这篇文章

可以查询到

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
	sopt.sopt_dir = SOPT_GET;
sopt.sopt_level = uap->level;
sopt.sopt_name = uap->name;
sopt.sopt_val = uap->val;
sopt.sopt_valsize = (size_t)valsize; /* checked non-negative above */
sopt.sopt_p = p;

if (so == NULL) {
error = EBADF;
goto out;
}
#if CONFIG_MACF_SOCKET_SUBSET
if ((error = mac_socket_check_getsockopt(kauth_cred_get(), so,
&sopt)) != 0) {
goto out;
}
#endif /* MAC_SOCKET_SUBSET */
error = sogetoptlock((struct socket *)so, &sopt, 1); /* will lock */
if (error == 0) {
valsize = (socklen_t)sopt.sopt_valsize;
error = copyout((caddr_t)&valsize, uap->avalsize,
sizeof(valsize));
}

sogetoptlock()有一条路径即使错误也不会设置错误返回值,然而copyout()的第三个参数实际上是个sizeof,事实上查看查询结果,有很多误报sizeof的结果,可能是由于AST里还是有sizeof(arg)在的原因吧。