Having debugging symbols, an attacker can determine the global variables that interest you, function offsets, etc.
Thus, he could see that your system has a function such as:
AddAdminUser(string name, string password);
And know his displacement. If your program is compromised, it can call this function to give itself administrator privileges.
Or something like:
typedef enum {Basic, NTLM} AuthenticationMode; AuthenticationMode g_authenticationMode;
And he knows which bit to flip to put your application in unsafe mode.
Alternatively, this will require very little time for engineering analysis. However, this is not an irresistible amount of time.
But., This all means that your attacker is already in a state where he can endanger your program. If this happens, you have already lost.
If you have a good reason to deploy pdb characters, continue. Deploying a PDB will not make you insecure. Unless you have a good reason to deploy, you should not do this, as attacks will be a little easier.
You can also create publicly accessible PDB files — they share specific pieces of information, but give you enough characters to create a stack trace and do basic debugging. Details here . Microsoft is deploying a public PDB on its symbol server for use by all users.
EDIT: Most of what I said relates to issues around deploying PDB for native code. I think that many of these problems also migrate to .NET, even though assembly metadata is already transmitting quite a bit.
Michael Aug 20 '09 at 16:59 2009-08-20 16:59
source share