在生产环境中部署调试符号(pdb文件)的风险是什么?

时间:2009-08-20 16:46:31

标签: .net security production debug-symbols

我有一个记录异常条带跟踪的应用程序,我希望这些堆栈跟踪在生产中部署时包含文件名和行号。我想出了如何使用程序集部署调试符号,但是在研究问题的过程中我遇到了this question,这意味着在生产环境中包含pdb文件并不是一个好主意。对接受的答案的评论说:“...调试信息可以泄露敏感数据并成为攻击媒介。取决于你的应用程序是什么。”

那么可能会暴露哪种敏感数据?如何使用调试符号来破坏应用程序?我对技术细节很好奇,但我真正想要的是一种评估任何给定应用程序和生产环境中包含调试符号的风险的实用方法。换句话说:可能发生的最坏情况是什么?

编辑:后续问题/澄清

因此,基于每个人的答案到目前为止,似乎这个问题可以简化为.NET应用程序。 John Robbins blogMichael Maddox's answer链接的{{3}}中的这一位跳出了我:

  

.NET PDB只包含两部分   信息,源文件名和   他们的行和局部变量   名。所有其他信息都是   已经在.NET元数据中了   没有必要重复相同的   PDB文件中的信息。

对我来说,这重申了其他人对Reflector所说的话,其含义是真正的问题是访问程序集。一旦确定了,关于PDB的唯一决定是你是否关心暴露文件名,行号和本地变量名(假设你没有向最终用户展示堆栈跟踪)。或者我过度简化了这一点?

4 个答案:

答案 0 :(得分:55)

这是另一个要看的问题:

Are there any security issues leaving the PDB debug files on the live servers?

有关PDB文件的更多信息:

PDB Files: What Every Developer Must Know

一般情况下,我总是在部署中包含pdb文件,增益太大而不能忽略。

如果您从未向用户公开堆栈跟踪(通常不应该),则部署PDB文件实际上没有任何额外的安全风险。

当用户可见堆栈跟踪发生时,用户可以看到完整堆栈跟踪,包括文件名和文件行号。这可以让他们了解您的应用程序是如何构建的,如果黑客攻击可能会对他们有所帮助。

更大的安全威胁类似于Reflector,当您在DLL上使用时,它们将允许他们查看您的源代码,无论是否有pdb文件。

答案 1 :(得分:13)

如果您要在自己的组织中部署到生产环境,那么这不是安全问题。

如果您将软件出售给其他实体,那么.pdb文件可以让有兴趣进行逆向工程的人 - 这对您来说可能是也可能不是问题。

但是(要清楚),您不希望您的堆栈跟踪显示给客户端 - 无论.pdbs是否可用。但是,如果您只是记录跟踪并向客户端显示“漂亮”错误页面,那么这不是问题。

答案 2 :(得分:11)

通过调试符号,攻击者可以确定感兴趣的全局变量,函数偏移等。

所以他可以看到你的系统有如下功能:

AddAdminUser(string name, string password);

知道它的偏移量。如果您的程序遭到入侵,他可以调用此函数为自己授予管理员权限。

或类似的东西:

typedef enum {Basic, NTLM} AuthenticationMode;
AuthenticationMode g_authenticationMode;

知道要翻转什么位以将应用程序切换到不安全模式。

或者,这需要相当多的逆向工程时间来弄清楚。然而,这不是一个不可逾越的时间。

但是。 。 。这一切都意味着你的攻击者已经处于可以危及你的程序的位置。如果是这样的话,你已经输了。

如果您有充分的商业理由来部署pdb符号,请继续。部署PDB不会让您感到不安全。如果您没有充分的理由进行部署,则不应该这样做,因为它会使攻击稍微容易一些。

您还可以创建公共PDB文件 - 这些文件会剥离某些信息,但会为您提供足够的符号来生成堆栈跟踪并进行基本调试。详细信息为here。 Microsoft在其符号服务器上部署公共PDB以供所有人使用。

编辑:我所说的大部分内容都适用于围绕为本机代码部署PDB的问题 - 我认为很多人担心这些问题也会转移到.NET,即使汇编元数据已经传达了相当多的内容。 / p>

答案 3 :(得分:2)

有人可以“恢复”应用程序的完整源代码。如果它是开源的,你不必担心。如果它有一些IP(算法,保护,许可证),它可能不是一个好主意。

像Reflector这样的工具确实可以在没有PDB文件的情况下重建代码的一部分,但是混淆可以帮助(嗯,只是一点点)。