Soci (Soczó Zsolt) szakmai blogja

2015.02.14.

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

Filed under: .NET,IIS7,Security,Szakmai élet,Teaser — Soczó Zsolt @ 16:23

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. :)

3 Comments

  1. 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.

    Comment by Haraszti Gábor — 2015.02.14. @ 21:52

  2. 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!

    Comment by Haraszti Gábor — 2015.02.15. @ 12:31

  3. 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ó? :)

    Comment by Soczó Zsolt — 2015.02.26. @ 00:51

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.

Powered by WordPress