恶意软件如何窃取代码签名证书?

逆向工程 视窗 恶意软件
2021-07-07 16:40:43

在分析/研究/RE exe/dll 时,您会在 peview/hexeditor 等中看到证书,但是如何知道该证书是伪造的/恶意的/过期的,必须有一个中央存储库,包含所有好的或错误的证书,我所知道的一个是 HerdProtect[.]com,它会告诉您公司/开发商是否会分发恶意软件。

另外,我已经读到人们从公司窃取代码签名证书并使用它们来签署他们的恶意软件,我的问题是在反转我应该在 Olly/IDA 中查找哪些字符串时,我猜恶意软件将使用 FindFirstFile、FindNextFile 进行枚举等对于系统中的特定文件(证书文件),此类恶意软件会寻找什么字符串,“OR HAVE I GOT IT WRONG”

也有很多 exe 被签名两次,为什么会这样?是为了愚弄安全供应商还是使用多个证书签名是正常的。

1个回答

对于带有数字证书的可执行文件,通过查看可执行文件的属性来检查证书的信息和来源很容易。例如,以下是 Skype 显示的内容:

在此处输入图片说明

这些证书由受信任的证书颁发机构 (CA) 颁发给开发人员,用于在分发可执行文件之前对其进行签名。理论上,CA在颁发证书之前应该充分验证申请证书的开发者的身份,但实际上CA仍然是一个涉及不完善实体的系统,恶意软件作者有可能申请并获得“好”的证书来自受信任的 CA,而除了恶意软件之外从不生产任何东西。

如果您返回 Skype 证书的第一张图片并选择“详细信息”,您将能够获得有关证书及其来源的更多信息:

在此处输入图片说明

在这张图片中,我们可以看到证书的确切颁发者和颁发者,以及相关的颁发日期和到期信息。这是从官方 Skype 网站直接下载的,所以我可以非常确信该软件是由它所说的人制作的。同样,该证书是由 Microsoft 代码签名 PCA 颁发的,因此我们至少可以合理地确信该证书是值得信赖的。如果您查看“证书路径”选项卡,您可以将证书一直追溯到根 CA,并再次验证一切是否正常。

确定证书是否恶意或被盗可能难以检测,但在某种程度上是常识问题。您的证书是否声称颁发给合法发行商(例如 Microsoft),但您知道您下载的软件不是从他们那里获得的吗?可能有些不对劲。您还可以查看颁发 CA 并尝试在线查找有关其声誉的信息。CA 在筛选分发恶意软件的人方面做得不好?他们是否因信息安全性差而臭名昭著?如果发行人看起来很粗略,那么他们很可能就是这样。依赖 CA 的声誉是一个已知的漏洞。

现在,关于您的第二个问题:证书由一个私钥/公钥对组成,私钥保持私密(当然)和与应用程序一起分发的公钥。使用代码签名工具,开发人员生成可执行文件的哈希值并使用私钥对其进行加密。此散列与可执行文件中证书的公钥部分一起分发。在用户端,可执行文件的新散列被获取并用公钥解密以验证其完整性。这意味着在签名后被修改的可执行文件将没有有效的证书,您应该在尝试安装或运行它们时收到警告。如果要查看系统上的证书列表(受信任和不受信任),请打开命令提示符窗口并运行certmgr

请注意,为了使合法证书被“窃取”并且恶意软件用它来签名,它需要访问私钥。如果私钥被公开(就像几年前戴尔发生的事情......),那么恶意软件作者就有可能签署他们的软件,就好像他们是向其颁发证书的开发人员一样。如果这个私钥保密,那么理论上它应该是安全的。我认为你的第二个问题的答案是你对代码签名的工作方式有点困惑,但如果你确实遇到了一些试图生成签名代码的恶意软件,我会留意尝试启动signtool实例、加载.pfx或其他私钥文件等的代码部分

我不是代码签名或证书颁发机构方面的专家,因此在某些情况下,恶意软件可能会生成自签名证书、与系统上的根 CA 混淆等,但比我更有经验的人必须权衡那...

至于你的第三个问题中的双重签名,看看你在说什么的例子会很有帮助,但我确实发现 Skype 是用两个证书签名的。两者之间的主要区别在于摘要算法,一个是 sha1,另一个是 sha256。这可能是一种处理具有当前不支持 sha256 的操作系统并需要较旧(且已弃用)的 sha1 摘要算法的旧用户的机制。(参见:https : //security.stackexchange.com/questions/109629/deprecation-of-sha1-code-signing-certificates-on-windows

要更深入地了解代码签名和证书颁发机构,请随时查看这篇 MSDN 文章