Trail of Bits发布自定义CodeQL查询集:提升Go与C代码漏洞检测能力

CodeQL 101

CodeQL是驱动GitHub高级安全的静态分析工具,通过将代码转换为可查询数据库来发现漏洞。虽然CodeQL核心引擎是闭源的,但其提供开源的分析库和安全查询集。

(EC)DSA在Go中的静默输入截断

当向ecdsa.SignASN1方法传递未哈希的原始数据时,Go的crypto/ecdsa包会静默截断输入。例如对/etc/passwd签名时,实际只处理前32字节(P-256曲线尺寸)。我们开发的tob/go/msg-not-hashed-sig-verify查询可检测此类数据流。

解决方案:

  1. 长度验证(如go-ethereum的实现)
  2. 静态检测未哈希的数据流

Go中的文件权限缺陷

非八进制表示的文件权限可能导致意外设置。例如os.Chmod("./key",400)实际设置权限为0o620。我们的tob/go/file-perms-flaws查询采用WYSIWYG启发式方法检测此类问题:

// 所见即所得启发式
fileModeAsSeen = ("000" + fileModeLitStr.replaceAll("_", "").regexpCapture("(0o|0x|0b)?(.+)", 2))

Go字符串修剪方法误用

strings.TrimLeft等方法易被误用为前缀修剪。例如:

strings.TrimLeft("file://path", "file://")  // 错误:删除所有字符
strings.TrimPrefix("file://path", "file://") // 正确

我们的tob/go/trim-misuse查询通过以下规则检测误用:

  1. 切割集包含重复字符
  2. 长度>2且包含连续字母数字
  3. 非常见连续字符序列

Go中缺失的最小TLS版本配置

默认tls.Config.MinVersion是TLSv1.0(不安全),但官方查询只检测显式设置的不安全版本。我们开发的tob/go/missing-min-version-tls专门检测未显式设置MinVersion的情况。

C/C++中的字符串漏洞

基于cstrnfinder研究,我们开发了tob/cpp/cstrnfinder查询检测三类问题:

  1. 缓冲区欠读(size参数小于源字符串)
  2. 缓冲区过读(size参数大于源字符串)
  3. strncat误用(size参数应为剩余缓冲区空间)

C中的缺失空终止符

当初始化字面量长度等于缓冲区大小时,C编译器不会警告缺失的空字节:

char b2[13] = "Ancrene Wisse"; // 无警告但无终止符

tob/cpp/no-null-terminator查询通过数据流分析检测此类问题。

持续更新

这是我们持续更新的CodeQL资源库,还包括Semgrep规则和自动化测试手册。欢迎使用并反馈问题!

查看完整查询集 | 联系我们获取定制查询
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
公众号二维码

posted @ 2025-07-20 12:01  qife  阅读(20)  评论(0)    收藏  举报