在C#中禁用SeDebugPrivilege

时间:2012-11-14 22:03:59

标签: c# security privileges least-privilege

我在C#中有一个基于WPF的程序,我想删除用户调试应用程序的权限(SeDebugPrivilege)(至少在Release模式下)。最好的方法是什么?我在代码中找到了几种方法,需要对非托管代码进行不安全的调用。我更喜欢在C#或者更好的情况下,通过应用程序清单或其他一些方法来阻止用户在我的应用程序执行期间完全拥有SeDebugPrivilege。无论如何声明一个Windows组并撤销整个组的权限?这样做的动机是通过遵循最小特权原则来更好地保护我的应用程序的一部分。还有其他特权我确定稍后会删除,但我想一次担心一件事。

2 个答案:

答案 0 :(得分:1)

我认为您可能误解了SeDebugPrivilege等特权的影响。虽然您当然可以使用AdjustTokenPrivileges从进程令牌中删除权限,但这并不会阻止进行调试的应用程序,而是阻止应用程序本身执行某些调试操作。但是,这可以通过阻止它通过需要特权的方式影响其他进程来减少应用程序中可能存在漏洞的影响。

请注意,默认情况下,即使没有SeDebugPrivilege,用户也可以调试他们自己启动的应用程序,因此即使以非管理用户身份运行(默认情况下根本没有权限),不要阻止应用程序被调试。

当然,有许多应用程序尝试检测调试器是否已连接,并且它们具有不同程度的成功。充其量,您将能够更难调试应用程序,但如果您在用户的计算机上运行,​​则无法完全阻止它。

您可以定期检查System.Diagnostics.Debugger.IsAttached,如果值为true则执行某些操作,但对于确定要调试应用程序的人来说,这是相对简单的。

答案 1 :(得分:1)

  

我想知道如何撤销用户或群组使用SeDebugPrivilege

您希望您的应用程序撤消用户的权限吗?您似乎希望管理员用户无法调试您的应用程序。

这从根本上说是错误的做法。我,用户,我的机器的所有者。 决定允许你的应用程序做什么,而不是相反。

SeDebugPrivilege的应用程序可以做任何它喜欢的事情,这很可能包括剥夺管理员权限的登录用户。但是,如果你设法在我自己的机器上将我变成非管理员,未经我的同意,那么从备份恢复后(我是这台机器上唯一的管理员,所以我会被填充)我会一定要写一些关于你的软件的相当不愉快的博客文章... :)

我对此的看法:用户负责。不是申请。你无能为力,我希望随着时间的推移,你可以做的更少。