[LinuxFocus-icon]
Ev  |  Eri�imd�zeni  |  ��indekiler  |  Arama

Duyumlar | Belgelikler | Ba�lant�lar | LF Nedir
Bu makalenin farkl� dillerde bulundu�u adresler: English  Castellano  Deutsch  Francais  Nederlands  Portugues  Russian  Turkce  

convert to palmConvert to GutenPalm
or to PalmDoc

[image of the authors]
taraf�ndan Frédéric Raynal, Christophe Blaess, Christophe Grenier

Yazar hakk�nda:

Christophe Blaess ba��ms�z bir aeronotic m�hendisidir. Kendisi Linux hayran�d�r ve il�rerinin bir�o�unu Linux alt�nda yapmaktad�r. Linux Kaynakyaz�land�r�m Projesi (Linux Documentati�n Project) taraf�ndan yay�mlanan man sayfalar�n�n �evirilmesini y�netmektedir.

Christophe Grenier ESIEA'da ��renci olarak 5. y�l�ndad�r ve ayn� zamanda burada sistem y�neticili�i yapmaktad�r. Bilgisayar g�venli�i konusunda �zel merak� vard�r.

Frédéric Raynal, �evreyi kirletmedi�i, hormon kullan�lmad���, MSG veya hayvansal malzemeler kullan�lmad��� ve sadece tatl�dan olu�tu�u i�in Linux i�letim sistemini y�llard�r kullanmaktad�r.


��erik:

 

5. B�l�m - Uygulama geli�tirme s�ras�nda g�venlik a��klar�ndan ka��nmak : az rastlan�r ko�ullar

[article illustration]

�erviri : Erdal MUTLU

�zet:

Serimizin be�inci makalesinin konusu multitasking'den dolay� ortaya ��kan g�venlik sorunlar� ile ilgilidir. Az rastlan�r ko�ullar alt�nda s�re�ler, sadece kendilerinin eri�ti�ine "inand���" kaynaklara (dosya, ayg�t, bellek) ayn� anda ba�ka s�re�ler de eri�mektedir. Bu durum, ortaya ��kar�lmas� zor olan hatalara ve ayn� zamanda sistemin genelinde g�venlik a��klar�n�n olu�mas�na neden olmaktad�r.



 

Giri�

Az rastlan�r ku�ullar i�in genel ilke �udur : bir s�re� sistem kayna��n� sadece kendisi ula�mak istiyor. S�re�, ba�ka bir s�recin bu kayna�� kullan�p kullanmad���n� denetlemekte ve ondan sonra bu kayna��n kullan�m�n� ele ge�irmekte ve istedi�i gibi kullanmaktad�r. Problem, ilk s�recin kayna��n�n serbest olup olmad���n�n denetimi ile ger�ek kullan�ma ge�me zaman� aras�nda, ba�ka bir s�recin bu kayna�� kullanmak istedi�i durumda ortaya ��kmaktad�r. Sunu� duruma g�re de�i�iklik g�stermektedir. ��letim sistemleri teorisindeki klasik duruma g�re, her iki s�re� sonsuz d�ng�ye girer ve kilitlenirler. Pratikte ise, bu durum uygulamalar�n�n yanl�� �al��mas�na ve bir s�recin yanl���kla di�erinin haklar�ndan faydalanmas� durumunda ise, ger�ek g�venlik a��klar�na neden olmaktad�r.

Daha �nce kaynak olarak adland�rd���m�z seyin farkl� anlamlar� vard�r. Az rastlan�r ko�ullar�n bir�o�u, �ekirde�in bellek alanlar�n�n kullan�m�yla ilgili ortaya ��km��t�r ve d�zeltilmi�tir. Biz burada sistem uygulamalar�na odaklanaca��z ve ilgilenece�imiz kaynaklar da dosya sistemindeki inode'lar olacakt�r. Bu sadece s�radan dosyalar� de�il, ayn� zamanda /dev/ dizininde bulunan dosyalar arac�l��� ile sistem ayg�tlar�n�n kullan�m�n� da kapsamaktad�r.

Genelde sistem g�venli�ine y�nelik yap�lan sald�r�lar, Set-UID olan uygulamalara yap�lmaktad�r. Sald�r�y� yapan ki�i, program�n sahip oldu�u kullan�c� haklar�ndan yararland��� s�rece program� kullanacakt�r. Daha �nce anlatt���m�z g�venlik a��klar�na (bellek ta�mas�, bi�imlendirme katarlarlar�, ...) kar��n, az rastlan�r ko�ullar�n ortaya ��kartt��� g�venlik a��klar�, "�zel" program �al��t�r�lmas�na genellikle izin vermemektedir. Sadece program �al��t��� s�rece, program�n sahip oldu�u kaynaklardan yararlanmaya olanak sa�lamaktad�r. Bu �ekilde yap�lan sald�r�lar sadece Set-UID olan uygulamalara de�il, kullan�c�lar�n�n �al��t�rd��� "normal" uygulamalara y�nelik de yap�lmaktad�r. Sald�rgan, genellikle pusuda yatmakta ve ba�ka bir kullan�c�n�n, �zellikle "root" kullan�c�s�n�n ilgili program� �al��t�rmas�n� beklemektedir ki bu program�n sahip oldu�u kaynaklar� kullanabilsin. Kaynak kullan�m� bir dosyaya yazma (S�zgelimi, ~/.rhost dosyas�na "+ +" yazarak, herhangi bir bilgisayardan bu bilgisayara �ifresiz ve root haklar�na sahip olarak ula�abilmektedir.) veya gizli yada �nemli bilgiler i�eren dosyalardan okuma (�nemli ticari bilgileri, ki�isel sa�l�k bilgileri, �ifre dosyas� bilgileri, �zel anahtar bilgileri vs) haklar�na sahip olmaktad�r.

�nceki makalelerde konu�ulan g�venlik a��klar�ndan farkl� olarak, bu g�venlik sorunu Set-UID olan uygulamalar�n�, sistem sunucular�n�n�, daemonlar�n�, k�saca hert�rl� uygulamay� tehtid etmektedir.

 

�lk �rnek

�lk olarak, Set-UID olan ve kullan�c�n�n dosyas�na bilgi yazacak bir program�n davran��lar�n� inceleyelim. Biz, s�zgelimi sendmail gibi, elektronik ileti g�nderici yaz�l�m program�n� da ele alabilirdik. Diyelim ki, kullan�c� bir dosya ad� ile bu dosyaya yaz�lacak bilgiyi programa parametre olarak verebilsin. Buna g�re program, kendisini �al��t�ran ki�inin yaz�lacak dosyan�n sahibi olup olmad���n� denetleyecektir. Ayr�ca, dosyan�n sistem dosyalar�ndan birine ba�lant� dosyas� olup olmad���n� da denetlemesi gerekecektir. Unutmamak gerekir ki, Set-UID olan bir program, istedi�i dosyay� de�i�tirme hakk�na sahiptir. Buna g�re, kendi ger�ek UID ile dosya sahibinin kullan�c� numaras�n� kar��la�t�rmak gerekecektir. �imdi ��yle bir program yazal�m :

1     /* ex_01.c */
2     #include <stdio.h>
3     #include <stdlib.h>
4     #include <unistd.h>
5     #include <sys/stat.h>
6     #include <sys/types.h>
7
8     int
9     main (int argc, char * argv [])
10    {
11        struct stat st;
12        FILE * fp;
13
14        if (argc != 3) {
15            fprintf (stderr, "usage : %s file message\n", argv [0]);
16            exit(EXIT_FAILURE);
17        }
18        if (stat (argv [1], & st) < 0) {
19            fprintf (stderr, "can't find %s\n", argv [1]);
20            exit(EXIT_FAILURE);
21        }
22        if (st . st_uid != getuid ()) {
23            fprintf (stderr, "not the owner of %s \n", argv [1]);
24            exit(EXIT_FAILURE);
25        }
26        if (! S_ISREG (st . st_mode)) {
27            fprintf (stderr, "%s is not a normal file\n", argv[1]);
28            exit(EXIT_FAILURE);
29        }
30
31        if ((fp = fopen (argv [1], "w")) == NULL) {
32            fprintf (stderr, "Can't open\n");
33            exit(EXIT_FAILURE);
34        }
35        fprintf (fp, "%s\n", argv [2]);
36        fclose (fp);
37        fprintf (stderr, "Write Ok\n");
38        exit(EXIT_SUCCESS);
39    }

Daha �nceki makalede de anlatt���m�z gibi, Set-UID olan uygulaman�n ge�ici olarak sahip oldu�u haklar� bir yana b�rak�p, kendisini �a��ran kullan�c�n�n UID'si ile dosyay� a�may� denemesi daha iyi olacakt�r. Bu arada, yukar�daki program, bir daemon program�n, kullan�c�lara verdi�i hizmeti temsil etmektedir. Her zaman root olarak �al��arak kendi ger�ek UID'si yerine kullan�c� UID'sini denetleyebilir. Her neyse, ger�ek�i olmasa da sorunu anlamada ve g�venlik a����ndan "faydalanma" bak�m�ndan kolayl�k sa�lad��� i�in bu �emaya sad�k kalaca��z.

G�rd���n�z gibi program �al��t���nda, gerekli t�m denetimleri yerine getirmektedir, yani dosyan�n var olup olmad���n�, kullan�c�ya ait olup olmad���n� ve s�radan bir dosya olup olmad���n� denetlemektedir. Daha sonra dosya a��lmakta ve verilen bilgi i�ine yaz�lmaktad�r. ��te, g�venlik a���� da burada ortaya ��kmaktad�r! Daha a��k olmak gerekirse, g�venlik a����, stat() fonksiyonu ile dosya �zelliklerini belirlemekle, fopen() fonksiyonu ile de dosyay� ger�ekten a�ma aras�nda ge�en zaman dilimindedir. Bu zaman aral��� olduk�a k�sad�r, ancak sald�rgan, bu a��ktan faydalanabilir ve dosyan�n �zelliklerini bu arada de�i�tirebilir. Sald�r�m�z� kolayla�t�rmak ve bu arda gerekli de�i�ikli�i elle yapabilmek i�in, iki i�lem aras�nda ge�en zaman� art�ral�m. Daha �nce bo� olan 30. sat�ra s�recin uykuya yataca�� (bekleme) komutunu, a�a��daki gibi ekleyelim:

30        sleep (20);

�imdi, bir uygulama yapal�m. �lk �nce uygulamay� (program�), Set-UID root olarak ayarlayal�m. Ayr�ca, �ifrelerinin bulundu�u /etc/shadow dosyas�n�n bir yede�ini alal�m. Bu �ok �nemlidir.

$ cc ex_01.c -Wall -o ex_01
$ su
Password:
# cp /etc/shadow /etc/shadow.bak
# chown root.root ex_01
# chmod +s ex_01
# exit
$ ls -l ex_01
-rwsrwsr-x 1 root  root    15454 Jan 30 14:14 ex_01
$

Sald�rgan i�in her�ey haz�r. Kendi kullan�c�m�za ait bir dizindeyiz. G�venlik a���� ve Set-UID root olan bir uygulamam�z (ex_01) var. Yapmak istedi�imiz �ey ise, /etc/shadow �ifre dosyas�ndaki root kullan�c�s�na ait �ifreyi, bo� bir �ifreyle de�i�tirmektir.

�lk �nce fic ad�nda kendimize ait bir dosya yarat�yoruz:

$ rm -f fic
$ touch fic

Daha sonra uygulamam�z� arka planda �al��t�r�yoruz. Programdan, ona verdi�imiz dosyaya gerekli bilgiyi yazmas�n� istiyoruz. Program, gerekli denetimleri yapt�ktan sonra, dosyaya yazmadan once biraz beklemektedir.

$ ./ex_01 fic "root::1:99999:::::" &
[1] 4426

root sat�r�n�n i�eri�i, shadow(5) man sayfas�na g�re haz�rlanm��t�r ve en �nemli k�sm�, �ifre yok anlam�na gelen ikinci alan�n bo� olmas�d�r. Program beklemekte iken, fic dosyas�n� silip, /etc/shadow dosyas�na bir simgesel (symbolic) veya ger�ek (physical) ba�lant� yapmak (ikiside oluyor) i�in yakla��k 20 saniyemiz vard�r. Bir hat�rlatma yapal�m, isteyen herkes bir dosyaya, kendisinin dosyada okuma hakk� olmasa bile, kendi veya /tmp dizininde ba�lant� yaratabilir (bunu birazdan g�rece�iz). Dosyan�n bir kopyas�n�, ancak okuma hakk� oldu�u zaman olu�turulabilmektedir.

$ rm -f fic
$ ln -s /etc/shadow ./fic

Daha sonra kabuktan, ex_01 s�recini �n plana almas�n� istiyoruz ve program�n sonlanmas�n� bekliyoruz:

$ fg
./ex_01 fic "root::1:99999:::::"
Write Ok
$

��te, her�ey bitti! /etc/shadow dosyas�nda art�k, root kullan�c�s�na ait �ifre alan� bo�, yani �ifre yok. �nanm�yor musunuz?

$ su
# whoami
root
# cat /etc/shadow
root::1:99999:::::
#

Eski �ifre dosyas�n� yerine koyarak deneyimimizi tamamlayal�m:

# cp /etc/shadow.bak /etc/shadow
cp: replace `/etc/shadow'? y
#
 

Biraz daha ger�ek�i olal�m

Set-UID root olan bir uygulamada az rastlan�r ko�uldan dolay� ortaya ��kan g�venlik a����ndan faydalanmay� ba�ard�k. Tabii, dosyay� de�i�tirmek i�in 20 saniye zaman tan�makla program�n, bize olduk�a "yard�m�" dokundu. Ger�ek uygulamalarda ise, bu t�r zaman aral�klar� �ok k�sa olmaktad�r. Peki bunun i�in ne yap�labilir?

Genell prensip, denemeleri otomatik yapan kabuk programlar� kullanmak ve deneme say�s�n� y�zlerce, binlerce hatta onbinlerce kez tekrarlamak, yani aktif sald�r� y�ntemi kullan�lmaktad�r. G�venlik a����ndan faydalanabilme �ans�n� art�rmak, bizim durumuzda iki i�lem aras�ndaki zaman� art�rmak i�in �e�itli hilelerden faydalan�labilir. Buradaki ama�,dosya �zerindeki de�i�tirme i�lemini yerine getirmeden �nce, program� m�mk�n oldu�u kadar yava�latmakt�r. �stedi�imizi elde etmek i�in �e�itli yakla��mlar kullanabiliriz:

Az rastlan�r ko�ullar�n ortaya ��kartt��� g�venlik a��klar�ndan faydalanma y�ntemi tekrar gerektirmektedir ve olduk�a s�k�c� bir i�lemdir. Ayn� zamanda da olduk�a kullan��l�d�r! �imdi bizi ��z�me g�t�recek en etkili y�ntemleri bulmaya �al��al�m.

 

Olas� iyile�tirme

Yukar�da anlatt���m�z sorun, bir nesne �zerinde iki i�lem aras�nda ge�en zaman i�erisinde, bu nesnenin �zelliklerini de�i�tirebilmekte yatmaktad�r. S�radan kullan�c� olarak /etc/shadow dosyas�n� de�i�tirmek ve hatta okumak olduk�a zor bir i�lemdir. Ger�ekte, de�i�iklik dosyan�n var olan a�a� yap�s�ndaki ba�lant�s� ile fiziksel olarak dosyan�n kendisi aras�ndad�r. rm, mv, ln gibi sistem komutlar�n�n bir�o�unun dosya i�eri�i �zerinde de�il, dosya ad� �zerinde i�lem yapmaktad�rlar. rm ve unlink() sistem �a�r�s� ile dosya silme i�leminde bile, dosyan�n i�eri�i, ancak, dosyaya son fiziksel ba�lant�s� kesildikten sonra silinmektedir.

Dolay�s�yla, daha �nceki programda yapt���m�z hata, stat() ve fopen() i�lemleri aras�nda ge�en zaman diliminde, dosya ad� ile i�eri�i aras�ndaki ili�kinin sabit kalaca��n� d���nmemizdir. Bu ili�kinin hi� te sabit kalmad���n� anlamak i�in, dosyalardaki fiziksel ba�lant� �rne�ini ele alabiliriz. Kendimize ait olan bir dizinde, bir sistem dosyas�na ba�lant� olu�tural�m. Dosya ile ilgili olan dosyan�n sahibi ve eri�im haklar� de�i�meden kalacakt�r tabii. ln komutundaki -f se�ene�i sayesinde, ba�lant� i�in verilecek ayn� isimdeki bir dosya var olsa bile, ba�lant� yinede olu�turulmaktad�r:

$ ln -f /etc/fstab ./myfile
$ ls -il /etc/fstab myfile
8570 -rw-r--r--   2 root  root  716 Jan 25 19:07 /etc/fstab
8570 -rw-r--r--   2 root  root  716 Jan 25 19:07 myfile
$ cat myfile
/dev/hda5   /                 ext2    defaults,mand   1 1
/dev/hda6   swap              swap    defaults        0 0
/dev/fd0    /mnt/floppy       vfat    noauto,user     0 0
/dev/hdc    /mnt/cdrom        iso9660 noauto,ro,user  0 0
/dev/hda1   /mnt/dos          vfat    noauto,user     0 0
/dev/hda7   /mnt/audio        vfat    noauto,user     0 0
/dev/hda8   /home/ccb/annexe  ext2    noauto,user     0 0
none        /dev/pts          devpts  gid=5,mode=620  0 0
none        /proc             proc    defaults        0 0
$ ln -f /etc/host.conf ./myfile
$ ls -il /etc/host.conf myfile 
8198 -rw-r--r--   2 root  root   26 Mar 11  2000 /etc/host.conf
8198 -rw-r--r--   2 root  root   26 Mar 11  2000 myfile
$ cat myfile
order hosts,bind
multi on
$

/bin/ls komutundaki -i se�ene�i sayesinde, sat�r ba��nda dosyan�n sahip oldu�u inode numaras� g�r�nt�lenmektedir. Dolay�s�yla, ayn� dosya isminin iki farkl� inode numaras�n� i�aret etti�ini g�rmekteyiz.

Ger�ek �u ki biz, dosyan�n �zelliklerini denetleyen ve i�eri�ine ula�an fonksiyonlar�n, ayn� i�eri�e ve inode numaras�na sahip dosyaya ula�s�nlar isteriz. Ve bu m�mk�nd�r! �ekirde�in kendisi bize dosya eri�im numaras� (file descriptor) verdi�nde, dosya ad� ve i�eri�i aras�ndaki ili�kinin sabit kalmas�n� otomatik olarak sa�lamaktad�r. Okumak i�in bir dosyay� open() sistem �a�r�s� (system call) ile a�t���m�zda, bir tamsay� geri g�ndermektedir. Dosya eri�im numaras� olan bu tamsay�, dosya ad� ile i�eri�i aras�ndaki ili�kiyi, sistemin tuttu�u i� tablolarda sa�lamaktad�r. Daha sonra yap�lacak olan t�m okuma i�lemleri, dosya ad�na ne olursa olsun, dosya a�ma i�lemi s�ras�ndaki i�erik neyse, onun �zerinden yap�lacakt�r.

Bunu biraz daha vurgulayal�m: dosya bir kere a��ld�ktan sonra, dosya ad� ile ilgili yap�lacak t�m i�lemlerin, buna silmek te dahil, dosya i�eri�i �zerinde hi� bir etkisi olmayacakt�r. Dosya eri�im numaras�na sahip olan s�re�ler oldu�u s�rece dosyan�n, bulundu�u dizinden ad� silinse bile, i�eri�i disk �zerinden silinmeyecektir. open() ile close() sistem �a�r�lar� aras�nda ge�en zaman aral���nda, dosya i�eri�i ile olan ili�kinin sabit kalaca��n� �ekirdek garanti etmektedir.

O zaman ��z�m�m�z� bulduk demektir! �lk �nce i�e dosyay� a�makla ba�lamal� ve dosya �zelliklerini (haklar�n�), dosya eri�im numaras� arac�l�yla daha sonra denetlemelidir. Bunun i�in stat()gibi �al��an, ancak dosya ad� yerine, dosya eri�im numaras� parametre olarak alan fstat() sistem �a�r�s�n� kullanabiliriz. Daha sonra dosya �zerinde G� (IO=Input Output, G�=Giri� ��k��) yapmak i�in fopen() gibi �al��an, ancak dosya ad� yerine, dosya eri�im numaras� parametre olarak alan fdopen() fonksiyonunu kullanaca��z. Dolay�s�yla program, a�a��daki gibi olmaktad�r:

1    /* ex_02.c */
2    #include <fcntl.h>
3    #include <stdio.h>
4    #include <stdlib.h>
5    #include <unistd.h>
6    #include <sys/stat.h>
7    #include <sys/types.h>
8
9     int
10    main (int argc, char * argv [])
11    {
12        struct stat st;
13        int fd;
14        FILE * fp;
15
16        if (argc != 3) {
17            fprintf (stderr, "usage : %s file message\n", argv [0]);
18            exit(EXIT_FAILURE);
19        }
20        if ((fd = open (argv [1], O_WRONLY, 0)) < 0) {
21            fprintf (stderr, "Can't open %s\n", argv [1]);
22            exit(EXIT_FAILURE);
23        }
24        fstat (fd, & st);
25        if (st . st_uid != getuid ()) {
26            fprintf (stderr, "%s not owner !\n", argv [1]);
27            exit(EXIT_FAILURE);
28        }
29        if (! S_ISREG (st . st_mode)) {
30            fprintf (stderr, "%s not a normal file\n", argv[1]);
31            exit(EXIT_FAILURE);
32        }
33        if ((fp = fdopen (fd, "w")) == NULL) {
34            fprintf (stderr, "Can't open\n");
35            exit(EXIT_FAILURE);
36        }
37        fprintf (fp, "%s", argv [2]);
38        fclose (fp);
39        fprintf (stderr, "Write Ok\n");
40        exit(EXIT_SUCCESS);
41    }

Bu sefer 20. sat�rdan sonraki program�m�z�n �al��mas�n�, dosya ad� �zerinde yap�lan hi�bir de�i�iklik (silme, de�i�tirme, ba�lant� kurma) etkilemeyecektir ve orijinal fiziksel dosyan�n i�eri�i korumnu� olacakt�r.

 

Genelle�tirme

Demekki, dosya �zerinde i�lem yaparken, dosyan�n ger�ek i�eri�i ile g�sterilimi aras�ndaki ili�kinin sabit kald���n� sa�lamak gerekir. Dolay�s�yla, tercihimiz, dosya ad� �zerine de�il de, daha �nceden a��lm�� ve dosya eri�im numaras� �zerinde i�lem yapan, a�a��daki sistem �a�r�lar�n� kullanmak olmal�d�r:

Sistem �a�r�s� Kullan�m�
fchdir (int fd) fd ile g�sterilen dizine gider.
fchmod (int fd, mode_t mode) Dosya eri�im haklar�n� de�i�tir.
fchown (int fd, uid_t uid, gid_t gif) Dosya sahibini de�i�tirir.
fstat (int fd, struct stat * st) Fiziksel dosyan�n eri�im numaras� ile birlikte tutulan bilgilere ula��r.
ftruncate (int fd, off_t length) Var olan dosyan�n i�eri�ini siler.
fdopen (int fd, char * mode) Dosya �zerinde G� (IO) yap�lmas�n� sa�lamaktad�r. Bu bir sistem �a�r�s� de�il, stdio k�t�phanesinde tan�mlanm�� bir fonksiyondur.

��e dosyay� open() sistem �a�r�s� ile istenilen eri�im d�zeninde a�makla (yeni dosya yarat�rken ���nc� parametreyi unutmay�n) ba�lamal�. Ge�ici dosya yarat�rken open() sistem �a�r�s� �zerinde ayr�nt�l� olarak duraca��z.

Sistem �a�r�lar�n� kullan�rken, d�n�� de�erleri mutlaka denetlenmelidir. Az rastlan�r ko�ullar ile ilgili olmasa da, d�n�� de�erlerini denetlememenin �nemini, /bin/login program�ndaki eski bir hatadan s�z ederek g�sterelim. Bu uygulama, /etc/passwd dosyas�n� bulamad��� zaman, otomatik olarak sisteme root olarak girilmesini sa�lamaktayd�. E�er, zarar g�rm�� bir dosya sistemini tamir etmek amac�yla olursa bu durum kabul edilebilirdi. Di�er taraftan, dosyan�n ger�ekte var olup olmad���n� denetlemeden, sadece dosya a��lam�yor diye, b�yle bir davran��ta bulunulmas� pek kabul edilebir de�ildir. En b�y�k dosya eri�im say�s�na eri�tikten sonra, /bin/login program� �al��t�rlmas� sisteme root olarak girmeye yeterli olmaktad�r. Sistem g�venli�i i�in d�nu� ve hata de�erlerini denetlemenin �neminde s�z etmeyi bir yana b�rakal�m ve konumuza devam edelim..

 

Dosya i�eri�i ile ilgili az rastlan�r ko�ullar

Sistem g�venli�ini ilgilendiren bir program, bir dosyaya eri�irken sadece kendisinin eri�ti�ini kabul ederek hareket etmemelidir. Ayn� dosya �zerinde olu�abilecek ar rastlan�r ko�ullar� ortadan kald�rmak gerekmektedir. En �nemli tehlike, Set-UID root olan bir program� kullan�c� ayn� anda bir ka� adet �al��t�rarak veya ayn� daemon program�yla birden fazla ba�lant� kurmaya �al��arak, az rastlan�r ko�ul yarat�p, bu arada dosyan�n i�eri�ini daha �nceden �ng�r�lmemi� bir �ekilde de�i�tirmesinde ortaya ��kmaktad�r.

Bu durumun �n�ne ge�ebilmek i�in, bir dosya �zerine ayn� anda sadece bir program�n ula�abilece�i bir y�ntem geli�tirmelidir. Bu veritaban� sistemlerinde, birden fazla kullan�c�n�n ayn� dosya �zerinden sorgu yapmas� veya de�i�iklik yapmak istemesi sorunu ile ayn�d�r. Sorunumuzun ��z�m�, dosya kilitleme y�ntemidir.

Dosya �zerinde veya dosyan�n bir k�sm�nda bir yazma i�lemei olaca�� zaman, s�re�, �ekirdek taraf�ndan buray� kilitlemesini istemektedir. Kilit s�recin elinde bulundu�u s�rece, ba�ka hi� bir s�re� ayn� dosya veya dosyan�n ayn� k�sm� i�in kilit isteyemiyor. Dolay�s�yla, dosya �zerine bir yazma i�lemi yapmadan �nce, s�re� bu dosya i�in bir kilit elde etmekte ve yazma i�lemini ger�ekle�tirmektedir. Bu arada dosyay� ba�kas� de�i�tirememektedir.

Ger�ekte sistem daha ak�ll� davranmaktad�r. �ekirdek, dosya yazma ile dosyadan bilgi okuma ama�l� verilen kilitleri ayr� tutmaktad�r. Dolay�s�yla, dosya i�eri�i de�i�tirilmeyece�i i�in, birden fazla s�re�, dosya okuma kilidi elde edebilir. Ancak, ayn� anda sadece bir s�re� yazma kiliti alabilir ve bu arada ba�ka s�re�lere okuma kilidi dahi verilmez.

Birbiri ile uyumlu olmayan iki tip kilit vard�r. �lki BSD sistemlerinden gelmekte ve flock() sistem �a�r�s� ile elde edilmektedir. Sistem �a�r�s�na verilen ilk parametre, kilitlemek istenilen dosyan�n, dosya eri�im numaras�d�r. �kinci parametre ise, yap�lacak i�lemi nitelendiren bir sabittir. Sabitin alaca�� de�erler �unlard�r : LOCK_SH (okumak i�in kilitle), LOCK_EX (yazmak i�in kilitle), LOCK_UN (kiliti serbest b�rak). �stenilen kilitleme �ekli elde edilene kadar program beklemektedir. Ancak, istenilirse, LOCK_NB se�ene�i, ikili VEYA | ile birle�tirilebilir. Bu durumda, kilit elde edilemedi�inde, sistem �a�r�s� geri d�nmektedir ve b�ylece d�n�� de�eri denetlenerek, program beklemekte kurtulabilir.

�kincisi kilitleme �ekli, System V sistemlerinden gelmektedir ve fcntl() sistem �a�r�s� ile olmaktad�r. Ancak kullan�m� biraz kar���kt�r. Ayn� �ekilde �al��masa da, lockf() ad�nda bir k�t�phane fonksiyonu da vard�r. fcntl() sistem �a�r�s�n�n ilk parametresi, i�lem yap�lacak dosyan�n eri�im numaras�d�r. �kinci parametre yap�lacak i�lemi nitelendirmektedir : F_SETLK kilit elde edilemezse hemen geri d�nmektedir ve F_SETLKW kilit elde edilene kadar beklemektedir. F_GETLK se�ene�i ile kilit hakk�nda bilgi edinmek m�mk�nd�r (Bu bizim durmda bir anlam ifade etmemektedir.). ���nc� parametre ise, kilit hakk�nda bilgi edinebilece�imiz struct flock tipinde bir veri yap�s�na i�aret eden bir i�aret�idir. flock veri yap�s�n�n elemanlar� �unlard�r:

Ad Tip Anlam�
l_type int Beklenen �al��ma �ekli : F_RDLCK (okumak i�in kilitleme), F_WRLCK (yazmak i�in kilitleme) ve F_UNLCK (kiliti a�mak i�in).
l_whence int l_start alan� ba�lang�c� (genelde SEEK_SET).
l_start off_t Kilitin ba�lang�� yeri (genelde 0).
l_len off_t Kilitin uzunlu�u, dosya sonuna kadar ise 0 .

G�rd���n�z gibi fcntl() ile dosyan�n bir k�sm�n� kilitlemek m�mk�nd�r. Dolay�s�yla, flock() sistem �a�r�s�na g�re daha fazla i�levi vard�r. Parametre olarak kilitleme yapaca�� dosya isimlerini alan ve kullan�c�n�n Enter tu�una basana kadar (kiliti a�mak i�in) bekleyen �rnek bir program� ele alal�m.

1    /* ex_03.c */
2    #include <fcntl.h>
3    #include <stdio.h>
4    #include <stdlib.h>
5    #include <sys/stat.h>
6    #include <sys/types.h>
7    #include <unistd.h>
8
9    int
10   main (int argc, char * argv [])
11   {
12     int i;
13     int fd;
14     char buffer [2];
15     struct flock lock;
16
17     for (i = 1; i < argc; i ++) {
18       fd = open (argv [i], O_RDWR | O_CREAT, 0644);
19       if (fd < 0) {
20         fprintf (stderr, "Can't open %s\n", argv [i]);
21         exit(EXIT_FAILURE);
22       }
23       lock . l_type = F_WRLCK;
24       lock . l_whence = SEEK_SET;
25       lock . l_start = 0;
26       lock . l_len = 0;
27       if (fcntl (fd, F_SETLK, & lock) < 0) {
28         fprintf (stderr, "Can't lock %s\n", argv [i]);
29         exit(EXIT_FAILURE);
30       }
31     }
32     fprintf (stdout, "Kilitleri kald�rmak i�in Enter tu�una bas�n�z\n");
33     fgets (buffer, 2, stdin);
34     exit(EXIT_SUCCESS);
35   }

�lk giri� ekran�ndan (console) program� �al��t�ral�m :

$ cc -Wall ex_03.c -o ex_03
$ ./ex_03 myfile
Kilitleri kald�rmak i�in Enter tu�una bas�n�z
Ba�ka bir giri� ekran�ndan da...
    $ ./ex_03 myfile
    Can't lock myfile
    $
�lk giri� ekran�nda Enter tu�una basarak, kiliti a�a�yoruz.

lpd uygulamas�n�n flock() sistem �a�r�s�n� kullanarak /var/lock/subsys/lpd dosyas�n� sadece kendisi kullanacak �ekilde kilitledi�i gibi, bu kilitleme �ekli az rastlan�r ko�ullar� �nlemektedir. benzer bi�imde, pam'�n fcntl() kullanarak kullan�c� ile ilgili /etc/passwd dosyas�ndaki bilgileri g�venli bir �ekilde de�i�tirilebilir.

Ancak, dosya �zerinde okuma veya yazma yapmadan �nce, �ekirdekten gerekli eri�im iznini sa�layan programlar bu �ekilde davranmaktad�r. Dolay�s�yla biz i�birli�i kilitinden s�z ediyoruz demektir, yani okuma veya yazma yapmadan �nce �ekirdekten izin alma. Buna ra�men, bu �ekilde yaz�lmam�� bir program, ba�ka bir s�re� �ekirdekten yazmak i�in kilit alm�� olsa da, dosyan�n i�eri�ini de�i�tirebilir. ��te bu duruma bir �rnek. Bir dosya i�erisine birka� karakter yaz�p, daha �nceki program ile kilitliyoruz :

$ echo "FIRST" > myfile
$ ./ex_03 myfile
Kilitleri kald�rmak i�in Enter tu�una bas�n�z
Ba�ka bir giri� ekran�ndan dosyan�n i�eri�ini de�i�tirebiliriz:
    $ echo "SECOND" > myfile
    $
�lk giri� ekran�na d�necek olursak, "hasar�" g�rece�iz:
(Enter)
$ cat myfile
SECOND
$

Bu sorunu ��zmek i�in Linux �ekirde�i, System V'den gelen bir kilitleme y�ntemini sistem y�neticisinin hizmetine sunmaktad�r. Dolay�s�yla bu y�ntem, flock() ile de�il, ancak fcntl() ile kullan�labilir. Sistem y�neticisi i�ekirde�e, fcntl() ile elde edilen kilitlerin kesin olduklar�n�, belli eri�im haklar� kombinasyonu ile s�yleyebilir. Ondan sonra bir s�re� bir dosya i�in yazmak ama�l� bir kilit elde etmi�se, herhangi ba�ka bir s�re� (root bile) dosyay� de�i�tiremez. Eri�im haklar� kombinasyonu ��yledir : Set-GID bit aktif hale getirilirken, dosya sahibinin ait oldu�u gruptan, �al��t�rma biti kald�r�l�r. Bunun i�in a�a��daki komut kullan�labilir :

$ chmod g+s-x myfile
$
Ancak, bu yeterli de�ildir. Bir dosya �zerine kesin kilit koyabilmek i�in, dosyan�n bulundu�u b�lme i�in mandatory ad� verilen bir se�ene�inin belirtilmi� olmas� gerekmektedir. Bu genellikle, /etc/fstab dosyas�nda, mand se�ene�ini 4. s�t�na eklemekle veya a�a��daki komutlar� �al��t�rmak ile m�mk�nd�r :
# mount
/dev/hda5 on / type ext2 (rw)
[...]
# mount / -o remount,mand
# mount
/dev/hda5 on / type ext2 (rw,mand)
[...]
#
�imdi, ba�ka bir giri� ekran�ndan de�i�iklik yapman�n m�mk�n olmad���n� denetleyebiliriz:
$ ./ex_03 myfile
Kilitleri kald�rmak i�in Enter tu�una bas�n�z
Ba�ka bir giri� ekran�ndan :
    $ echo "THIRD" > myfile
    bash: myfile: Resource temporarily not available
    $
�lk ekrana tekrar d�nelim :
(Enter)
$ cat myfile
SECOND
$

Kesin kilit kullan�l�p kullanmayaca��na programc� de�il, sistem y�neticisi karar vermektedir (s�zgelimi /etc/passwd, veya /etc/shadow dosyas� i�in). Ortam d�zg�n bir �ekilde ayarland�ktan sonra, dosya �zerindeki bilgilere nas�l ula��laca��n� programc� denetlemektedir. Dolay�s�yla, dosya �zerinde yazma i�lemi yap�l�rken, okuma i�leminin tehlikeli olup olmad���na programc� karar vermektedir.

 

Ge�ici dosyalar

Olduk�a s�k rastlanan bir durum, programlar�n disk �zerindeki dosyalarda ge�ici bilgi tutmas� gerekmesidir. En �ok rastlanan durum, bir dosyan�n aras�na bir yere bilgi eklemek gerekti�i zaman ortaya ��kmaktad�r. Bunun i�in dosyan�n bir kopyas�, yeni bilgiler de eklenerek, yarat�lmaktad�r. unlink() sistem �a�r�s�, orijinal dosyay� silmektedir ve rename() ile ge�ici dosyan�n ad� de�i�tirilmektedir.

Ge�ici dosya a�ma i�lemi, e�er d�zg�n yap�lmazsa, hasta ruhlu bir kullan�c� i�in, az rastlanan ko�ullar yaratmaktad�r. Ge�ici dosyalar ile ilgili g�venlik a��klar� yak�nlarda, Apache, Linuxconf, getty_ps, wu-ftpd, rdist, gpm, inn vs gibi uygulamalarda ortaya ��km��t�r. Bu sorundan ka��nmak i�in, baz� noktalar� hat�rlatal�m.

Ge�ici dosya a�ma i�lemi genellikle, /tmp dizininde yap�lmaktad�r. Buras�n�n, sistem y�neticisi i�in anlam�, ge�ici bir s�reyle dosyalar�n tutuldu�u bir yerdir. Dolay�s�yla, buras�n� zaman zaman temizleyen (silen), genellikle cron da ayarlanan, programlar yaz�labilir veya dizini ayr� bir b�lmeye koyarak, her sistem a��l���nda, yeniden bi�imlendirilebilir. Sistem y�neticisi genellikle, de�ici dosyalar�n nerede yer alaca��n�, <paths.h> ve <stdio.h> dosyalar�ndaiki _PATH_TMP ve P_tmpdir simgesel sabitlerde tan�mlamaktad�r. Asl�nda, /tmp yerine ba�ka bir dizin kullanmak pek ak�ll�ca bir davran�� de�ildir. Nedenine gelince, bu dizini kullanan t�m programlar�, buna C k�t�phanesi de dahil olmak �zere, yeniden derlemek gerekecektir. Ancak, GlibC k�t�phaneleri i�in TMPDIR �evre de�i�keni tan�mlanabilir. Dolay�s�yla, kullan�c�lar, /tmp dizini yerine, kendilerine ait dizinlerde ge�ici doya yaratabilirler. �ok b�y�k ge�ici dosya kullanan uygulamalar i�in ve de /tmp i�in ayr�lm�� b�lme k���k oldu�unda, bu durum ka��n�lmazd�r.

/tmp sistem dizini sahip oldu�u eri�im haklar�ndan dolay� �zel bir yerdir :

$ ls -ld /tmp
drwxrwxrwt 7 root  root    31744 Feb 14 09:47 /tmp
$

t karakteri, sekizli say� taban�na g�re 01000, ile belirtilen Sticky-Bit'in dizin �zerinde �zel bir anlam� vard�r. Buna g�re, sadece dizin sahibi, bu durumda root veya dosyan�n sahibi, dosyay� silebilir. Dizin i�inde, sistem y�neticisinin yapaca�� bir sonraki temizleme i�lemine kadar, her kullan�c� g�venli bir �ekilde dosya yarat�p saklayabilir.

Ancak, ge�ici dosyalar�n konuldu�u dizin beraberinde ba�ka sorunlar getirebilir. S�zgelimi, en basitinden, Set-UID root olan ve kullan�c� ile haberle�en bir uygulamay� ele alal�m. Elektronik ileti ta��ma program�n� ele alal�m. Sistem kapan��� s�ras�nda programa, i�lerini ani bir �ekilde bitirmesi anlam�na gelen, SIGTERM veya SIGQUIT sinyalleri g�nderilirse, program kullan�c�n�n o anda yazmakta oldu�u, ancak hen�z g�ndermedi�i e-iletisini kay�t edecektir. Program�n eski s�r�mleri bunu /tmp/dead.letter ad� alt�nda kay�t etmektedirler. S�radan kullan�c�lar /tmp dizinde dosya yaratabildikleri i�in, /etc/passwd dosyas�na dead.letter ad� alt�nda bir fiziksel ba�lant� olu�turup, e-ileti programlar�n� �al��t�rarak yazmaya devam ettikleri mesaj�n yerine "root::1:99999:::::" de yer ald��� �ifre dosyas�n�n i�eri�ini elde etmi� olurlar.

Bu davran���n ilk sorunu, dosya ad�n�n �nceden biliniyor olmas�d�r. Program� ilk incelidi�imizde, /tmp/dead.letter dosya ad�n� hemen ke�if edebiliyoruz. Dolay�s�yla ilk yap�lmas� gereken, �al��an programa �zg� dosya ad� olu�turmak olmal�d�r. Bu ama�la, ge�ici ve bize �zg� dosya ad� olu�turan bir �ok k�t�phane fonksiyonu vard�r.

Ge�ici dosya ad� olu�turan b�yle bir fonksiyonun oldu�unu kabul edelim. Ancak, yaz�l�m serbest olarak da��t�ld���ndan ve hatta C k�t�phanesinin bile kaynak programlar�na ula�abildi�imizden, bizar daha zor olsa da, bu dosya ad�n� da �nceden ��renmek m�mk�nd�r. Dolay�s�yla sald�rgan, C k�t�phanesinin olu�turdu�u dosya ad� ile ba�ka bir dosya aras�nda ba�lant� kurabilir. Bu durumda bizim ilk tepkimiz, dosyay� a�madan �nce b�yle bir dosya olup olmad���n� denetlemek olmal�d�r. Bunu i�in a�a��daki gibi bir program par�as� kullanabiliriz:

  if ((fd = open (filename, O_RDWR)) != -1) {
    fprintf (stderr, "%s already exists\n", filename);
    exit(EXIT_FAILURE);
  }
  fd = open (filename, O_RDWR | O_CREAT, 0644);
  ...

A��kt�r ki b�yle bir program par�as� ile, az rastlan�r ko�ullar�n ortaya ��kart��� g�venlik a���� yaratm�� oluruz. Kullan�c�, open() fonksiyonunun ilk �a��r�lmas� ile ikincisi aras�nda, /etc/passwd dosyas�na ba�lant� yaratabilir. �ki i�lem, aralar�nda ba�ka bir i�lem girmeyecek �ekilde atomik olarak veya tek olarak yap�lmak zorundad�r. Bu open() sistem �a�r�s�na verilen �zel bir se�enek ile m�mk�nd�r. O_EXCL ve O_CREAT se�enekleri kullan�ld���nda fonksiyon, dosyan�n var olup olmad���n� denetlemekte, varsa hata vermekte, ancak denetleme ve yaratma i�lemi kesintisiz olarak (atomik) yap�lmaktad�r.

Bu arada, fopen() fonksiyonuna bir Gnu uzant�s� olan 'x' se�ene�i ile de bu i�lem yap�labilmektedir :

  FILE * fp;

  if ((fp = fopen (filename, "r+x")) == NULL) {
    perror ("Can't create the file.");
    exit (EXIT_FAILURE);
  }

Ge�ici dosyalar�n dosya eri�im haklar� da �nem ta��maktad�r. 644 (dosya sahibi okuyup yazabilir, di�er kullan�c�lar okuyabilir) eri�im haklar�na sahip bir ge�ici dosyaya �nemli bilgiler yaz�lmas� sa�mal�k olur.

       #include <sys/types.h>
       #include <sys/stat.h>

       mode_t umask(mode_t mask);
Fonksiyonu ile dosya yaratma s�ras�ndaki eri�im haklar� d�zenlenebilir. B�ylece, fonksiyon umask(077) olarak �al��t�r�ld���nda, bundan sonra yarat�lacak dosya 600 eri�im haklar�na (dosya sahibi okuma ve yazma, di�er kullan�c�lar hi�bir hakka sahip de�il) sahip olacakt�r.

Genellikle, ge�ici dosya yaratma i�lemi �� ad�mdan olu�maktad�r:

  1. Tekil dosya ad� (rastgele) olu�turma.
  2. O_CREAT | O_EXCL ve m�mk�n en �ok k�s�tlanm�� dosya eri�im haklar�yla dosyay� a�mak.
  3. Dosya a�ma i�leminin sonucunu denetleyerek, hata olu�mas� durumunda gerekeni yapmak (yeniden denemek veya programdan ��kmak).

Ge�ici dosyaya nas�l sahip olabiliriz?

      #include <stdio.h>

      char *tmpnam(char *s);
      char *tempnam(const char *dir, const char *prefix);

Fonksiyonlar�, rastgele yarat�lm�� dosya i�in bir i�aret�i g�ndermektedir.

�lk fonksiyona NULL parametresi vererek, statik bir katar adresi elde edebiliriz. Buras�n�n i�eri�i, bir sonraki tmpnam(NULL) ile de�i�tirilmektedir. E�er parametre bir karakter katar� ise, bunun i�in katar�n boyutu en az L-tmpnam byte olmal�d�r, olu�turulan isim buraya kopyalanmaktad�r. Katar ta�malar�na dikkat! _POSIX_THREADS veya _POSIX_THREAD_SAFE_FUNCTIONS sabitleri tan�ml� olduklar� zaman, olu�abilecek sorunlar hakk�nda fonksiyonun man sayfas�nda uyar�lar vard�r.

tempnam() fonksiyonu, karakter katar�na bir i�aret�i geri g�ndermektedir. dir dizini "uygun" ("uygun" kelimesinin anlam�n� fonksiyonun man sayfas�nda anlat�lmaktad�r) olarak verilmelidir. Fonksiyon dosya ad�n� geri g�ndermeden �nce, b�yle bir dosya olup olmad���n� denetlemektedir. Ancak, fonksiyonun man sayfas�nda bunun kullan�m� tavsiye edilmemi�tir. Fonksiyonun farkl� uyarlamalar�na g�re "uygun" kelimesi farkl� anlamlara gelebilir. Gnome, fonksiyonun a�a��daki gibi kullan�lmas�n� tavsiye etmektedir:

  char *filename;
  int fd;

  do {
    filename = tempnam (NULL, "foo");
    fd = open (filename, O_CREAT | O_EXCL | O_TRUNC | O_RDWR, 0600);
    free (filename);
  } while (fd == -1);
Buradaki d�ng� riskleri azaltmakta, ama anyn� zamanda ba�kalar�n� yaratmaktad�r. Ge�ici dosyan�n yarat�laca�� b�lme dolu oldu�u veya sistemde a��lm�� dosya say�s� en fazla de�ere ula�t��� zaman ne olacakt�r?

       #include <stdio.h>

       FILE *tmpfile (void);
Fonksiyonu tekil ada sahip bir dosya yaratarak a�maktad�r. Bu dosya kapan�� s�ras�nda otomatik olarak silinmektedir.

GlibC-2.1.3 ile birlikte bu fonksiyonlar tmpnam() deki gibi bir y�ntem kullanarak dosya yaratarak a�maktad�rlar. Daha sonra dosya silinmektedir, ancak Linux, dosyay� kullanan t�m s�re�ler onu serbest b�rakt���nda, yani close() sistem �a�r�s� �al��t�r�ld��� zaman, dosya sistemden ger�ekte silinmektedir.

  FILE * fp_tmp;

  if ((fp_tmp = tmpfile()) == NULL) {
    fprintf (stderr, "Can't create a temporary file\n");
    exit (EXIT_FAILURE);
  }

  /* ... ge�ici dosyan�n kullan�m� ... */

  fclose (fp_tmp);  /* sistemden ger�ekte silindi�i yer */

Basit kullan�mlarda, hatta ba�ka s�rece devredeceksek bile, dosya ad�na gereksinim duymay�z, sadece ge�ici alan� okuma ve veri saklamak i�in kullan�r�z. Dolay�s�yla, ge�ici dosyan�n ad�na gereksimimiz olmamaktad�r ve i�eri�ine ula�mam�z yeterlidir. tmpfile() fonksiyonu bunu ger�ekle�tirmektedir.

Fonskiyonun man sayfas�nda hi� bir�ey yazmamaktad�r, ama Secure-Programs-HOWTO nas�l dosyas�nda bu fonksiyonun kullan�m�n� tavsiye etmektedir. Yazara g�re, fonskiyonun �zellikleri aras�nda dosya yartma ile ilgli bir garanti verilmemi�tir ve kendisi t�m var olan fakl� uyarlamalar� denetleme firsati bulamam��t�r. Buna ra�men, bu kullan�lan en etkin fonksiyondur.

Son olarak,

       #include <stdlib.h>

       char *mktemp(char *template);
       int mkstemp(char *template);
fonksiyonlar�, "XXXXXX" ile verilen bir modele g�re tekil isim olu�turmaktad�r. Tekil dosya ad� elde edilecek �ekilde 'X' ler de�i�tirilmektedir.

mktemp() fonksiyonun s�r�mlerine g�re, ilk be� 'X' s�recin numaras� ile de�i�tirilerek, sadece bir 'X' rastgele olu�turulmaktad�r, dolay�syla geriye sadece bir karakter tahmin etmek kal�yor. Fonksiyonun baz� s�r�mlerinde ise, alt� adet olan 'X' lerin say�s�n� art�rmak m�mk�nd�r.

mkstemp(), Secure-Programs-HOWTO nas�l kayna��nda tavsiye edilen fonksiyondur. ��te kullan�m y�ntemi:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>

 void failure(msg) {
  fprintf(stderr, "%s\n", msg);
  exit(1);
 }

/*
 * Ge�ici bir dosya yarat�r ve geri g�nderir.
 * Yaratt�ktan sonra, dosya silinmektedir, dolay�s�yla
 * dizin listelendi�inde g�r�nmemektedir.
 */
FILE *create_tempfile(char *temp_filename_pattern)
{
  int temp_fd;
  mode_t old_mode;
  FILE *temp_file;

  /* Dosyay� k�s�tl� haklar ile yarat */
  old_mode = umask(077);
  temp_fd = mkstemp(temp_filename_pattern);
  (void) umask(old_mode);
  if (temp_fd == -1) {
    failure("Ge�ici dosya a��lamad�");
  }
  if (!(temp_file = fdopen(temp_fd, "w+b"))) {
    failure("Ge�ici dosyan�n eri�im numaras� yarat�lamad�.");
  }
  if (unlink(temp_filename_pattern) == -1) {
    failure("Couldn't unlink temporary file");
  }
  return temp_file;
}

Bu fonksiyonlar ta��nabilirlik ile genelle�tirme aras�ndaki sorunlar� g�stermektedir. Yani, standart k�t�phane fonksiyonlar� gerekli genelle�tirmeyi sa�lamaktad�r, ancak onlar�n uyarlanma �ekilleri sisteme g�re farkl�l�k g�stermektedir (ta��nabilirlik). S�zgelimi, tmpfile() fonksiyonu ge�ici dosyalar� farkl� �ekilde a�maktad�r (baz� s�r�mler O_EXCL se�ene�ini kullanmamaktad�r) veya mkstemp() fonksiyonunun farkl� uyarlamalar� 'X' leri farkl� �ekilde kullanmaktad�r.  

Sonu�

Ayn� kaynak kullan�ld��� durumdaki az rastlan�r ko�ullar �zerinde durduk. �ki i�lemin, denetimin �ekirdekte olmad��� s�rece ard���k olarak yap�ld���n� varsaymamak gerekir. E�er, farkl� threadlerdeki ortak de�i�kenler, shmget() ile payla�t�r�lan ortak bellek alanlar� gibi, az rastlan�r ko�ullar g�venlik a��klar� olu�turuyorsa, ba�ka kaynaklara dayanarak bunlar� ihmal etmemek gerekir. Bulunmas� zor hatalardan ka��nmak i�in, eri�im denetleme y�ntemleri (s�zgelimi semaphore'lar) kullan�lmal�d�r.

 

Ba�lant�lar


 

Bu yaz� i�in g�r�� bildiriminde bulunabilirsiniz

Her yaz� kendi g�r�� bildirim sayfas�na sahiptir. Bu sayfaya yorumlar�n�z� yazabilir ve di�er okuyucular�n yorumlar�na bakabilirsiniz.
 talkback page 

G�rsely�re sayfalar�n�n bak�m�, LinuxFocus Edit�rleri taraf�ndan yap�lmaktad�r
© Frédéric Raynal, Christophe Blaess, Christophe Grenier, FDL
LinuxFocus.org

Buray� klikleyerek hatalar� rapor edebilir ya da yorumlar�n�z� LinuxFocus'a g�nderebilirsiniz
�eviri bilgisi:
fr -> -- Frédéric Raynal, Christophe Blaess, Christophe Grenier
fr -> en Georges Tarbouriech
en -> tr Erdal MUTLU

2001-08-13, generated by lfparser version 2.17