如何删除或匿名化存储在已编译的 .NET exe 输出中的文件名和路径?

信息安全 。网 朦胧 混淆
2021-08-28 08:12:39

当 .NET 应用程序中发生异常时,异常输出还包括驻留在开发人员计算机上的代码文件的路径和文件名。这共享了一些对调试有用的信息,但也可能存在安全问题,如下例所示:

D:\talks 是私人的

在上图中,目录 D:\talks 来自开发人员的机器,而不是最终用户的。

假设我有一个 Visual Studio 解决方案文件,其中有一个 PFX 文件,其中包含名称的密码部分:

Example:  d:\my secret project\Obscure FOSS project\Signer-PW-Is-test123.pfx

当然 test123 不是真正的 pfx 密码,但如果它是用于其他目的的更敏感的密码(比如域管理员)怎么办。

问题:

这个字符串“Signer-PW-Is-test123.pfx”存储在 .NET DLL 或 exe 中的什么位置?

它是否存储在 OBJ 文件中?

我怎样才能清除这些数据,或者匿名化信息,这样我就不会泄露不必要的信息,但仍然可以让工程师调试应用程序。

2个回答

我对你如何设置这个有点困惑。

是什么让您认为文件路径根本存储在任一程序集中?您是否使用该 PFX 对程序集进行签名?如果是这样,则程序集属性中有一个指针。

无法在该级别隐藏文件名,因为编译器需要知道完整路径。您可以通过混淆软件运行它,但这仍然可能导致字符串存在。

另一种选择是确保在 RELEASE 中编译,这样就不会添加调试位。这将删除 pdb 文件并删除代码文件路径的大部分条目。

唯一的其他选择实际上是从非敏感路径编译东西,例如:d:\builds\1,并从文件路径中删除所有敏感信息。简单地说:不要将密码存储在文件名中。

您需要实现异常处理。对于所有系统和 API 调用,请查看文档以获取该方法可能抛出的异常列表。然后,适当地考虑这些例外情况,您就不会遇到此类问题。