SlideShare a Scribd company logo
1 of 48
Download to read offline
Drupal biztonság




         
Ki célpont?




      
”mi nem vagyunk célpontok”
   Az adatok értékesek 
     (pl. tematizált email 
     címlista az {user} 
     táblából)
   A látogatók értékesek
   Minden gép számít 
     (botnetek)
   Vandálkodni jó :)


                         
Ki célpont?




    Mindenki

       
Biztonságról általában
   Csak biztonságos és nem 
      biztonságos oldal van, nincs 
      félig biztonságos
   Egy rossz sor kód is elég 
      ahhoz, hogy bárki bármit 
      tehessen az oldalunkkal / 
      szerverünkkel
   A webfejlesztő is programozó, 
      ugyanúgy kell nekünk is 
      törődnünk a biztonsággal, 
      mint annak, aki az amerikai 
      védelmi hivatalnak fejleszt.


                             
Hálózati biztonság
   Titkosított protokollok használata (FTP és HTTP 
      (feltöltés) kerülendő)
   Wi­Fi esetén WPA titkosítás
   Total Commander nem jelszómegőrző




                      
Így hallgathatlak le téged




             
Bárki lehallgathat
   Nem csak a képzett ”crackerek”
            sudo ifconfig wlan0 down
            sudo iwconfig wlan0 mode monitor
            sudo ifconfig wlan0 up
            sudo wireshark




                           
Megoldások
   SSL­lel titkosított protokollok használata:
              FTPS
              SFTP
              HTTPS
              SSH
   VPN




                         
Szerverbeállítások
   FastCGI (DDoS ellen jobb)
   PHP
              suhosin használata
              php.ini
                       open_basedir
                       disabled_functions
                       disabled_classes
                       safe_mode kikapcsolása (hamis biztonságérzet, 
                          gyakorlatban nem sokat véd)


                                  
Formok biztonsága
   a hidden (és bármilyen más) mezők tartalmai 
      ugyanúgy módosíthatóak a felhasználók által! 
      (meglepően sok oldal törhető így)
   szerencsére ezt a form api kivédi




                       
JavaScript
   A JavaScript által végzett ellenőrzés csak kényelmi 
     szolgáltatás, minden ellenőrzést el kell végezni a 
     szerver oldalon is!




                       
Drupal biztonság




         
Alapok
   Soha, de soha ne nyúljunk a core kódhoz!




                      
Alapok
   Használjuk a Drupal függvényeit és API­jait
              Nálunk tapasztaltabb emberek írták
              Könnyű megtanulni őket
              Hosszú távon úgyis gyorsabban végezzük el a 
                feladatainkat




                              
Alapok
   Minimális jogosultságok mindenkinek
   A következő jogosultságok megadásával odaadjuk 
     a siteunkat:
              Administer content types
              Administer users
              Administer permissions
              Administer filters
              Administer site configuration


                               
Input formats
   Amit csak nagyon megbízható felhasználóknak 
     engedünk:
              Full HTML
              PHP




                            
Access control
   Használd:
              node_access
              user_access
              hook_menu




                              
hook_menu()
   'access callback'
              ezzel a függvénnyel ellenőrzi a Drupal, hogy az adott 
                 felhasználó jogosult­e az oldal megnézésére
              alapértelmezett érték: user_access
   'access arguments'
              egy tömb, ami paraméterként adódik át
              user_access esetén elég egy elem, a jogosultság neve




                              
hook_menu()
   Rossz példa:
            function hook_menu() {
                   return array(
                         'foobar' => array(
                               'access callback' => TRUE,
                         ),
                   );
            }



                            
hook_menu()
   Még egy rossz példa
            function hook_menu() {
                 return array('foobar' => array(
                        'access callback' => user_access('some 
                          permission'),
                 ));
            }




                           
hook_menu()
   Jó példa
    function hook_perm() { return array('do sg with my module'); }
    function hook_menu() {
             return array( 'foobar' => array(
                    'access arguments' => array('do sg with my 
                      module'),
             ));
    }




                              
Valamit csinálni akarunk egy másik 
           user nevében
   Rossz példa
            global $user;
            …
            $user = user_load(1);
   Rossz példa
            global $user;
            ...
            $user­>uid = 1;


                             
Valamit csinálni akarunk egy másik 
           user nevében
   Jó példa
            global $user;
            …
            session_save_session(FALSE);
            $user = user_load(1);
   Ha nem muszáj a jelenlegi userre hivatkozni, akkor 
     ne használjuk az user változót



                             
SQL injection
   Adatbázisrétegnél volt 
     róla szó
   Mindig kritikus hiba




                       
Feltöltött fájlok
   Mindig ellenőrizni:
              méret
              kiterjesztés
              felbontás (képek esetén)
   file_check_location()
   Lehetőleg soha ne include­oljunk felhasználó által 
     feltöltött fájlt



                               
CSRF
<img src=”http://drupal.org/logout”/>




                  
CSRF
   Cross­site request forgery




                       
Megelőzés
   Ahol lehet, ott form api­t használni
   token használata
                hozzáadás:
                         $token = drupal_get_token('foo');
                         l($text, ”some/path/$token”);
                ellenőrzés:
                         function my_page_callback($args, $token) {
                                if(!drupal_valid_token($token, 'foo'))
                                        drupal_access_denied();
                                else {
                                        ...
                                }
                         }
                                    
XSS
   Cross site scripting




                        
XSS példa
   Node címek listázása saját theme függvénnyel:
            $output = '<li>' . $node­>title . '</li>';
            return $output;
   Mi van, ha a node címe a következő?
            '<script>alert(”U R H4XXD LULZ”);</script>'




                             
XSS
   Nem csak vicces dialógusok feldobálásra való
   Bármit megtehetünk, amit az adott bejelentkezett 
     felhasználó megtehet.




                       
Példa

$.get(Drupal.settings.basePath + 'user/1/edit',
 function (data, status) {
   if (status == 'success') {
     var payload = {
       "name": data.match(/id="edit-name" size="[0-9]*" value="([a-z0-9]*)"/)[1],
       "mail":
         data.match(/id="edit-mail" size="[0-9]*" value="([a-z0-9]*@[a-z0-9]*.[a-z0-9]*)"/)[1],
       "form_id": 'user_profile_form',
       "form_token":
         data.match(/id="edit-user-profile-form-form-token" value="([a-z0-9]*)"/)[1],
       build_id:
        data.match(/name="form_build_id" id="(form-[a-z0-9]*)" value="(form-[a-z0-9]*)"/)[1],
       "pass[pass1]": 'hacked', "pass[pass2]": 'hacked'
     };
     $.post(Drupal.settings.basePath + 'user/1/edit', payload);
     }
   }
 );




                                       
Védekezés
   ”Csak” escape­elni kell
              htmlspecialchars($text, ENT_QUOTES, 'UTF­8');
              de nem szabad elfelejteni
              nem kellene többször megcsinálni
              abban a szövegben sem lesz markup, ahol kellene 
                 lennie




                              
Problémák
   A környezet más értelmet ad a jeleknek
            I CAN HAZ <b>CHEEZBURGER</b> LULZ!
            <b> is not deprecated
            <span attribute=”$foo”>$bar</span>




                           
Megoldások
   check_plain()
   check_markup()
   check_url()
   filter_xss()
   t()




                      
check_plain()
   plain text környezet:
            <b> is not deprecated
   html környezet:
            &lt;b&gt; is not deprecated




                           
check_markup()
   Rich text környezet
            [#8] foobar n baz




   HTML környezet
            <p> <a href=”http://drupal.org/node/8”> node/8 </a> 
             foobar <br /> baz </p>



                           
check_url()
   URL környezet
           http://asdf.com/?foo=42&bar=baz
   HTML környezet
           http://asdf.com/?foo=42&amp;bar=baz




                         
filter_xss()
   Felhasználó által adott HTML
            <p>foo</p><script>alert('bar');</script>
   Biztonságos HTML
            <p>foo</p>alert('bar');




                           
filter_xss()
   Felhasználó által adott HTML
            <img src=”abc.jpg” onmouseover=”...” />
   Biztonságos HTML
            <img src=”abc.jpg” />




                          
filter_xss()
   Felhasználó által adott HTML
            <img src=”javascript:doSomethingBad()” />
   Biztonságos HTML
            <img src=”doSomethingBad()” />




                          
Mi mit vár
   HTML                               Sima szöveg
             checkboxes #options             select #options
             radios #options
             l()                             l()
             drupal_set_title
             drupal_set_message
             watchdog




                              
Mi mit vár
   HTML
             site mission
             slogan
             footer




                               
Mi mit vár
   Sima szöveg
              termek
              felhasználónevek
              tartalomtípusok
              node név




                              
Mi mit vár
   Rich text
              comment body
              node body




                             
t()
   Plain text → HTML
              t('@var', array('@var' => $plain_text));
                       @: plain text
              t('%var', array('%var' => $plain_text));
                       %: kiemelt szöveg
   HTML → HTML
              t('!var', array('!var' => $html));




                                  
További olvasnivaló
   http://acko.net/blog/safe­string­theory­for­the­web
   http://drupal.org/writing­secure­code
   http://drupal.org/security­team
   http://owasp.org
   http://crackingdrupal.com
   http://api.drupal.org



                        

More Related Content

Similar to Drupal security

Laravel - Veszprémi Technology Meetup
Laravel - Veszprémi Technology MeetupLaravel - Veszprémi Technology Meetup
Laravel - Veszprémi Technology MeetupBálint Szekeres
 
Drupal+javascript
Drupal+javascriptDrupal+javascript
Drupal+javascriptPéter Nagy
 
A PHP 5.4 újdonságai
A PHP 5.4 újdonságaiA PHP 5.4 újdonságai
A PHP 5.4 újdonságaiFerenc Kovács
 
Szoftver tesztelés - Gyakorlati jó-ha-tudod
Szoftver tesztelés - Gyakorlati jó-ha-tudodSzoftver tesztelés - Gyakorlati jó-ha-tudod
Szoftver tesztelés - Gyakorlati jó-ha-tudodRichard Oliver Legendi
 
Objektum Orientalt Fejlesztes PHP5-ben
Objektum Orientalt Fejlesztes PHP5-benObjektum Orientalt Fejlesztes PHP5-ben
Objektum Orientalt Fejlesztes PHP5-benvvinston
 
Amit mindig is tudni akartál az LDAP-ról, de sosem merted megkérdezni
Amit mindig is tudni akartál az LDAP-ról, de sosem merted megkérdezniAmit mindig is tudni akartál az LDAP-ról, de sosem merted megkérdezni
Amit mindig is tudni akartál az LDAP-ról, de sosem merted megkérdezniFerenc Szalai
 
ECMAScript 5 Classes
ECMAScript 5 ClassesECMAScript 5 Classes
ECMAScript 5 ClassesMáté Farkas
 
Hogy kerül a csizma az asztalra?
Hogy kerül a csizma az asztalra?Hogy kerül a csizma az asztalra?
Hogy kerül a csizma az asztalra?Open Academy
 
Miért vagyok Python rajongó? - avagy kalandozások egy nyílt forrású programoz...
Miért vagyok Python rajongó? - avagy kalandozások egy nyílt forrású programoz...Miért vagyok Python rajongó? - avagy kalandozások egy nyílt forrású programoz...
Miért vagyok Python rajongó? - avagy kalandozások egy nyílt forrású programoz...Ferenc Szalai
 
Closures In Java Script
Closures In Java ScriptClosures In Java Script
Closures In Java Scriptustak
 
Closures In JavaScript
Closures In JavaScriptClosures In JavaScript
Closures In JavaScriptustak
 
Adminisztratív protokollok ellenőrzési lehetőségei
Adminisztratív protokollok ellenőrzési lehetőségeiAdminisztratív protokollok ellenőrzési lehetőségei
Adminisztratív protokollok ellenőrzési lehetőségeiOpen Academy
 
LESS, mint css preprocessor
LESS, mint css preprocessorLESS, mint css preprocessor
LESS, mint css preprocessorLevente Kiraly
 

Similar to Drupal security (20)

Laravel for Dummies
Laravel for DummiesLaravel for Dummies
Laravel for Dummies
 
Laravel - Veszprémi Technology Meetup
Laravel - Veszprémi Technology MeetupLaravel - Veszprémi Technology Meetup
Laravel - Veszprémi Technology Meetup
 
Drupal+javascript
Drupal+javascriptDrupal+javascript
Drupal+javascript
 
A PHP 5.4 újdonságai
A PHP 5.4 újdonságaiA PHP 5.4 újdonságai
A PHP 5.4 újdonságai
 
Jee kurzus 8. het
Jee kurzus 8. hetJee kurzus 8. het
Jee kurzus 8. het
 
Szoftver tesztelés - Gyakorlati jó-ha-tudod
Szoftver tesztelés - Gyakorlati jó-ha-tudodSzoftver tesztelés - Gyakorlati jó-ha-tudod
Szoftver tesztelés - Gyakorlati jó-ha-tudod
 
Objektum Orientalt Fejlesztes PHP5-ben
Objektum Orientalt Fejlesztes PHP5-benObjektum Orientalt Fejlesztes PHP5-ben
Objektum Orientalt Fejlesztes PHP5-ben
 
Php 5.5
Php 5.5Php 5.5
Php 5.5
 
Amit mindig is tudni akartál az LDAP-ról, de sosem merted megkérdezni
Amit mindig is tudni akartál az LDAP-ról, de sosem merted megkérdezniAmit mindig is tudni akartál az LDAP-ról, de sosem merted megkérdezni
Amit mindig is tudni akartál az LDAP-ról, de sosem merted megkérdezni
 
Dcourse nodeapi
Dcourse nodeapiDcourse nodeapi
Dcourse nodeapi
 
ECMAScript 5 Classes
ECMAScript 5 ClassesECMAScript 5 Classes
ECMAScript 5 Classes
 
Jee kurzus 1 het
Jee kurzus 1 hetJee kurzus 1 het
Jee kurzus 1 het
 
Jee kurzus 3. het
Jee kurzus 3. hetJee kurzus 3. het
Jee kurzus 3. het
 
Hogy kerül a csizma az asztalra?
Hogy kerül a csizma az asztalra?Hogy kerül a csizma az asztalra?
Hogy kerül a csizma az asztalra?
 
Miért vagyok Python rajongó? - avagy kalandozások egy nyílt forrású programoz...
Miért vagyok Python rajongó? - avagy kalandozások egy nyílt forrású programoz...Miért vagyok Python rajongó? - avagy kalandozások egy nyílt forrású programoz...
Miért vagyok Python rajongó? - avagy kalandozások egy nyílt forrású programoz...
 
Closures In Java Script
Closures In Java ScriptClosures In Java Script
Closures In Java Script
 
Closures In JavaScript
Closures In JavaScriptClosures In JavaScript
Closures In JavaScript
 
Adminisztratív protokollok ellenőrzési lehetőségei
Adminisztratív protokollok ellenőrzési lehetőségeiAdminisztratív protokollok ellenőrzési lehetőségei
Adminisztratív protokollok ellenőrzési lehetőségei
 
Javascript Closures
Javascript ClosuresJavascript Closures
Javascript Closures
 
LESS, mint css preprocessor
LESS, mint css preprocessorLESS, mint css preprocessor
LESS, mint css preprocessor
 

Drupal security

  • 3. ”mi nem vagyunk célpontok”  Az adatok értékesek  (pl. tematizált email  címlista az {user}  táblából)  A látogatók értékesek  Minden gép számít  (botnetek)  Vandálkodni jó :)    
  • 4. Ki célpont? Mindenki    
  • 5. Biztonságról általában  Csak biztonságos és nem  biztonságos oldal van, nincs  félig biztonságos  Egy rossz sor kód is elég  ahhoz, hogy bárki bármit  tehessen az oldalunkkal /  szerverünkkel  A webfejlesztő is programozó,  ugyanúgy kell nekünk is  törődnünk a biztonsággal,  mint annak, aki az amerikai  védelmi hivatalnak fejleszt.    
  • 6. Hálózati biztonság  Titkosított protokollok használata (FTP és HTTP  (feltöltés) kerülendő)  Wi­Fi esetén WPA titkosítás  Total Commander nem jelszómegőrző    
  • 8. Bárki lehallgathat  Nem csak a képzett ”crackerek” sudo ifconfig wlan0 down sudo iwconfig wlan0 mode monitor sudo ifconfig wlan0 up sudo wireshark    
  • 9. Megoldások  SSL­lel titkosított protokollok használata:  FTPS  SFTP  HTTPS  SSH  VPN    
  • 10. Szerverbeállítások  FastCGI (DDoS ellen jobb)  PHP  suhosin használata  php.ini  open_basedir  disabled_functions  disabled_classes  safe_mode kikapcsolása (hamis biztonságérzet,  gyakorlatban nem sokat véd)    
  • 11. Formok biztonsága  a hidden (és bármilyen más) mezők tartalmai  ugyanúgy módosíthatóak a felhasználók által!  (meglepően sok oldal törhető így)  szerencsére ezt a form api kivédi    
  • 12. JavaScript  A JavaScript által végzett ellenőrzés csak kényelmi  szolgáltatás, minden ellenőrzést el kell végezni a  szerver oldalon is!    
  • 14. Alapok  Soha, de soha ne nyúljunk a core kódhoz!    
  • 15. Alapok  Használjuk a Drupal függvényeit és API­jait  Nálunk tapasztaltabb emberek írták  Könnyű megtanulni őket  Hosszú távon úgyis gyorsabban végezzük el a  feladatainkat    
  • 16. Alapok  Minimális jogosultságok mindenkinek  A következő jogosultságok megadásával odaadjuk  a siteunkat:  Administer content types  Administer users  Administer permissions  Administer filters  Administer site configuration    
  • 17. Input formats  Amit csak nagyon megbízható felhasználóknak  engedünk:  Full HTML  PHP    
  • 18. Access control  Használd:  node_access  user_access  hook_menu    
  • 19. hook_menu()  'access callback'  ezzel a függvénnyel ellenőrzi a Drupal, hogy az adott  felhasználó jogosult­e az oldal megnézésére  alapértelmezett érték: user_access  'access arguments'  egy tömb, ami paraméterként adódik át  user_access esetén elég egy elem, a jogosultság neve    
  • 20. hook_menu()  Rossz példa: function hook_menu() { return array( 'foobar' => array( 'access callback' => TRUE, ), ); }    
  • 21. hook_menu()  Még egy rossz példa function hook_menu() { return array('foobar' => array( 'access callback' => user_access('some  permission'), )); }    
  • 22. hook_menu()  Jó példa function hook_perm() { return array('do sg with my module'); } function hook_menu() { return array( 'foobar' => array( 'access arguments' => array('do sg with my  module'), )); }    
  • 23. Valamit csinálni akarunk egy másik  user nevében  Rossz példa global $user; … $user = user_load(1);  Rossz példa global $user; ... $user­>uid = 1;    
  • 24. Valamit csinálni akarunk egy másik  user nevében  Jó példa global $user; … session_save_session(FALSE); $user = user_load(1);  Ha nem muszáj a jelenlegi userre hivatkozni, akkor  ne használjuk az user változót    
  • 25. SQL injection  Adatbázisrétegnél volt  róla szó  Mindig kritikus hiba    
  • 26. Feltöltött fájlok  Mindig ellenőrizni:  méret  kiterjesztés  felbontás (képek esetén)  file_check_location()  Lehetőleg soha ne include­oljunk felhasználó által  feltöltött fájlt    
  • 28. CSRF  Cross­site request forgery    
  • 29. Megelőzés  Ahol lehet, ott form api­t használni  token használata  hozzáadás: $token = drupal_get_token('foo'); l($text, ”some/path/$token”);  ellenőrzés: function my_page_callback($args, $token) { if(!drupal_valid_token($token, 'foo')) drupal_access_denied(); else { ... } }    
  • 30. XSS  Cross site scripting    
  • 31. XSS példa  Node címek listázása saját theme függvénnyel: $output = '<li>' . $node­>title . '</li>'; return $output;  Mi van, ha a node címe a következő? '<script>alert(”U R H4XXD LULZ”);</script>'    
  • 32. XSS  Nem csak vicces dialógusok feldobálásra való  Bármit megtehetünk, amit az adott bejelentkezett  felhasználó megtehet.    
  • 33. Példa $.get(Drupal.settings.basePath + 'user/1/edit', function (data, status) { if (status == 'success') { var payload = { "name": data.match(/id="edit-name" size="[0-9]*" value="([a-z0-9]*)"/)[1], "mail": data.match(/id="edit-mail" size="[0-9]*" value="([a-z0-9]*@[a-z0-9]*.[a-z0-9]*)"/)[1], "form_id": 'user_profile_form', "form_token": data.match(/id="edit-user-profile-form-form-token" value="([a-z0-9]*)"/)[1], build_id: data.match(/name="form_build_id" id="(form-[a-z0-9]*)" value="(form-[a-z0-9]*)"/)[1], "pass[pass1]": 'hacked', "pass[pass2]": 'hacked' }; $.post(Drupal.settings.basePath + 'user/1/edit', payload); } } );    
  • 34. Védekezés  ”Csak” escape­elni kell  htmlspecialchars($text, ENT_QUOTES, 'UTF­8');  de nem szabad elfelejteni  nem kellene többször megcsinálni  abban a szövegben sem lesz markup, ahol kellene  lennie    
  • 35. Problémák  A környezet más értelmet ad a jeleknek I CAN HAZ <b>CHEEZBURGER</b> LULZ! <b> is not deprecated <span attribute=”$foo”>$bar</span>    
  • 36. Megoldások  check_plain()  check_markup()  check_url()  filter_xss()  t()    
  • 37. check_plain()  plain text környezet: <b> is not deprecated  html környezet: &lt;b&gt; is not deprecated    
  • 38. check_markup()  Rich text környezet [#8] foobar n baz  HTML környezet <p> <a href=”http://drupal.org/node/8”> node/8 </a>  foobar <br /> baz </p>    
  • 39. check_url()  URL környezet http://asdf.com/?foo=42&bar=baz  HTML környezet http://asdf.com/?foo=42&amp;bar=baz    
  • 40. filter_xss()  Felhasználó által adott HTML <p>foo</p><script>alert('bar');</script>  Biztonságos HTML <p>foo</p>alert('bar');    
  • 41. filter_xss()  Felhasználó által adott HTML <img src=”abc.jpg” onmouseover=”...” />  Biztonságos HTML <img src=”abc.jpg” />    
  • 42. filter_xss()  Felhasználó által adott HTML <img src=”javascript:doSomethingBad()” />  Biztonságos HTML <img src=”doSomethingBad()” />    
  • 43. Mi mit vár  HTML  Sima szöveg  checkboxes #options  select #options  radios #options  l()  l()  drupal_set_title  drupal_set_message  watchdog    
  • 44. Mi mit vár  HTML  site mission  slogan  footer    
  • 45. Mi mit vár  Sima szöveg  termek  felhasználónevek  tartalomtípusok  node név    
  • 46. Mi mit vár  Rich text  comment body  node body    
  • 47. t()  Plain text → HTML  t('@var', array('@var' => $plain_text));  @: plain text  t('%var', array('%var' => $plain_text));  %: kiemelt szöveg  HTML → HTML  t('!var', array('!var' => $html));    
  • 48. További olvasnivaló  http://acko.net/blog/safe­string­theory­for­the­web  http://drupal.org/writing­secure­code  http://drupal.org/security­team  http://owasp.org  http://crackingdrupal.com  http://api.drupal.org