ݺߣ

ݺߣShare a Scribd company logo
Drupalbiztonság
Kicélpont?
”minemvagyunkcélpontok”
   Azadatokértékesek
     (pl.tematizáltemail
     címlistaaz{user}
     táblából)
   Alátogatókértékesek
   Mindengépszámít
     (botnetek)
   Vandálkodnijó:)
Kicélpont?




    Mindenki
Biztonságróláltalában
   Csakbiztonságosésnem
      biztonságosoldalvan,nincs
      féligbiztonságos
   Egyrosszsorkódiselég
      ahhoz,hogybárkibármit
      tehessenazoldalunkkal/
      szerverünkkel
   Awebfejlesztőisprogramozó,
      ugyanúgykellnekünkis
      törődnünkabiztonsággal,
      mintannak,akiazamerikai
      védelmihivatalnakfejleszt.
Hálózatibiztonság
   Titkosítottprotokollokhasználata(FTPésHTTP
      (feltöltés)kerülendő)
   Wi­FieseténWPAtitkosítás
   TotalCommandernemjelszómegőrző
Ígyhallgathatlakletéged
Bárkilehallgathat
   Nemcsakaképzett”crackerek”
            sudoifconfigwlan0down
            sudoiwconfigwlan0modemonitor
            sudoifconfigwlan0up
            sudowireshark
Megoldások
   SSL­leltitkosítottprotokollokhasználata:
              FTPS
              SFTP
              HTTPS
              SSH
   VPN
Szerverbeállítások
   FastCGI(DDoSellenjobb)
   PHP
              suhosinhasználata
              php.ini
                       open_basedir
                       disabled_functions
                       disabled_classes
                       safe_modekikapcsolása(hamisbiztonságérzet,
                          gyakorlatbannemsokatvéd)
Formokbiztonsága
   ahidden(ésbármilyenmás)mezőktartalmai
      ugyanúgymódosíthatóakafelhasználókáltal!
      (meglepőensokoldaltörhetőígy)
   szerencséreeztaformapikivédi
JavaScript
   AJavaScriptáltalvégzettellenőrzéscsakkényelmi
     szolgáltatás,mindenellenőrzéstelkellvégeznia
     szerveroldalonis!
Drupalbiztonság
Alapok
   Soha,desohanenyúljunkacorekódhoz!
Alapok
   HasználjukaDrupalfüggvényeitésAPI­jait
              Nálunktapasztaltabbemberekírták
              Könnyűmegtanulniőket
              Hosszútávonúgyisgyorsabbanvégezzükela
                feladatainkat
Alapok
   Minimálisjogosultságokmindenkinek
   Akövetkezőjogosultságokmegadásávalodaadjuk
     asiteunkat:
              Administercontenttypes
              Administerusers
              Administerpermissions
              Administerfilters
              Administersiteconfiguration
Inputformats
   Amitcsaknagyonmegbízhatófelhasználóknak
     engedünk:
              FullHTML
              PHP
Accesscontrol
   Használd:
              node_access
              user_access
              hook_menu
hook_menu()
   'accesscallback'
              ezzelafüggvénnyelellenőrziaDrupal,hogyazadott
                 felhasználójogosult­eazoldalmegnézésére
              alapértelmezettérték:user_access
   'accessarguments'
              egytömb,amiparaméterkéntadódikát
              user_accesseseténelégegyelem,ajogosultságneve
hook_menu()
   Rosszpélda:
            functionhook_menu(){
                   returnarray(
                         'foobar'=>array(
                               'accesscallback'=>TRUE,
                         ),
                   );
            }
hook_menu()
   Mégegyrosszpélda
            functionhook_menu(){
                 returnarray('foobar'=>array(
                        'accesscallback'=>user_access('some
                          permission'),
                 ));
            }
hook_menu()
   Jópélda
    functionhook_perm(){returnarray('dosgwithmymodule');}
    functionhook_menu(){
             returnarray('foobar'=>array(
                    'accessarguments'=>array('dosgwithmy
                      module'),
             ));
    }
Valamitcsinálniakarunkegymásik
           usernevében
   Rosszpélda
            global$user;
            …
            $user=user_load(1);
   Rosszpélda
            global$user;
            ...
            $user­>uid=1;
Valamitcsinálniakarunkegymásik
           usernevében
   Jópélda
            global$user;
            …
            session_save_session(FALSE);
            $user=user_load(1);
   Hanemmuszájajelenlegiuserrehivatkozni,akkor
     nehasználjukazuserváltozót
SQLinjection
   Adatbázisrétegnélvolt
     rólaszó
   Mindigkritikushiba
Feltöltöttfájlok
   Mindigellenőrizni:
              méret
              kiterjesztés
              felbontás(képekesetén)
   file_check_location()
   Lehetőlegsohaneinclude­oljunkfelhasználóáltal
     feltöltöttfájlt
CSRF
<imgsrc=/slideshow/drupal-security/4761117/”http:/drupal.org/logout”/>
CSRF
   Cross­siterequestforgery
Megelőzés
   Ahollehet,ottformapi­thasználni
   tokenhasználata
                hozzáadás:
                         $token=drupal_get_token('foo');
                         l($text,”some/path/$token”);
                ellenőrzés:
                         functionmy_page_callback($args,$token){
                                if(!drupal_valid_token($token,'foo'))
                                        drupal_access_denied();
                                else{
                                        ...
                                }
                         }
XSS
   Crosssitescripting
XSSpélda
   Nodecímeklistázásasajátthemefüggvénnyel:
            $output='<li>'.$node­>title.'</li>';
            return$output;
   Mivan,haanodecímeakövetkező?
            '<script>alert(”URH4XXDLULZ”);</script>'
XSS
   Nemcsakviccesdialógusokfeldobálásravaló
   Bármitmegtehetünk,amitazadottbejelentkezett
     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­elnikell
              htmlspecialchars($text,ENT_QUOTES,'UTF­8');
              denemszabadelfelejteni
              nemkellenetöbbszörmegcsinálni
              abbanaszövegbensemleszmarkup,aholkellene
                 lennie
Problémák
   Akörnyezetmásértelmetadajeleknek
            ICANHAZ<b>CHEEZBURGER</b>LULZ!
            <b>isnotdeprecated
            <spanattribute=”$foo”>$bar</span>
Megoldások
   check_plain()
   check_markup()
   check_url()
   filter_xss()
   t()
check_plain()
   plaintextkörnyezet:
            <b>isnotdeprecated
   htmlkörnyezet:
            &lt;b&gt;isnotdeprecated
check_markup()
   Richtextkörnyezet
            [#8]foobarnbaz




   HTMLkörnyezet
            <p><ahref=”http://drupal.org/node/8”>node/8</a>
             foobar<br/>baz</p>
check_url()
   URLkörnyezet
           http://asdf.com/?foo=42&bar=baz
   HTMLkörnyezet
           http://asdf.com/?foo=42&amp;bar=baz
filter_xss()
   FelhasználóáltaladottHTML
            <p>foo</p><script>alert('bar');</script>
   BiztonságosHTML
            <p>foo</p>alert('bar');
filter_xss()
   FelhasználóáltaladottHTML
            <imgsrc=/slideshow/drupal-security/4761117/”abc.jpg”onmouseover=”...”/>
   BiztonságosHTML
            <imgsrc=”abc.jpg”/>
filter_xss()
   FelhasználóáltaladottHTML
            <imgsrc=/slideshow/drupal-security/4761117/”javascript:doSomethingBad()”/>
   BiztonságosHTML
            <imgsrc=”doSomethingBad()”/>
Mimitvár
   HTML                               Simaszöveg
             checkboxes#options             select#options
             radios#options
             l()                             l()
             drupal_set_title
             drupal_set_message
             watchdog
Mimitvár
   HTML
             sitemission
             slogan
             footer
Mimitvár
   Simaszöveg
              termek
              felhasználónevek
              tartalomtípusok
              nodenév
Mimitvár
   Richtext
              commentbody
              nodebody
t()
   Plaintext→HTML
              t('@var',array('@var'=>$plain_text));
                       @:plaintext
              t('%var',array('%var'=>$plain_text));
                       %:kiemeltszöveg
   HTML→HTML
              t('!var',array('!var'=>$html));
Továbbiolvasnivaló
   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

Drupal security

  • 3. ”minemvagyunkcélpontok”  Azadatokértékesek (pl.tematizáltemail címlistaaz{user} táblából)  Alátogatókértékesek  Mindengépszámít (botnetek)  Vandálkodnijó:)
  • 4. Kicélpont? Mindenki
  • 5. Biztonságróláltalában  Csakbiztonságosésnem biztonságosoldalvan,nincs féligbiztonságos  Egyrosszsorkódiselég ahhoz,hogybárkibármit tehessenazoldalunkkal/ szerverünkkel  Awebfejlesztőisprogramozó, ugyanúgykellnekünkis törődnünkabiztonsággal, mintannak,akiazamerikai védelmihivatalnakfejleszt.
  • 6. Hálózatibiztonság  Titkosítottprotokollokhasználata(FTPésHTTP (feltöltés)kerülendő)  Wi­FieseténWPAtitkosítás  TotalCommandernemjelszómegőrző
  • 8. Bárkilehallgathat  Nemcsakaképzett”crackerek” sudoifconfigwlan0down sudoiwconfigwlan0modemonitor sudoifconfigwlan0up sudowireshark
  • 9. Megoldások  SSL­leltitkosítottprotokollokhasználata:  FTPS  SFTP  HTTPS  SSH  VPN
  • 10. Szerverbeállítások  FastCGI(DDoSellenjobb)  PHP  suhosinhasználata  php.ini  open_basedir  disabled_functions  disabled_classes  safe_modekikapcsolása(hamisbiztonságérzet, gyakorlatbannemsokatvéd)
  • 11. Formokbiztonsága  ahidden(ésbármilyenmás)mezőktartalmai ugyanúgymódosíthatóakafelhasználókáltal! (meglepőensokoldaltörhetőígy)  szerencséreeztaformapikivédi
  • 12. JavaScript  AJavaScriptáltalvégzettellenőrzéscsakkényelmi szolgáltatás,mindenellenőrzéstelkellvégeznia szerveroldalonis!
  • 14. Alapok  Soha,desohanenyúljunkacorekódhoz!
  • 15. Alapok  HasználjukaDrupalfüggvényeitésAPI­jait  Nálunktapasztaltabbemberekírták  Könnyűmegtanulniőket  Hosszútávonúgyisgyorsabbanvégezzükela feladatainkat
  • 16. Alapok  Minimálisjogosultságokmindenkinek  Akövetkezőjogosultságokmegadásávalodaadjuk asiteunkat:  Administercontenttypes  Administerusers  Administerpermissions  Administerfilters  Administersiteconfiguration
  • 17. Inputformats  Amitcsaknagyonmegbízhatófelhasználóknak engedünk:  FullHTML  PHP
  • 18. Accesscontrol  Használd:  node_access  user_access  hook_menu
  • 19. hook_menu()  'accesscallback'  ezzelafüggvénnyelellenőrziaDrupal,hogyazadott felhasználójogosult­eazoldalmegnézésére  alapértelmezettérték:user_access  'accessarguments'  egytömb,amiparaméterkéntadódikát  user_accesseseténelégegyelem,ajogosultságneve
  • 20. hook_menu()  Rosszpélda: functionhook_menu(){ returnarray( 'foobar'=>array( 'accesscallback'=>TRUE, ), ); }
  • 21. hook_menu()  Mégegyrosszpélda functionhook_menu(){ returnarray('foobar'=>array( 'accesscallback'=>user_access('some permission'), )); }
  • 22. hook_menu()  Jópélda functionhook_perm(){returnarray('dosgwithmymodule');} functionhook_menu(){ returnarray('foobar'=>array( 'accessarguments'=>array('dosgwithmy module'), )); }
  • 23. Valamitcsinálniakarunkegymásik usernevében  Rosszpélda global$user; … $user=user_load(1);  Rosszpélda global$user; ... $user­>uid=1;
  • 24. Valamitcsinálniakarunkegymásik usernevében  Jópélda global$user; … session_save_session(FALSE); $user=user_load(1);  Hanemmuszájajelenlegiuserrehivatkozni,akkor nehasználjukazuserváltozót
  • 25. SQLinjection  Adatbázisrétegnélvolt rólaszó  Mindigkritikushiba
  • 26. Feltöltöttfájlok  Mindigellenőrizni:  méret  kiterjesztés  felbontás(képekesetén)  file_check_location()  Lehetőlegsohaneinclude­oljunkfelhasználóáltal feltöltöttfájlt
  • 28. CSRF  Cross­siterequestforgery
  • 29. Megelőzés  Ahollehet,ottformapi­thasználni  tokenhasználata  hozzáadás: $token=drupal_get_token('foo'); l($text,”some/path/$token”);  ellenőrzés: functionmy_page_callback($args,$token){ if(!drupal_valid_token($token,'foo')) drupal_access_denied(); else{ ... } }
  • 30. XSS  Crosssitescripting
  • 31. XSSpélda  Nodecímeklistázásasajátthemefüggvénnyel: $output='<li>'.$node­>title.'</li>'; return$output;  Mivan,haanodecímeakövetkező? '<script>alert(”URH4XXDLULZ”);</script>'
  • 32. XSS  Nemcsakviccesdialógusokfeldobálásravaló  Bármitmegtehetünk,amitazadottbejelentkezett 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­elnikell  htmlspecialchars($text,ENT_QUOTES,'UTF­8');  denemszabadelfelejteni  nemkellenetöbbszörmegcsinálni  abbanaszövegbensemleszmarkup,aholkellene lennie
  • 35. Problémák  Akörnyezetmásértelmetadajeleknek ICANHAZ<b>CHEEZBURGER</b>LULZ! <b>isnotdeprecated <spanattribute=”$foo”>$bar</span>
  • 36. Megoldások  check_plain()  check_markup()  check_url()  filter_xss()  t()
  • 37. check_plain()  plaintextkörnyezet: <b>isnotdeprecated  htmlkörnyezet: &lt;b&gt;isnotdeprecated
  • 38. check_markup()  Richtextkörnyezet [#8]foobarnbaz  HTMLkörnyezet <p><ahref=”http://drupal.org/node/8”>node/8</a> foobar<br/>baz</p>
  • 39. check_url()  URLkörnyezet http://asdf.com/?foo=42&bar=baz  HTMLkörnyezet http://asdf.com/?foo=42&amp;bar=baz
  • 40. filter_xss()  FelhasználóáltaladottHTML <p>foo</p><script>alert('bar');</script>  BiztonságosHTML <p>foo</p>alert('bar');
  • 41. filter_xss()  FelhasználóáltaladottHTML <imgsrc=/slideshow/drupal-security/4761117/”abc.jpg”onmouseover=”...”/>  BiztonságosHTML <imgsrc=”abc.jpg”/>
  • 42. filter_xss()  FelhasználóáltaladottHTML <imgsrc=/slideshow/drupal-security/4761117/”javascript:doSomethingBad()”/>  BiztonságosHTML <imgsrc=”doSomethingBad()”/>
  • 43. Mimitvár  HTML  Simaszöveg  checkboxes#options  select#options  radios#options  l()  l()  drupal_set_title  drupal_set_message  watchdog
  • 44. Mimitvár  HTML  sitemission  slogan  footer
  • 45. Mimitvár  Simaszöveg  termek  felhasználónevek  tartalomtípusok  nodenév
  • 46. Mimitvár  Richtext  commentbody  nodebody
  • 47. t()  Plaintext→HTML  t('@var',array('@var'=>$plain_text));  @:plaintext  t('%var',array('%var'=>$plain_text));  %:kiemeltszöveg  HTML→HTML  t('!var',array('!var'=>$html));
  • 48. Továbbiolvasnivaló  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