Den Sun, 23 Nov 2003 10:36:03 +0100 skrev Kasper Dupont:
>Kent Friis wrote:
>>
>> Den Sun, 23 Nov 2003 00:59:53 +0100 skrev Kasper Dupont:
>> >
>> >-u
>>
>> Den kendte jeg ikke lige. Men jeg kan stadig ikke se den store fordel
>> i at slette brugeren, og fornemmer stadig et par potentielle ulemper
>> (om ikke andet så er der en race-condition hvor en anden useradd der
>> kører i det øjeblik imellem userdel og useradd kan nå at snuppe uid'en).
>
>Tja? Det med at UIDen bliver snuppet er nok nemt at undgå, hvis
>man ved, hvordan det bliver tildelt. I øvrigt mener jeg sagtens
>man med -u kan lave to accounts med samme UID, med de konsekvenser,
>som det nu engang har.
Det blev det da kun værre af. Så har den bruger der ikke skulle have
adgang til noget som helst lige pludselig adgang til at ændre filer
der burde være spærret.
>Hvis der er mulighed for en race condition med uheldige
>konsekvenser kan man selvfølgelig vælge en anden fremgangsmåde.
>Der er andre nemme løsninger.
>
>>
>> Var det ikke dig selv der nævnte logout-scripts?
>
>Jeg sagde det skulle ske ved logout, ikke at det skulle ske i
>et logout script.
Ah, ok. Lille detalje, stor forskel.
>> >> Jeg ville nok vælge at gøre det ved login i stedet.
>> >>
>> >> >Det eneste problem jeg ikke lige har fundet en løsning
>> >> >på er, hvordan man på pålidelig vis stopper alle
>> >> >processer hørende til den givne bruger.
>> >>
>> >> kill -15 -1; sleep 1; kill -9 -1
>> >>
>> >> som brugeren, IKKE SOM ROOT!!! (-1 = alt).
>> >
>> >Antag en ondskabsfuld bruger, som ønsker at lave et program,
>> >som overlever proceduren. Programmet fanger det første signal,
>> >og slår processen i hjel inden det andet signal når at blive
>> >sendt. Findes der en metode, hvor det er umuligt for et
>> >ondskabsfuldt program at overleve?
>>
>> Jeg kan ikke lige finde en løsning der ikke kræver at man skal
>> igang med at kode, og selv der kan det blive svært at få ram på
>> en process der skifter pid hele tiden.
>
>Jeg ville nok vælge at skrive et C program til at gøre det.
>Men programmer der laver numre i retning af:
> if (fork()) _exit(0);
>og samtidig prøver at slå min process ihjel, kan nok blive et
>problem. Det bedste jeg lige kan komme i tanke om er:
Hvis du kører den som root, er det uinteressant om den prøver på at
slå din process ihjel.
>for (i=0;i<42;++i) {
> pid_t child=fork();
> switch (child) {
> case 0: if (!setuid(uid)) kill(-1,SIGKILL); _exit(0);
setuid... ok, den mulighed havde jeg ikke tænkt over. Så kan du stadig
ramme alle PID'er på en gang, uden at processen burde have en chance
for at undgå det ved at skifte PID, til gengæld har du igen problemet
med at brugeren har en (lille) chance for at ramme den.
Jeg ville nu stadig give den en SIGTERM først og vente et par
sekunder, inden for-løkken.
> case -1: sleep(1); break;
> default: waitpid(child,NULL,0);
> }
>}
Mvh
Kent
--
Help test this great MMORPG game -
http://www.eternal-lands.com/