为什么以本地系统运行服务在Windows上不好?

我正试图找出不同的服务帐户types之间的差异。 我重蹈覆辙。

答案是因为它有强大的本地资源访问权限,如果可能的话应该使用networking服务。

但是我还是不能理解,如果它有强大的本地资源访问能力,攻击者如何访问这个帐号呢? 有什么办法来妥协的帐户? 我明白这是关于安全的,但我不知道如何。 这可能是黑客黑客的世界,然而任何人都可以简单地解释为什么networking服务帐户比本地帐户更好?

提前致谢。

您运行的每个程序都会增加服务器的攻击面。

你必须假定一个有决心的恶意行为者可以利用你的程序中的错误或漏洞使它做任何事情。 你可以通过以最少的特权执行你的程序来缓解这个问题。

其中一些攻击包括:

  • 引诱攻击 ,攻击者在程序的提升特权下欺骗你的程序执行他们的代码。

  • 缓冲区溢出攻击Buffer Overrun Attacks) ,其中发送给方法的额外数据被写入相邻的存储器,这可能是控制流逻辑的目标。

  • 中间人攻击 ,攻击者伪造消息到你的程序。

通常情况下,一个特定的服务并不是显而易见的。 在网络服务(或者权限减少的另一个帐户)下运行是一种“比抱歉更好”的策略,承认软件开发的两个重要事实:程序员是易犯的,攻击者是创造性的。

本地帐户在本地机器上具有完全的管理权限。 因此,任何可能逃离缓冲区溢出并自动执行的代码都有可能造成破坏。

另一方面,网络服务帐户在默认情况下只有来宾级访问本地系统。 因此即使攻击者设法发现并执行服务中代码将有限访问的代码。

LocalSystem帐户是* nix root帐户的Windows equivilant。 它比管理员帐户更有特权。 以LocalSystem身份运行时,您可以完全访问机器上的每个资源。

正如其他人写的,你应该写你的代码以尽可能少的权限运行。

LocalService和NetworkService之间的主要区别在于,作为NetworkService运行的服务能够向域中的其他计算机进行身份验证(就像我认为的计算机帐户一样)。

请注意,LocalService和NetworkService帐户都具有“模拟”特权,这是一个潜在的危险特权 – 它允许服务模拟正在调用服务的用户。 如果该用户是管理员,那么即使您的代码运行在低权限服务中,也可以执行管理员的任何操作。 如果攻击者可以利用最小权限服务中的缓冲区溢出漏洞,他们可以将您用来模拟调用者的API挂钩,并等待高权限调用者调用您的服务。 这种技术被称为“令牌绑架”, MSRC有一个伟大的博客文章来描述这个问题(并且包含描述如何减轻与使用LocalService和NetworkService账户有关的其他风险的链接)。

如果您的服务存在一个可能允许攻击者执行任意代码(例如缓冲区溢出)的错误,那么如果服务在本地系统帐户(相当于管理员帐户)下运行,他可以使用您的计算机执行任何操作。 因此,您的服务正在运行的权限较低,攻击者可获得的权限较小。

最简单的情况是服务允许服务的用户在命令行上执行一些代码。 例如,MS SQL server有一个存储过程,允许您运行“命令行”命令(即运行程序)。