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
查询可检测此类数据流。
解决方案:
- 长度验证(如go-ethereum的实现)
- 静态检测未哈希的数据流
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
查询通过以下规则检测误用:
- 切割集包含重复字符
- 长度>2且包含连续字母数字
- 非常见连续字符序列
Go中缺失的最小TLS版本配置
默认tls.Config.MinVersion
是TLSv1.0(不安全),但官方查询只检测显式设置的不安全版本。我们开发的tob/go/missing-min-version-tls
专门检测未显式设置MinVersion的情况。
C/C++中的字符串漏洞
基于cstrnfinder研究,我们开发了tob/cpp/cstrnfinder
查询检测三类问题:
- 缓冲区欠读(size参数小于源字符串)
- 缓冲区过读(size参数大于源字符串)
strncat
误用(size参数应为剩余缓冲区空间)
C中的缺失空终止符
当初始化字面量长度等于缓冲区大小时,C编译器不会警告缺失的空字节:
char b2[13] = "Ancrene Wisse"; // 无警告但无终止符
tob/cpp/no-null-terminator
查询通过数据流分析检测此类问题。
持续更新
这是我们持续更新的CodeQL资源库,还包括Semgrep规则和自动化测试手册。欢迎使用并反馈问题!
查看完整查询集 | 联系我们获取定制查询
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
公众号二维码