x/tools/go/analysis: framepointer doesn't report BP clobbering on Windows

wztqucjr  于 7个月前  发布在  Go
关注(0)|答案(5)|浏览(61)

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编译的文件上也能报告覆盖情况。

qc6wkl3g

qc6wkl3g1#

CC @randall77, @timothy-king。

fdx2calv

fdx2calv2#

我不记得为什么我排除了其他操作系统。值得尝试启用它们并看看会发生什么。
Windows是否曾尝试回溯用户代码?它是否使用BP来实现?如果答案是否定的,那么在Windows上可能并不重要。

mum43rcc

mum43rcc3#

如果答案是否定的,那么在Windows上可能并不重要。我需要检查Windows上的BP使用情况,我怀疑没有。但是,即使BP使用情况在Windows上是有效的,它可能在Linux/Darwin上不存在——因此,当我在Windows上运行go vet时,我仍然希望警告针对所有操作系统的汇编程序。如果汇编文件仅针对Windows标记,那么不报告BP覆盖是可以理解的。

kmbjn2e3

kmbjn2e34#

即使最新的加密包v0.12.0也没有提供使用密钥为argon2的选项。因此,昨天我开始在Go的最新加密包上开发自己的argon2包。由于我需要轻松地访问deriveKey函数来实现目标,我决定从官方Go仓库克隆argon2,一切都进行得很顺利。在Mac(arm)上我没有遇到问题。但是,当我在其他机器上运行静态分析时遇到了这些问题。

在Ubuntu 22.04(amd64):

/blamka_amd64.s:203:1: [amd64] mixBlocksSSE2: invalid offset a+24(FP); expected a+8(FP)
./blamka_amd64.s:226:1: [amd64] xorBlocksSSE2: invalid offset a+24(FP); expected a+8(FP)
./blamka_amd64.s:204:1: frame pointer is clobbered before saving
./blamka_amd64.s:227:1: frame pointer is clobbered before saving

在Windows 11(intel/amd64):

/blamka_amd64.s:203:1: [amd64] mixBlocksSSE2: invalid offset a+24(FP); expected a+8(FP)
./blamka_amd64.s:226:1: [amd64] xorBlocksSSE2: invalid offset a+24(FP); expected a+8(FP)

然后我尝试了解Go汇编器的汇编代码,在这里我感到困惑:
https://cs.opensource.google/go/x/crypto/+/refs/tags/v0.12.0:argon2/blamka_amd64.s

  • 第201行: MOVQ a+8(FP), AX
  • 第203行: MOVQ a+24(FP), CX
  • 第224行: MOVQ a+8(FP), AX
  • 第226行: 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开发团队的某位成员会关注这个问题。
谢谢。

4jb9z9bj

4jb9z9bj5#

https://go.dev/cl/332289提到了这个问题:argon2: avoid clobbering BP

相关问题