Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.

February 14, 2015 / by Zsolt Soczó

.NET fejtörő 4. – megoldás

Kérdés: miért nem jó, ha az ASP.NET Machine Key-emet Random.NextBytes()-szal generálom?

A Machine Key-t alapban viewstate validálásra használja az ASP.NET. HMAC algoritmussal csinál egy hasht, amihez a Machine Key-t mint kulcsot is felhasználja. Ez a kevésbé problémás dolog. Ami sokkal veszettebb, hogy amikor beléptetünk valakit az ASP.NET forms security-vel, akkor a beléptetett felhasználót azonosító adatot ezzel a Machine Key-jel titkosítják. Ha valaki megismeri ezt a kulcsot, akkor tud generálni kamu kukit, amibe azt a user id-t ír be, amit csak akar. Azaz meg tud személyesíteni másokat. Ebből aztán lesz spoofing, vagy akár elevation of privilege. Magyarul senki nem szeretné, ha bárki más beléphetne a nevében egy védett website-on. Például az internetes bankjába.

Szóval, talán most már érthető, a Machine Key-t nem szeretnénk, ha bárki megszerezné vagy kitalálná. Megszerezni csak a site feltörésével lehet, és admin jogokkal, tegyük fel ez nem történt meg. Ha azonban a véletlen sorozat generátorunk kiszámítható, akkor más is ugyanazzal az algoritmussal tud generálni egy olyan kulcsot, amit én is generáltam. És már jönnek is be más nevében.

A .NET Random pszeudo-random generátor, azonos seed-del mindig ugyanaz a sorozat jön ki belőle. Azt mondjátok de én ravasz vagyok, és beadom a DateTime.Now.Ticket neki inputként, az úgysem tudja a támadó. Nem tudja, de pörgetni ő is tudja ezt a számot addig, amíg ki nem találja a megfelelő seedet.

Mi a megoldás? Olyan random generátor kell, ami teljesen kiszámíthatatlan. Pl. a termikus zaj digitalizálva tökéletesen jó erre a célra. Ha ilyen modul nincs a gépben, akkor a Windows megpróbál valami nagyon randommal kijönni, például összerakva olyan vad perf counter értékeket, mint a proci ventilátor sebessége és egyebek.

A lényeg, hogy ha cripto szinten random érték kell, akkor az RNGCryptoServiceProvider típust kell használni erre a célra.

Egyébként meg IIS 7.5-től machine key-t tud generálni az IIS Manager GUI is. :)

Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.

LEAVE A COMMENT

3 COMMENTS

  • Haraszti Gábor February 14, 2015

    Egy baj van ezzel Soci, hogy az NSA pont a véletlen szám generátorokba helyezett el backdoor-okat és nem lehet ebben sem megbízni, mert ha az NSA meg tudja jósolni a véletlen számot, akkor más is.

  • Haraszti Gábor February 15, 2015

    Hogy konstruktív is legyek :) TRNG-k:

    Itt egy teljesen GNU megoldás, kapcsolási rajzzal, NYÁK tervvel, leírással, mindennel: https://github.com/waywardgeek/infnoise/

    De van kész finn megoldás is: http://www.araneus.fi/products/alea2/en/

    És van egy csomó a neten egyéb, nem amerikai is.

    Nem csak a machine key-nek kell jó RNG, hanem minden megkezdett HTTPS session-nek is, mert a szimmetrikus session key-nek kell. Szóval nem árt TRNG-t rakni a szerverekbe!

  • Soczó Zsolt February 26, 2015

    Köszi Gábor, igazad van mindkét pontban. Egy termékben, ami egy kb. 30e eurós hardveres kripto eszköz, a doksijában explicit benne van, hogy NSA compatible. A slusz poén, ezt az eszközt használja a NAV is.
    Min csodálkozik ezek után Ildikó? :)