Microsoft has worked hard to make Windows Vista more secure than previous versions. One of the latest changes involves changing the privileges that services have when running on the system. Scott Lowe outlines the changes.
Microsoft has been touting Windows Vista as the most secure Windows ever. Backing up that claim, Microsoft has included a number of new security features in the operating system. These new features are designed to address some of the common vectors by which previous versions of Windows have fallen to anonymous miscreants and other criminals.
One such new feature in Windows Vista is known as Windows Service Hardening. In older versions of Windows, services did not necessarily run with the least possible privileges. In fact, Windows services often ran under accounts with very high level of access, such as the LocalSystem account. Further, users are often not aware of the services running on their systems, and do not realize that there are services that are safe to disable. Finally, services and user applications ran in the same space, which could result in inappropriate access. As a result of services running with privileges that did not match necessity and services running that users did not require, Windows desktops were left more vulnerable to attack.
What's Windows Service Hardening?
Vista's Service Hardening is designed to mitigate some of these shortcomings. The feature uses four methods to achieve its goals:
- Service isolation
- Least privilege
- Restricted network access
- Session 0 isolation
I will talk about each of these security methods in some detail.
Before Windows Vista, when a service needed access to an object that required a high level of security, one of two approaches could be taken:
- The service could be run using an account that granted a high level of rights to the system. The LocalSystem account, for example, would provide this level of service. This is the approach that was most commonly taken but unnecessarily opened up the system to possible attack.
- The security configuration for the object to which access was required could be reconfigured to allow access from a special account with fewer privileges. Besides creating an administrative nightmare (imagine having to create a service account for every account and then maintaining passwords for those accounts), this approach would provide an attacker with another vector by which to attack a system.
Enter service isolation. Service isolation is a method by
Once the SID is created and assigned for use by a service, an object's (for example, a registry key to which a service needs to write information) access control list can be modified to include the new SID, thus allowing the service to access the object without giving away the privilege farm.
Even when a service is using one of these service-specific SIDs, the service is still able to access other resources because the service's process token also contains the SID for the service account (i.e., LocalService or NetworkService). If the service is compromised, a potential attacker can cause additional damage by accessing the resources that are not related to the service, but are accessible to the LocalService account.
Windows Vista tries to help you here, too. In an attempt to limit the potential damage caused by a compromised service, Windows Vista combines write-restricted tokens and per-service SIDs to establish restricted SIDs for services. If a service enables a restricted SID, then that service's per-service SID is combined with both the normal and restricted SID list of the write-restricted service access token. Now, the service can write only to objects that have been specifically granted write access to one of the SIDs in the restricted list.
Let's take a look at an example.
Suppose that a particular service runs using the LocalService account and also has a service SID enabled. As a result, the service has access to objects that have been granted per-service access, but the service also has access to all objects that provide access to the LocalService account. By enabling restricted SIDs, this can no longer write to any object that grants access to LocalService account. Why? Those objects do not grant write access to the per-service SID of your service.
The LocalSystem account provides the keys to every aspect of a system. This is also the account under which many Windows services run. Therefore, these services are favorites among hackers since a successful exploit against one of these services can provide wide and deep access to a system.
In order to best protect a system, a best practice is to run each service using an account with the least privileges necessary to accomplish the service's goals. Although Windows provides other accounts that have significantly fewer rights, some services require privileges provides only by the LocalSystem account.
Under older versions of Windows, the LocalSystem account provided carte blanche access. Under Windows Vista, services requiring LocalSystem-only rights can still use the LocalSystem account, but can be configured to be granted only those rights that are required for the service to operate, and no more. LocalSystem is not the only account that can use this new feature. The following accounts or account types can also use this least privilege mechanism:
- LocalService account: The LocalService account has minimum rights on the local computer and uses anonymous credentials on the network. This account has reduced privileges and acts in a similar fashion to an authenticated local user account. Use of this account is useful when the LocalSystem account provides too much access for services that do not need deep access to a system.
- NetworkService account: The NetworkService account is similar to the LocalService account in that this account provides lesser rights than LocalSystem. Where NetworkService differs from LocalService is in cases during which the service needs to access remote resources. Whereas LocalService provides anonymous credentials for access to remote resources, NetworkService accesses remote resources using the credentials of the computer account.
- Domain accounts: User accounts created in the Active Directory domain.
- Local accounts: User accounts created on the local computer.
Under Windows Vista, when a service starts, the service requests specific privileges -- not all privileges -- provided by the LocalSystem account. Rights that are not specifically requested in some way are removed from the service's access token. If a service has not been designed with this new security feature, the service is assigned all of the rights granted by LocalSystem. This helps to maintain backward compatibility for older services. For shared-process services, all processes in the group are assigned all of the rights requested by each of the individual processes.
It's important to note that this principle of least privilege does not limit a hacker's ability to exploit a flaw in a service. It does, however, limit the damage that can be wrought by an attacker's successful breach of your other defenses.
Service network access restrictions
Over the years, services running in Windows have become more and more dependent on being accessible to the network or accessible by other computers on your network. Services that face the network in this way are more vulnerable to attack since, in order to work their magic, these services are just waiting for remote connections, making them more susceptible to malicious activity.
Under Windows Vista, a developer can restrict a service's access by TCP/UDP port, protocol, or even by the direction that network traffic is flowing. When restrictions like these are in place, attempts to access a service using other methods will be blocked, protecting that service from some attack vectors.
Windows Vista services can also be configured to not allow network access in which case the service cannot be remotely exploited, but neither can the service make connections to remote services. However, not every service really needs network access.
Windows Vista's service-level network access restrictions hardening feature works in a similar fashion, as the service isolation feature in that the restrictions are implemented through the use of service-level SIDs.
Session 0 isolation
For this section, the assumption is that you are using Vista as a desktop and not as a server serving remote users.
Under Windows XP, when a user logs into the console, all services and applications run in what is called Session 0. When Fast User Switching is enabled in Windows XP, the first user's applications are assigned to Session 0, along with all of the system's running services. As additional users log into the system via Fast User Switching, each additional user's applications are run inside a new session. So the second user's applications run in Session 1, and the third user's applications run in Session 2. However, regardless of how many people log in to the system, all services, as well as the original user's applications, continue to run in Session 0.
Mixing services, many of which run with considerable privileges, with user applications can create significant security issues. If an application is poorly written, falls victim to an exploit, or if that application is running in the same session as services, those services are more vulnerable to compromise than they would be if the applications were running in a separate box.
In order to combat this potential threat, Windows Vista does not allow any user applications to be run in Session 0. All other applications must run in Session 1 or higher. Only services and other non-user-facing applications run in Session 0, thus maintaining isolation between services and user applications.
New and improved service security
Through these changes to the Windows Vista service model,
Windows Vista aims to better protect your system in the event of a breach. With
the exception of Session 0 Isolation, Vista's Service Hardening features are
not necessarily designed to block attacks on services hosted in
Service Hardening, when combined with other