Dokumentumok védelme, egy kicsit másképp

2011.02.21. 14:34 | Alice és Udi | Szólj hozzá!

Címkék: verseny programozás dokumentumok itscc2010

Az ITSCC 2010 negyedik feladatának (PDF) kitalálásakor az lebegett a szemünk előtt, hogy adjunk a versenyzőknek, egy olyan feladatot, amelyik azon kívül, hogy triviális, mindennapi problémát vet fel, a megoldásban mégis meg lehessen villantani a „hacker” gondolkodást.

Mi is volt a feladat? Írjon egy web alkalmazást, ahova bejelentkezett felhasználók dokumentumokat tölthetnek fel. Ezeket a dokumentumokat csak a bejelentkezett felhasználok tölthetik le. Kicsit megsózzuk jogosultságkezeléssel,  tartalom szűréssel, objektum menedzsmenttel, és el is készült egy teljesen átlag, „Bevezetés a web alkalmazás programozásba” órára beadandó dolgozat. Látszólag. Itt jönnek be ugyanis a csavarok:
 

  • A web alkalmazás nem használhat adatbázist
  • Nem használhat a fejlesztő publikus keretrendszert
  • Nincs konfigurációs jog a szerveren
  • Nem telepíthetünk semmilyen plugint, modot a szerverre
  • A dokumentumok elérhetők HTTP-n, vagy HTTPS-en keresztül.

Ezek az extra kritériumok elsőre szőrszálhasogatónak tűnhetnek, ezért hadd meséljem el, mi volt az ötlet a feladat mögött. Egyszer, egy unalmasabb pillanatomban elgondolkodtam, hogy milyen jó lenne, ha lenne egy pofonegyszerű PHP web alkalmazás, amellyel megoszthatom különféle fájljaimat az ismerősökkel, de nem az internettel. Jó lenne, ha az egyszerűsége mellett megfelelően védené a rá bízott adatokat. Arra gondoltam, hogy ezt az alkalmazást használhassa bármelyik átlagos felhasználó, aki képes regisztrálni magának egy ingyenes PHP képes webhelyet. Annyi legyen az összes feladata, hogy felmásolja a fájlokat, és out-of-box már működik is a dokumentum megosztás, egy beégetett felhasználóval. Elgondolkoztam a problémán, majd leprogramoztam egy POC megoldást. Egész csomó rafinált biztonsági kérdést felvetett a feladat.

Hogy oldanánk meg a hozzáférés szabályozását? Legkézenfekvőbb session alapon. No, de mi alapján autentikálunk? Hát a szokásos select * from users where… Nincs adatbázis. Hogy mented a felhasználónevet, és a jelszót? Fájlba? Ha sikerült valahogy lekezelni az autentikáció kérdését, akkor hogy érjük el a feltöltött dokumentumokat. Ennek a megoldása volt igazándiból a feladat lényege, a többi inkább csak finomság. Egészen rossz elgondolás, hogy egy oldalra kirakjuk a linkeket az állományokra, és ennek az oldalnak hozzáférését korlátozzuk. Bár normál felhasználás során tényleg csak akkor fogja a felhasználó látni a linkeket, ha már bejelentkezett, de mi van akkor, ha Alice, aki néha nem túlságosan figyel oda a részletekre, kimásolja a linket, és úgy küldi el Bobnak, egy mindannyiunk által ismert e-mail és kereső szolgáltatóval? A link innentől máris nyílvános, és semmilyen mechanizmus nem fogja meggátolni a szervert, hogy kiszolgálja a közvetlen file GETeket. Ez csak egy látszólagos biztonság, amit azonban szerintem már többen is láthattunk gyakorlatban. Itt azonban gondolhatnánk valami rafinált konfigurációs, htaccess-es megoldásra, de a kiírás szerint nincs konfigurációs jogod.

Mindenképpen valahogy a saját kezünkben kell tartani a hozzáférést a fájlokhoz, és biztosítani, hogy lehetőleg csak a mi módszerünkkel találják meg az állományokat, mondjuk egy getFile.php?file= URL-en keresztül. Ilyenkor megvalósításokban a kezelő egy bináris folyamot nyit a fájlra, és azt másolja be a HTTP válaszba, majd elküldi a böngészőnek. A mi esetünkben is így a legegyszerűbb megoldani a kérdést, és itt jön be a végső csavar. Mire nyisson folyamot a letöltő kezelőnk? Hol legyen a fájl, és ha már ott van, hogy biztosítjuk, hogy ne férhessen hozzá illetéktelen? A megoldás nyilvánvaló: A fájlt a docrooton kívül kell tárolni, ahol azonban tud a webszerverünk olvasni, és majd így biztonságosan megszerezhető a fájl.

Ez itt még mindig a ITSCC 2010, és nem mentünk át észrevétlenül a „Bevezetés a web alkalmazás programozásba” órára. A feladat konkrétan kimondja, hogy a feltöltött fájloknak a web felöl elérhetőnek kell lenniük. Titkoltan arra is kíváncsiak voltunk, hogy a programozónak eszébe jut e az örökérvényű klisénk: Nincs tökéletes biztonság. Jó biztonság azonban, ha egy adott akadály leküzdésére annyi erőforrást kell áldozni, hogy a támadót eltántorítsa*. Bár sokan próbálták a docrooton kívül helyezni, a feladat tökéletesen megoldható a docrooton belül is. A kérdés csupán annyi: Hogy? Következő cikkünkben elemezgetjük a született megoldásokat, de addig is: Te hogyan oldottad volna meg ezt a problémát?

PS: Még egy bonusz kérdés: Ha fájlba mented a felhasználók adatait, akkor ugye az is eszedbe jut, hogy ezt a fájlt nehogy megtekinthessék illetéktelenek?

*. Lásd PGP. Senki sem mondja, hogy feltörhetetlen, csak azt, hogy kicsit sokáig tart.

A bejegyzés trackback címe:

https://aliceesbob.blog.hu/api/trackback/id/tr62677063

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása