Logo xia0o0o0o

CodeQL+XNU

July 11, 2022
2 min read
Table of Contents

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

安装

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

export PATH=$PATH:<codeql_path>

建立XNU database

cd 进xnu源码的存放位置

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

查询测试

首先建立一个CodeQL package

codeql pack init xnuql -e cpp

然后添加cpp-all

cd xnuql
codeql pack add codeql/cpp-all

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

可以查询到

	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)在的原因吧。