Spolecne r/w soubory v programu

Pavel Kankovsky peak na argo.troja.mff.cuni.cz
Čtvrtek Prosinec 23 17:44:06 CET 2004


On Tue, 14 Dec 2004 jindra na sarson.cz wrote:

> pisi multiplatformi hru a chtel bych nekam uladat score. Z dostupne
> dokumentace jsem se docetl, ze by to melo byt nekam do /var/games.
> Problem nastava s pravy, jak zaridit, aby vsichni meli rw pristup do
> daneho adresare. Dival jsem se, jak to delaji ostatni a vetsinou se to
> resi pouzitim univezalni uzivatelske skupiny game a nastaveni sticky
> bitu u hry.

Takze zacneme tim, ze to neni "sticky bit", ale "setgid bit".

Nicmene cely problem je mnohem slozitejsi nez technicke reseni toho, jak 
programu v Pythonu vnutit ten setgid bit.

Na jedne strane je pozadavek, aby kod, ktery pobezi se zvysenymi
pristupovymi pravy (tedy s tou skupinou games) byl co nejmensi a tedy byla
co nejmensi sance, ze v nem bude dira (je treba si uvedomit, ze problem
nespociva pouze v tom, ze nekdo zfalsuje svoje skore, ale take muze kvuli
sdileni jedne skupiny falsovat skore v dalsich hrach, a co je jeste horsi,
muze do prislusnych souboru zkusit napsat libovolny nesmysl a pokusit se
zautocit na kod, ktery tyhle soubory cte, a ziskat tak pristup k cizim
uzivatelskym uctum!).

Na druhe strane je pozadavek, aby herni mechanismus byl jako celek chranen
pred manipulaci ze strany uzivatele, aby zaznamenane skore odpovidalo 
vysledkum nejake skutecne regulerni hry.

Osobne povazuji prvni pozadavek za dulezitejsi nez druhy. Nicmene existuje
urcity zpusob, jak dosahnout rozumne kombinace obou pozadavku: uzivatel
nebude spoustet primo skript, ale "obal" ("wrapper") naprogramovany v C
nebo podobnem jazyce, ktery bude mit setuid na skupinu games a ktery bude
delat nasledujici veci:

- vytvori komunikacni kanal K (napr. rouru)

- vycisti prostredi procesu (environment, argumenty...) od vseho, co tam 
  neni bezpodminecne potreba

- spusti dalsi proces, vrati se nevratne k puvodni skupine 
  (rgid = getrgid(); setregid(rgid, rgid)) a spusti bez pouziti execve()
  (napr. tedy pres libpython) vlastni hru, ktera bude nove vysledky 
  posilat pres kanal K

- spusti kod (at uz sam, v sobe, nebo pres dalsi program), ktery
  bude cist informace o novych vysledcich z K a zapisovat je nekam
  do /var/games

Jeste lepsich vysledku by slo dosahnout oddelenim uzivatelskeho rozhrani a
herniho enginu, ale to uz muze vyzadovat vetsi zasahy do architektury
programu (na druhou stranu jsou to prakticky ty same zasahy a ty same
problemy, co jsou potreba v pripade, ze chcete hrat tu hru s vice hraci po
siti).

Neni to jednoduche ani moc elegantni, ale tak uz to chodi.

Doporucena literatura: David D. Clark, David R. Wilson: A Comparison
of Commercial and Military Computer Security Policies. In Proc. IEEE 
Symposium on Security and Privacy, pp. 184-194, 1987. Elektronicka kopie
tohoto zakladniho dila v oboru pocitacove bezpecnosti je k nalezeni
na CiteSeeru. :)

--Pavel Kankovsky aka Peak  [ Boycott Microsoft--http://www.vcnet.com/bms ]
"Resistance is futile. Open your source code and prepare for assimilation."



Další informace o konferenci Linux