Modul pro jednoduchý workaround bezpečnostní chyby v ASP.NET

Podařilo se mi napsat a zprovoznit modul, který umožní obejít dříve zmíněnou bezpečnostní chybu v ASP.NET, a to bez zásahu do aplikace samé. Jeho aplikace nevyžaduje žádné specifické znalosti a je velmi jednoduchá.

Modul si můžete stáhnout na adrese http://oraclebugfix.codeplex.com/

Postup instalace

Poznámka: Modul vyžaduje .NET Framework 2.0 a novější a běží jenom na IIS 7.0 a novějších.

  1. Stáhněte si nejnovější verzi z http://oraclebugfix.codeplex.com/.
  2. Rozbalte ZIP archiv někam, třeba do C:\OracleFix.
  3. Spusťte soubor install.cmd. Tento skript zaregistruje můj modul do GAC a zároveň do IIS.

Až budete chtít modul odinstalovat, tak stačí spustit uninstall.cmd, který provede odregistraci z GAC a IIS.

Jak to funguje

Modul je ve své podstatě primitivní, jak jest možno zhodnotit nahlédnutím do zdrojového kódu:

using System;
using System.Security.Cryptography;
using System.Threading;
using System.Web;

namespace Altairis.Web.OracleBugFix {
    public class ErrorHandlingModule : IHttpModule {
        private const int HTTP_STATUS_CODE = 404;
        private const int HTTP_SUBSTATUS_CODE = 0;
        private const string HTTP_STATUS_TEXT = "Object Not Found";

        public void Dispose() {
            // Nothing to do here
        }

        public void Init(HttpApplication context) {
            context.Error += new EventHandler(context_Error);
        }

        void context_Error(object sender, EventArgs e) {
            // Fires when any error occurs
            var app = sender as HttpApplication;

            // Clear buffered data
            app.Context.Response.Clear();
            app.Context.ClearError();

            // Set error response status
            app.Context.Response.StatusCode = HTTP_STATUS_CODE;
            app.Context.Response.SubStatusCode = HTTP_SUBSTATUS_CODE;
            app.Context.Response.StatusDescription = HTTP_STATUS_TEXT;

            // Send error page text
            app.Context.Response.ContentType = "text/html";
            app.Context.Response.Output.Write(Properties.Resources.ErrorPage);

            // Introduce random delay
            var delay = new byte[1];
            RandomNumberGenerator rng = new RNGCryptoServiceProvider();
            rng.GetBytes(delay);
            Thread.Sleep((int)delay[0]);
            IDisposable disposable = rng as IDisposable;
            if (disposable != null) { disposable.Dispose(); }

            // Complete request
            app.CompleteRequest();
        }

    }
}

Kód nedělá nic jiného, než že odchytí jakoukoliv chybu a vyhodí ji jako 404, bez ohledu na to, co byla původně.

Podrobnější popis, možnost stažení kompetních zdrojáků i zkompilovaného balíčku najdete na http://oraclebugfix.codeplex.com/.

Titulek:
Text komentáře:
Vaše jméno:
Váš e-mail: (nebude zveřejněn)

WWW stránka:
Opište text z obrázku:

Ahoj,

díky za tenhle fix, nasazení doporučovaných oprav vskutku není moc jednoduché. Doplnil jsem odkazy na tvé články na svůj blog, čím víc se o tomhle problému bude vědět, tím líp (zatím se mi zdá, že český Internet v této oblasti hezky chrápe). Nebylo by možné vytvořit alternativní balík pro IIS6? Přeci je jenom docela zhusta používán.

Je mi líto, ale vzhledem ke komplikované rozšiřitelnosti IIS to není možné. Resp. není to možné napsat v .NETu, patrně by bylo možné to napsat v nativním kódu jako ISAPI, ale to bohužel neumím.

Aha, to je pochopitelné vysvětlení. Takže by to chtělo čistokrevného céčkaře se zkušeností psaní ISAPI filtrů. Jenže než ten by to napsal a odladil, tak Microsoft (snad) vydá hotfix a bylo by to zbytečné.

Ta captcha je šílená, normálně mne vyzvala k zadání slova s francouzským accent grave nad E, interpunkční znaménka. No fuj:)

Nojo, ona není generovaná automatem, ale braná z reálných knížek.

o aký šifrovací algoritmus sa jedná?

V tomto případě o AES. Ale útok není veden na AES samotný, ale na padding v CBC modu. Podrobnější informace jsou ve slajdech, které najdete zde: http://netifera.com/research/

  • Altairis
  • Nemesis
  • Microsoft MVP
  • IIS
  • ASP.NET