https://go-review.googlesource.com/c/tools/+/248686 引入了用于检查BP寄存器被覆盖的帧指针检查,但是这个检查仅在linux和darwin上启用。
// func mixBlocksSSE2(out, a, b, c *block)
TEXT ·mixBlocksSSE2(SB), 4, $0-32
MOVQ out+0(FP), DX
MOVQ a+8(FP), AX
MOVQ b+16(FP), BX
MOVQ c+24(FP), CX
MOVQ $128, BP
RET
作为一个例子,它在Windows上没有报告覆盖情况。https://github.com/golang/crypto/blob/5ff15b29337e062d850872081bcd9f4d784f4c25/argon2/blamka_amd64.s#L204
不清楚为什么其他操作系统被排除在这个分析之外。
我希望在为linux/darwin编译的文件上也能报告覆盖情况。
5条答案
按热度按时间qc6wkl3g1#
CC @randall77, @timothy-king。
fdx2calv2#
我不记得为什么我排除了其他操作系统。值得尝试启用它们并看看会发生什么。
Windows是否曾尝试回溯用户代码?它是否使用BP来实现?如果答案是否定的,那么在Windows上可能并不重要。
mum43rcc3#
如果答案是否定的,那么在Windows上可能并不重要。我需要检查Windows上的BP使用情况,我怀疑没有。但是,即使BP使用情况在Windows上是有效的,它可能在Linux/Darwin上不存在——因此,当我在Windows上运行go vet时,我仍然希望警告针对所有操作系统的汇编程序。如果汇编文件仅针对Windows标记,那么不报告BP覆盖是可以理解的。
kmbjn2e34#
即使最新的加密包v0.12.0也没有提供使用密钥为argon2的选项。因此,昨天我开始在Go的最新加密包上开发自己的argon2包。由于我需要轻松地访问deriveKey函数来实现目标,我决定从官方Go仓库克隆argon2,一切都进行得很顺利。在Mac(arm)上我没有遇到问题。但是,当我在其他机器上运行静态分析时遇到了这些问题。
在Ubuntu 22.04(amd64):
在Windows 11(intel/amd64):
然后我尝试了解Go汇编器的汇编代码,在这里我感到困惑:
https://cs.opensource.google/go/x/crypto/+/refs/tags/v0.12.0:argon2/blamka_amd64.s
MOVQ a+8(FP), AX
MOVQ a+24(FP), CX
MOVQ a+8(FP), AX
MOVQ a+24(FP), CX
按照我的理解,第203行应该是
MOVQ c+24(FP), CX
,第226行应该是MOVQ c+24(FP), CX
。此外,原始BP没有正确恢复,因此在Ubuntu上出现了错误。后来,我以这种方式修改了代码:pilinux/argon2@e374b3d
所有这些错误都得到了解决。我对arm64、amd64以及win、mac和linux进行了静态分析(您可以在仓库中查看结果)。今天我在应用程序中使用了这个包,可以确认一切都按预期工作。
我想创建一个问题,但后来发现了这个问题,所以我在这里写了下来。
也许来自官方Go开发团队的某位成员会关注这个问题。
谢谢。
4jb9z9bj5#
https://go.dev/cl/332289提到了这个问题:
argon2: avoid clobbering BP