什么是在生产环境中部署调试符号(PDB文件)的风险?(What's the risk of

2019-07-02 15:13发布

I have an application that logs exception strack traces and I wanted those stack traces to include file names and line numbers when deployed in production. I figured out how to deploy the debug symbols w/ the assembly, but in the process of researching the issue I ran accross this question, which implies that it's not a good idea to include pdb files in a production environment. A comment to the accepted answer says "...debugging information can give away sensitive data and be an attack vector. Depending on what your app is."

So what sort of sensitive data might be exposed? How can debug symbols be used to compromise an application? I'm curious about the technical details, but what I'm really looking for is a practical way to evaluate the risk of including debug symbols for any given application and production environment. Or to put it another way: what's the worst that could happen?

EDIT: follow-up question/clarification

So based on everyone's answers so far, it seems like this question can be simplified a bit for .NET applications. This bit from the John Robbins blog linked in Michael Maddox's answer kind of leaped out at me:

A .NET PDB only contains two pieces of information, the source file names and their lines and the local variable names. All the other information is already in the .NET metadata so there is no need to duplicate the same information in a PDB file.

To me, this reiterates what others have been saying about Reflector, with the implication being that the real issue is access to the assemblies. Once that's been determined, the only decision to make with respect to PDBs is whether or not you care about exposing file names, line numbers, and local variable names (assuming that you're not showing stack traces to end users to begin with). Or have I oversimplified this too much?

Answer 1:

这是另外一个问题来看待:

有没有离开现场服务器上的PDB调试文件的任何安全问题?

在PDB文件和详细信息:

PDB文件:每个开发人员必须了解

在一般情况下,我始终在我的部署PDB文件,涨幅都过于庞大,不容忽视。

如果你从来没有暴露堆栈跟踪到你的用户(一般你不应该),有没有真正部署PDB文件的任何额外的安全风险。

当用户可见的堆栈跟踪情况,用户可以看到完整的堆栈跟踪,包括你的文件名和文件行号。 这可能给他们你的应用程序是如何架构的一些想法这将可能帮助他们,如果黑客攻击。

一个更大的安全威胁是像反射器 ,其对你的DLL使用将使他们能够查看源代码,有或无pdb文件时。



Answer 2:

如果你要部署在自己组织生产environement,那么这不是一个安全问题。

如果你卖你的软件给其他实体,然后.pdb文件可以给感兴趣的人在逆向工程了一条腿 - 这可能是也可能不是你的问题。

不过(要清楚),你不希望你的堆栈跟踪显示到客户端 - 在.pdbs是否是可用的。 但如果你只是记录的痕迹,并呈现出“漂亮”的错误页面给客户端,这不是一个问题。



Answer 3:

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

这样他就可以看到你的系统有一个功能,如:

AddAdminUser(string name, string password);

并且知道它的偏移。 如果你的程序被攻破,他可以调用这个函数来给自己管理员权限。

或者是这样的:

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

而知道什么位翻转到您的应用程序切换到不安全的模式。

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

但是。 。 。 这一切意味着你的攻击者已经在一个位置,他可能会危及你的程序。 如果是这样的话,你已经输了。

如果你有一个良好的商业理由来部署PDB符号,勇往直前。 部署PDB的人不会让你没有安全感。 如果你没有一个很好的理由来部署,你不应该这样做,因为它会使攻击稍微容易一些。

您还可以创建公共PDB文件 - 这些信息条某些部分,但给你足够的符号生成一个堆栈跟踪,做基本的调试。 详情点击这里 。 微软部署其符号服务器上的公共PDB的供大家使用。

编辑:大多数我说适用于各地部署PDB的原生代码问题 - 我想了很多的这些问题人们结转到.NET为好,即使程序集元数据传达了相当多的这个了。



Answer 4:

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

这是事实,像反射工具可以重构你的代码的部分,即使没有PDB文件,但迷惑可以帮助(当然,只是一点点)。



文章来源: What's the risk of deploying debug symbols (pdb file) in a production environment?