¿Cuál es el riesgo de implementar símbolos de depuración (archivo pdb) en un entorno de producción?

81

Tengo una aplicación que registra rastreos de excepciones y quería que esos rastreos de pila incluyeran nombres de archivo y números de línea cuando se implementan en producción. Descubrí cómo implementar los símbolos de depuración con el ensamblado, pero en el proceso de investigación del problema me encontré con esta pregunta , lo que implica que no es una buena idea incluir archivos pdb en un entorno de producción. Un comentario a la respuesta aceptada dice "... depurar información puede revelar datos confidenciales y ser un vector de ataque. Dependiendo de cuál sea su aplicación".

Entonces, ¿qué tipo de datos sensibles podrían estar expuestos? ¿Cómo se pueden utilizar los símbolos de depuración para comprometer una aplicación? Tengo curiosidad por los detalles técnicos, pero lo que realmente estoy buscando es una forma práctica de evaluar el riesgo de incluir símbolos de depuración para cualquier aplicación y entorno de producción. O para decirlo de otra manera: ¿qué es lo peor que podría pasar?

EDITAR: pregunta de seguimiento / aclaración

Entonces, según las respuestas de todos hasta ahora, parece que esta pregunta se puede simplificar un poco para las aplicaciones .NET. Este fragmento del blog de John Robbins vinculado en la respuesta de Michael Maddox me llamó la atención :

Una PDB .NET solo contiene dos piezas de información, los nombres de los archivos de origen y sus líneas y los nombres de las variables locales. Toda la demás información ya está en los metadatos de .NET, por lo que no es necesario duplicar la misma información en un archivo PDB.

Para mí, esto reitera lo que otros han estado diciendo sobre Reflector, con la implicación de que el verdadero problema es el acceso a las asambleas. Una vez que se ha determinado, la única decisión que debe tomar con respecto a los PDB es si le importa o no exponer los nombres de archivo, los números de línea y los nombres de las variables locales (asumiendo que no está mostrando los rastros de pila a los usuarios finales para empezar). ¿O lo he simplificado demasiado?

Mate
fuente
@Matt: ¿Es esta una aplicación de escritorio, web, compacta o ...?
Kb.
@Kb: en este caso particular, es una aplicación de consola que ejecutamos con un programador. Fue desarrollado internamente para uso interno, por lo que cualquiera que pueda ver el archivo pdb también podrá ver el código fuente, por lo que no estoy demasiado preocupado por esta aplicación en particular. Estoy más interesado en el caso general / práctico para poder decidir si arriesgarme o no con otras aplicaciones, como, por ejemplo, una aplicación de escritorio instalada en computadoras portátiles que ocasionalmente están conectadas a datos confidenciales en nuestra red.
Matt

Respuestas:

58

Aquí hay otra pregunta para mirar:

¿Existe algún problema de seguridad al dejar los archivos de depuración de PDB en los servidores activos?

Y más información sobre archivos PDB:

Archivos PDB: lo que todo desarrollador debe saber

En general, siempre incluyo archivos pdb en mis implementaciones, las ganancias son demasiado grandes para ignorarlas.

Si nunca expone un seguimiento de pila a sus usuarios (y generalmente no debería), no existe ningún riesgo de seguridad adicional al implementar archivos PDB.

Cuando ocurre un seguimiento de pila visible para el usuario, el usuario puede ver el seguimiento de pila completo, incluido el nombre de archivo y los números de línea de archivo. Esto podría darles una idea de cómo está diseñada su aplicación, lo que podría ayudarlos en caso de piratería.

Una amenaza de seguridad mayor es algo como Reflector que cuando se usa en sus DLL les permitirá ver su código fuente, con o sin archivos pdb.

Michael Maddox
fuente
3
Gracias por los enlaces. Por lo tanto, parece que al menos parte de la ecuación es dónde se implementa la aplicación (es decir, escritorio versus servidor web).
Matt
15

Si está implementando en un entorno de producción en su propia organización, entonces no es un problema de seguridad.

Si está vendiendo su software a otras entidades, entonces el archivo .pdb puede darle una ventaja a alguien interesado en la ingeniería inversa, que puede ser un problema o no para usted.

Sin embargo (para que quede claro), no desea que sus rastros de pila se muestren al cliente, ya sea que los .pdbs estén disponibles o no. Pero si solo está registrando los rastros y presentando una página de error 'bonita' al cliente, no es un problema.

Michael Burr
fuente
Creo que Matt está hablando de .Net. ¿Qué información adicional se podría obtener de un PDB que no esté disponible a través de una herramienta como el Reflector de Lutz?
Lars Truijens
La información de fuente y línea viene inmediatamente a la mente. No creo que los nombres de las variables locales estén presentes en los metadatos.
Michael
@Lars: nunca dije que ayudaría :) Creo que todo este miedo en torno a los PDB y la ingeniería inversa está muy fuera de lugar. El tipo de persona que puede usar PDB para realizar ingeniería inversa puede usar un desensamblador decente que admita anotaciones.
Michael
1
Puedo ver cómo los nombres de variables locales en métodos muy largos pueden ayudar a la ingeniería inversa, pero ¿los nombres de los archivos de origen y la información de línea? No es un riesgo real en comparación con herramientas como Reflector si me preguntas :)
Lars Truijens
1
@Lars: creo que otra forma de expresar lo que Michael Maddox y yo decimos es que dar el archivo .pdbs a alguien que tiene los ensamblados a menudo no es realmente un riesgo de seguridad. Hacer que un seguimiento de pila esté disponible para alguien que no tenga los assmeblies podría serlo.
Michael Burr
11

Al tener símbolos de depuración, un atacante puede determinar variables globales, compensaciones de funciones, etc., de interés.

Entonces pudo ver que su sistema tiene una función como:

AddAdminUser(string name, string password);

Y conoce su compensación. Si su programa está comprometido, podría llamar a esta función para darse privilegios de administrador.

O algo como:

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

Y sabe qué bit invertir para cambiar su aplicación a un modo inseguro.

Alternativamente, esto tomaría bastante tiempo de ingeniería inversa para resolverlo. Sin embargo, no es una cantidad de tiempo insuperable.

Pero . . . todo esto implica que su atacante ya está en una posición en la que puede comprometer su programa. Si ese es el caso, ya perdió.

Si tiene una buena razón comercial para implementar símbolos pdb, continúe. La implementación de PDB no lo hará inseguro. Si no tiene una buena razón para implementar, no debe hacer esto, ya que facilitará un poco los ataques.

También puede crear archivos PDB públicos: estos eliminan cierta información, pero le brindan suficientes símbolos para generar un seguimiento de pila y realizar una depuración básica. Los detalles están aquí . Microsoft implementa PDB públicos en su servidor de símbolos para que todos los usen.

EDITAR: La mayor parte de lo que dije se aplica a las preocupaciones en torno a la implementación de PDB para código nativo; creo que muchas de estas preocupaciones que la gente también traslada a .NET, aunque los metadatos de ensamblaje ya transmiten bastante de esto.

Miguel
fuente
6
Creo que Matt está hablando de .Net. Ya puede obtener toda la fuente de una herramienta como Lutz 'Reflector incluso sin una PDB.
Lars Truijens
@Lars: actualicé mi comentario para señalar que la mayor parte de esto es código nativo. Creo que mucha gente simplemente tiene un miedo irracional de que los PDB hagan posible la ingeniería inversa y creen que los atacantes no saben cómo usar los desensambladores como IDA Pro. Creo que estos temores también se incorporan incorrectamente al código administrado.
Michael
2

Alguien puede "restaurar" el código fuente completo de su aplicación. Si es de código abierto no tienes que preocuparte. Si tiene alguna IP (algoritmos, protección, licencias), probablemente no sea una buena idea.

Es cierto que herramientas como Reflector pueden reconstruir partes de su código incluso sin archivos PDB, pero las ofuscaciones pueden ayudar (bueno, solo un poco).

db_
fuente
1
Creo que Matt está hablando de .Net. Ya puede obtener todo el código fuente de una herramienta como Lutz Reflector incluso sin una PDB.
Lars Truijens
Lars, estoy completamente de acuerdo, Reflector es una gran herramienta para la ingeniería inversa. Pero a veces el código de resultado no es muy legible, especialmente si la fuente estaba ofuscada. Los archivos PDB harán la vida aún mejor.
db_