30 September 2011 HowTo, IIS, MVC3, Security Robert Muehsig

Angreifern sollte man möglichst wenig Informationen an die Hand geben. Standardmäßig ist aber eine ASP.NET MVC Website auf einem IIS schon ein klein wenig gesprächig.

image

In jeder Response wird (solange nichts anderes im IIS eingestellt wurde), die IIS Version mitgesendet. Auch die ASP.NET MVC und ASP.NET Version ist in der Response enthalten wenn die ASP.NET Pipeline berührt wurde.

 

 

 

Was ist an den Standard-Headern so schlecht?

Es gibt Szenarien, da macht das durchaus Sinn die Herkunft der Webantwort zu verschleiern, auch wenn die Default-Werte “recht grob” sind. Problematisch wird es, wenn direkt für die ASP.NET Version 4.0.30319 eine Sicherheitslücke auftaucht. Daher die Idee, alles nicht benötigte abzuschalten. Netter Nebeneffekt: Man spart noch ein paar Byte ein.

Herangehensweise: Vermutlich kann man einige Optionen auch direkt im IIS setzen, ich habe allerdings gern diese “Einstellungen” in meiner Applikation, sodass ich keinem Admin noch ein Handbuch hinterher werfen muss.

ASP.NET MVC Header deaktivieren

Der ASP.NET MVC Header kann in der Global.asax mit “MvcHandler.DisableMvcResponseHeader” deaktiviert werden:

        protected void Application_Start()
        {
            MvcHandler.DisableMvcResponseHeader = true;

            AreaRegistration.RegisterAllAreas();

            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);
        }

 

ASP.NETA Version Header deaktivieren

Wichtig hier ist, dass die Anwendung im IIS (unter den AppPools) als Integrated Pipeline bzw. während der Entwicklung mindestens auf IIS Express läuft:

image

Diese Einstellungen in der Web.config haben bei mir jeddenfalls das gewünschte Ergebnis erzielt:

<?xml version="1.0"?>
<configuration>

  <system.web>
    <httpRuntime enableVersionHeader="false" />
    ...
  </system.web>

  <system.webServer>
    ...
    <httpProtocol>
      <customHeaders>
        <remove name="X-Powered-By" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>

 ...
</configuration>

Server Response Header entfernen

Dieses Flag ist am “schwierigsten” zu entfernen und benötigt ein HttpModule, welches diesen Header entweder entfernt oder manipuliert:

    public class RemoveServerHeaderModule : IHttpModule
    {
        public void Init(HttpApplication context)
        {
            context.PreSendRequestHeaders += OnPreSendRequestHeaders;
        }

        public void Dispose()
        { }

        void OnPreSendRequestHeaders(object sender, EventArgs e)
        {
            HttpContext.Current.Response.Headers.Remove("Server");
        }
    }

 

Registrierung in der Web.config:

<?xml version="1.0"?>
<configuration>
  ...
  <system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true">
      <add name="RemoveServerHeaderModule" type="SecurityTipp.RemoveServerHeaderModule"/>
    </modules>
	...
  </system.webServer>

</configuration>

 

Quellen

Wie immer dank an Stackoverflow und diesem Link.

[ Code auf Google Code ]


Written by Robert Muehsig

Software Developer - from Dresden, Germany, now living & working in Switzerland. Microsoft MVP & Web Geek.
Other Projects: KnowYourStack.com | ExpensiveMeeting | EinKofferVollerReisen.de

If you like the content and want to support me you could buy me a beer or a coffee via Litecoin or Bitcoin - thanks for reading!