Имея символы отладки, злоумышленник может определять глобальные переменные, смещения функций и т. Д., Представляющие интерес.
Чтобы он мог видеть, что ваша система имеет такую функцию:
AddAdminUser(string name, string password);
И знать его смещение. Если ваша программа скомпрометирована, он может вызвать эту функцию, чтобы предоставить привилегии администратора.
Или что-то вроде:
typedef enum {Basic, NTLM} AuthenticationMode;
AuthenticationMode g_authenticationMode;
И знает, какой бит перевернуть, чтобы переключить ваше приложение в небезопасный режим.
В качестве альтернативы, это займет совсем немного времени для обратного проектирования, чтобы выяснить это. Однако это не непреодолимое количество времени.
Но. , , все это означает, что ваш злоумышленник уже находится в состоянии, когда он может скомпрометировать вашу программу. Если это так, вы уже проиграли.
Если у вас есть веская деловая причина для развертывания символов pdb, продолжайте. Развертывание PDB не сделает вас незащищенным. Если у вас нет веских причин для развертывания, вам не следует этого делать, поскольку это немного облегчит атаки.
Вы также можете создавать общедоступные файлы PDB - они отбирают определенные фрагменты информации, но дают вам достаточно символов для генерации трассировки стека и выполнения базовой отладки. Подробности здесь . Microsoft развертывает общедоступные PDB на своем сервере символов для всех пользователей.
РЕДАКТИРОВАТЬ: Большинство из того, что я сказал, относится к проблемам, связанным с развертыванием PDB для собственного кода - я думаю, что многие из этих проблем люди переносят и на .NET, даже несмотря на то, что метаданные ассемблера уже передают довольно много этого.