Ndodheni ne: Guidat / Apache / Linux
symlinks

Shmangja e Problemeve të Sigurisë nga Symlinks

Nga më 20 October 2011 në Apache, Linux me 6 Komente

Symlinks janë në sistemet UNIX, ekuivalente me shortcuts në Windows. Kjo guidë do ju tregojë një teknikë të thjeshtë dhe të aksesueshme nga kushdo për të mbrojtur serverat shared nga problemet e sigurisë që Symlinks krijojnë.

Çfarë është një Symlink?

Symlink (Symbolic Link ose Soft Link) është një tip i veçantë skedari që përmban lidhje me një skedar tjetër në sistemet UNIX dhe çdo derivat të tij. Praktikisht mund ta konsideroni si shortcuts në sistemet Windows.

Nëse do doja të krijoja një Symlink të skedarit “/home/feniksi/skedari.php” në skedarin “/home/luani/feniksi.php”, do shkruaja një komandë si më poshtë:

 INI |  Kopjo Kodin |? 
1
ln -s /home/feniksi/skedari.php /home/luani/feniksi.php

Komanda “ln”, nëse thërritet pa parametrin “-s”, krijon Hard Links, të cilat janë të ndryshëm në koncept nga Symlinks. Duke shtuar parametrin “-s”, linku i krijuar është Symlink. Në rastin më sipër, kam krijuar një Symlink për “skedari.php” të quajtur “feniksi.php”.

Një Symlink referencon direkt skedarin origjinal, qoftë në egzekutim apo lexim. Kjo e fundit, pra leximi i skedarëve origjinalë duke krijuar Symlinks, është edhe tema e kësaj guide.

Siguria lidhur me Symlinks

Problemi nga të cilët vuajnë serverat shared është se i lejojnë sulmuesëve të krijonë Symlinks që referencojnë skedarë që nuk u përkasin. Nëse këto skedarë janë opsione konfigurimi të viktimave, që përmbajnë të dhënat e databazës apo fjalëkalimin e administratorit, teknika bëhet vërtetë e rrezikshme. Serveri Web më popullor në planet, Apache, e ka të aktivizuar automatikisht opsionin “FollowSymlinks”, gjë që e bën vulnerabël.

Le të shohim një skenar se si sulmuesi mund të përdorë Symlinks për të marrë të dhëna sensitive nga viktima.

  1. Sulmuesi ngarkon “php shell” tek llogaria e tij në server ose mund të ketë akses direkt në shell, për të egzekutuar komanda.
  2. Krijon një Symlink të skedarit të konfigurimit të viktimës.
  3. E lexon atë skedar dhe merr të dhënat e konfigurimit.

Duke mbetur në skenarin më sipër, sulmuesi mund të egzekutonte një komandë të tillë:

 INI |  Kopjo Kodin |? 
1
ln -s /home/viktima/public_html/konfigurimi.php /home/sulmuasi/public_html/newfolder/konfigurimi.php

Skedari “konfigurimi.php” i viktimës mund të ketë të dhënat e databazës së viktimës, gjë që ja bën shumë të lehtë punën sulmuesit. I mjafton të ngarkojë një aplikacion PHP që menaxhon databazat MySQL dhe të vendosë të dhënat e marra nga viktima. Automatikisht ka akses të bëjë gjithçka me atë databazë, qoftë ta manipulojë apo ta fshijë.

Edhe nëse FollowSymlinks nuk është e aktivizuar në Apache, sulmuesi mund ta aktivizojë me .htaccess duke vendosur +FollowSymlinks. Gjithashtu mund të bëjë që skedarët PHP të lexohen si tekst, duke shtuar AddHandler dhe AddType respektive, përsëri në .htaccess.

 INI |  Kopjo Kodin |? 
1
+FollowSymlinks
2
 
3
AddHandler txt .php
4
AddType txt .php

Si të mbroheni nga Symlinks

Metoda që do ju tregoj funksionon për pjesën më të madhe të rasteve dhe do ju sigurojë që Symlinks mos të abuzohen nga njerëz me qëllime përfitimi. Duke qenë se ka pasur shumë sulme të tilla, sidomos kohët e fundit me përhapjen e teknikës, ju këshilloj të merrni masa të menjëhershme. Më poshtë do ju tregoj 2 teknika, ose më mirë 2 raste në bazë të nivelit të aksesit që keni në server: Administrator ose Klient i një serveri shared.

Administratorët

Nëse jeni administrator i serverit, mund të shmangni problemet duke konfiguruar Apache-n që të mos lejojë mbivendosjen e opsionit FollowSymlinks. Konfigurimi është fare i thjeshtë dhe mund ta bëjë kushdo.

Fillimisht gjeni vendodhjen e skedarit të konfigurimit të Apache: httpd.conf. Kjo varet nga mënyra e instalimit. Psh, mund të jetë tek: /usr/local/apache/conf/httpd.conf.

Hapeni skedarin “httpd.conf” me një editor dhe gjeni rreshtin: . Duhet të duket e ngjashme me:

 INI |  Kopjo Kodin |? 
1
<Directory "/">
2
	Options ExecCGI -FollowSymLinks Includes IncludesNOEXEC Indexes MultiViews SymLinksIfOwnerMatch
3
	AllowOverride All
4
</Directory>

Direktiva “AllowOverride All” do të thotë se Apache i lejon të mbivendosen lokalisht opsionet përmes .htaccess. Kjo s’na intereson, sepse i lejon sulmuesëve të mbivendosin opsionin FollowSymlinks dhe të përfitojnë nga Symlinks. Do përcaktoj një listë të vetëm atyre opsioneve që na interesojnë të mbivendosen, duke i bllokuar të tjerat.

Tek “AllowOverride All” ndryshojeni në “AllowOverride AuthConfig FileInfo Indexes Limit Options=Includes,Indexes,MultiViews”. Duhet të duket si më poshtë:

 INI |  Kopjo Kodin |? 
1
<Directory "/">
2
	Options ExecCGI -FollowSymLinks Includes IncludesNOEXEC Indexes MultiViews SymLinksIfOwnerMatch
3
	AllowOverride AuthConfig FileInfo Indexes Limit Options=Includes,Indexes,MultiViews
4
</Directory>

Pasi ta keni bërë ndryshimin dhe ta keni ruajtur skedarin, bëni restart Apache-n. Zakonisht mjafton të shkruani komandën më poshtë, por kjo varet nga distro e Linux dhe mënyra e instalimit.

 INI |  Kopjo Kodin |? 
1
service httpd restart

Në këtë moment e keni siguruar serverin tuaj nga problemet e sigurisë që Symlinks krijojnë. Nëse një sulmues do tentojë të aktivizojë opsionin FollowSymlinks, në atë direktori do të shfaqet “Internal Server Error”. Një ndryshim shumë i vogël, por me rëndësi të madhe për të ruajtur integritetin të dhënave në serverin tuaj.

Nëse përdorni opsionet automatike të WHM, në shumë raste ai e rindërton konfigurimin e Apache. Sigurohuni të kontrolloni nëse AllowOverride është kthyer në “All”, apo ka mbetur si ç’e shkruajta më lart.

Klientët

Klientët normalisht nuk kanë akses në opsionet e konfigurimit të Apache, kështu që alternativat janë më të pakta. Por, për fat të mirë, pjesa më e madhe e serverave shared lejojnë krijimin e skedarëve .htaccess për të mbivendosur konfigurimet bazë të Apache.

Fillimisht krijoni një skedar me emër “.htaccess” (pika është e rëndësishme) në direktorinë ku ndodhet skedari i konfigurimit. Më pas, hapeni me një editor dhe vendosni kodin më poshtë:

 INI |  Kopjo Kodin |? 
1
<Files "konfigurimi.php">
2
Order Deny,Allow
3
Deny from All
4
</Files>

Kjo i bllokon të gjitha tentativat për të aksesuar skedarin, qoftë nga interneti apo përmes Symlinks. Emri “konfigurimi.php” është thjeshtë si shembull dhe normalisht do duhet ta ndërroni me emrin e skedarit tuaj të konfigurimit. Gjithashtu, do ju duhet të bëni të njëjtin veprim për çdo skedar që përmban të dhëna kritike.

Siguroni skriptet PHP nga funksionet e rrezikshme

Me zgjidhjen e problemeve nga Symlinks, ju mbetet edhe një gjë tjetër po aq e thjeshtë që i përket vetëm administratorëve të serverave. Bëhet fjalë për bllokimin e disa funksioneve të rrezikshme të PHP që mund të përdoren nga sulmuesit për të kryer dëme.

Gjeni skedarin e konfigurimit të PHP-së, php.ini, dhe hapeni me një editor. Bëni ndryshimet në direktivat e shënuara më poshtë:

 INI |  Kopjo Kodin |? 
1
cgi.force_redirect = 0;
2
cgi.fix_pathinfo = 0;
3
cgi.discard_path = 1;
4
disable_functions = disk_total_space, diskfreespace, apache_note, apache_setenv, closelog, debugger_off, debugger_on, define_syslog_variables, escapeshellarg, escapeshellcmd, ini_restore, openlog, passthru, pclose, pcntl_exec, popen, proc_close, proc_get_status, proc_nice, proc_open, proc_terminate, shell_exec, syslog, system, url_exec, base64_encodem, readlink, eval, glob, root, symlink;

Gjithashtu, për të mos lejuar që klientët të përdorin php.ini individuale dhe për të mos lejuar që klientët ti ndryshojnë ose ti fshijnë funksionet e rrezikshme në “disable_functions”, mjafton të ndryshoni konfigurimin e suPHP, i cili ndodhet në: /opt/suphp/etc/suphp.conf.

Hapeni atë skedar dhe gjeni rreshtat më poshtë:

 INI |  Kopjo Kodin |? 
1
[phprc_paths]
2
;Uncommenting these will force all requests to that handler to use the php.ini
3
;in the specified directory regardless of suPHP_ConfigPath settings.
4
;application/x-httpd-php=/usr/local/lib/
5
;application/x-httpd-php4=/usr/local/php4/lib/
6
;application/x-httpd-php5=/usr/local/lib/

Ndryshojini në:

 INI |  Kopjo Kodin |? 
1
[phprc_paths]
2
;Uncommenting these will force all requests to that handler to use the php.ini
3
;in the specified directory regardless of suPHP_ConfigPath settings.
4
application/x-httpd-php=/usr/local/lib/
5
application/x-httpd-php4=/usr/local/php4/lib/
6
application/x-httpd-php5=/usr/local/lib/

Në fakt thjeshtë kam hequr komentet, dmth pikë-presjet “;” nga çdo direktivë. Do ju duhet të bëni restart edhe një herë Apache-t dhe në fund të çaktivizoni Safe Mode në php.ini.

 INI |  Kopjo Kodin |? 
1
safe_mode = Off

Si ekstra, do ju sugjeroja të çaktivizoni disa komanda për klientë dhe ti lini vetëm për administratorin. Këtë mund ta bëni përmes SSH (Secure Shell), duke shkruar rreshtat më poshtë:

 INI |  Kopjo Kodin |? 
01
chmod 0700 /bin/ln
02
chmod 0700 /bin/su
03
chmod 0700 /bin/cat
04
chmod 0700 /bin/pwd
05
chmod 0700 /bin/kill
06
chmod 0700 /bin/doexec
07
chmod 0700 /bin/link
08
chmod 0700 /bin/chmod
09
chmod 0700 /bin/netstat
10
chmod 0500 /bin/ps
11
chmod 0700 /bin/df
12
chmod 0700 /usr/bin/lynx
13
chmod 0700 /usr/bin/gcc
14
chmod 0700 /usr/bin/nc
15
chmod 0700 /usr/bin/wget
16
chmod 0700 /usr/bin/scp
17
chmod 0700 /usr/bin/cvs
18
chmod 0700 /usr/bin/telnet
19
chmod 0700 /usr/bin/symlinks
20
chmod 0500 /usr/bin/w
21
chmod 0500 /usr/bin/who
22
chmod 0500 /usr/bin/free
23
chmod 0500 /usr/bin/vmstat
24
chmod 0700 /usr/bin/ld
25
chmod 0700 /usr/bin/tail
26
chmod 0700 /usr/bin/tailf
27
chmod 0700 /usr/bin/du
28
chmod 0700 /usr/bin/find
29
chmod 0700 /usr/bin/whoami
30
chmod 0700 /usr/bin/ld86
31
chmod 0700 /usr/bin/ldd
32
 
33
 
34
chmod 0700 /usr/lib/gcc
35
chmod 0700 /usr/lib/gcc-lib
36
 
37
chmod 700 /usr/bin/perlcc
38
chmod 700 /usr/bin/byacc
39
chmod 700 /usr/bin/yacc
40
chmod 700 /usr/bin/bcc
41
chmod 700 /usr/bin/kgcc
42
chmod 700 /usr/bin/cc
43
chmod 700 /usr/bin/gcc
44
chmod 700 /usr/bin/i386*cc
45
chmod 700 /usr/bin/*c++
46
chmod 700 /usr/bin/*g++
47
chmod 700 /usr/lib/bcc /usr/lib/bcc/bcc-cc1
48
chmod 700 /usr/i386-glibc21-linux/lib/gcc-lib/i386-redhat-linux/2.96/cc1

Përfundimi

Me vetëm disa ndryshime të thjeshta konfigurimi, siguruam që serverat shared të mos vuajnë nga problemet që sjellin Symlinks. Qofshit Administratorë apo thjeshtë Klientë të një serveri, hapat e mësipërm mund të ndiqen nga kushdo, me çdo nivel eksperience në Linux dhe menaxhim serverash web. Më e rëndësishmja është që bllokoni një sulm shumë të përhapur që mund ti rrezikojë shumë të dhënat tuaja personale.

Luan Gjokaj

Luani është student i dizajnit grafik në Firence të Italisë. Mbi të gjitha, pasioni i tij më i madh janë rrjetat kompjuterike, ku është dhe themeluasi i TheHosting ME, kompani hostimi. Gjithashtu është një adhuruas i zjarrtë i muzikës Heavy Metal.

6 Komente

  1. cmok says:

    Prap se prap sdo te thot qe nuk ekzistojn menyra per ti rikthyer ca nga keto funksione, e ndoshta edhe gjitha prap ;)

    • Luan Gjokaj says:

      Nese keni lexuar tekstin me larte e kupton qe kjo nuk behet “bypass” sepse ndryshimi eshte ne konfigurim te apache, dhe deaktivon override per SymLink. Vetem nese je root.

  2. cmok says:

    & nice one by the way ;)

  3. brian says:

    This is a much better solution, that doesn’t require turning off half the server’s functionality:

    http://forums.cpanel.net/f185/how-prevent-creating-symbolic-links-non-root-users-202242-p2.html#post996441

    This patches Apache to force it to always not follow sym links if the owner doesn’t match the destination, which neatly fixes this. With the patch, the symlink issue is solved 100%, with the above, it’s not necessarily completely solved.

  4. Luka says:

    Shume bukur Luan megjithse nuk kam shume njohuri per serverat por artikulli me ndihmoje te kupja shume gjera ;)

  5. Faton says:

    Nese fjala osht vetem per file-in config.php ku ruhet t’dhanat e DBs ateher krejt kjo mundet mu mbrojt nese file-it i ndrohet owneri i bohet apache si dhe te drejtat e file-it i behen 0600, keshtu qe edhe nese bohet sym link apet ska drejta me lexu permbajten e file-it. Nashta s’osht praktik e mir po eshte me e shpejt.

Shkruaj një Koment