drupal security

48
 Drupal biztonság

Upload: tamas-demeter-haludka

Post on 05-Dec-2014

996 views

Category:

Documents


2 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Drupal security

  

Drupal biztonság

Page 2: Drupal security

  

Ki célpont?

Page 3: Drupal security

  

”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ó :)

Page 4: Drupal security

  

Ki célpont?

Mindenki

Page 5: Drupal security

  

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.

Page 6: Drupal security

  

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ő

Page 7: Drupal security

  

Így hallgathatlak le téged

Page 8: Drupal security

  

Bárki lehallgathat

Nem csak a képzett ”crackerek”

sudo ifconfig wlan0 down

sudo iwconfig wlan0 mode monitor

sudo ifconfig wlan0 up

sudo wireshark

Page 9: Drupal security

  

Megoldások

SSL­lel titkosított protokollok használata: FTPS SFTP HTTPS SSH

VPN

Page 10: Drupal security

  

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)

Page 11: Drupal security

  

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

Page 12: Drupal security

  

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!

Page 13: Drupal security

  

Drupal biztonság

Page 14: Drupal security

  

Alapok

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

Page 15: Drupal security

  

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

Page 16: Drupal security

  

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

Page 17: Drupal security

  

Input formats

Amit csak nagyon megbízható felhasználóknak engedünk:

Full HTML PHP

Page 18: Drupal security

  

Access control

Használd: node_access user_access hook_menu

Page 19: Drupal security

  

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

Page 20: Drupal security

  

hook_menu()

Rossz példa:

function hook_menu() {

return array(

'foobar' => array('access callback' => TRUE,

),);

}

Page 21: Drupal security

  

hook_menu()

Még egy rossz példa

function hook_menu() {

return array('foobar' => array(

'access callback' => user_access('some permission'),

));

}

Page 22: Drupal security

  

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'),

));

}

Page 23: Drupal security

  

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;

Page 24: Drupal security

  

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

Page 25: Drupal security

  

SQL injection

Adatbázisrétegnél volt róla szó

Mindig kritikus hiba

Page 26: Drupal security

  

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

Page 27: Drupal security

  

CSRF

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

Page 28: Drupal security

  

CSRF

Cross­site request forgery

Page 29: Drupal security

  

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 {...

}}

Page 30: Drupal security

  

XSS

Cross site scripting

Page 31: Drupal security

  

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>'

Page 32: Drupal security

  

XSS

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

felhasználó megtehet.

Page 33: Drupal security

  

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); } } );

Page 34: Drupal security

  

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

Page 35: Drupal security

  

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>

Page 36: Drupal security

  

Megoldások

check_plain() check_markup() check_url() filter_xss() t()

Page 37: Drupal security

  

check_plain()

plain text környezet:

<b> is not deprecated

html környezet:

&lt;b&gt; is not deprecated

Page 38: Drupal security

  

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>

Page 39: Drupal security

  

check_url()

URL környezet

http://asdf.com/?foo=42&bar=baz

HTML környezet

http://asdf.com/?foo=42&amp;bar=baz

Page 40: Drupal security

  

filter_xss()

Felhasználó által adott HTML

<p>foo</p><script>alert('bar');</script>

Biztonságos HTML

<p>foo</p>alert('bar');

Page 41: Drupal security

  

filter_xss()

Felhasználó által adott HTML

<img src=”abc.jpg” onmouseover=”...” />

Biztonságos HTML

<img src=”abc.jpg” />

Page 42: Drupal security

  

filter_xss()

Felhasználó által adott HTML

<img src=”javascript:doSomethingBad()” />

Biztonságos HTML

<img src=”doSomethingBad()” />

Page 43: Drupal security

  

Mi mit vár

HTML checkboxes #options radios #options l() drupal_set_title drupal_set_message watchdog

Sima szöveg select #options

l()

Page 44: Drupal security

  

Mi mit vár

HTML site mission slogan footer

Page 45: Drupal security

  

Mi mit vár

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

Page 46: Drupal security

  

Mi mit vár

Rich text comment body node body

Page 47: Drupal security

  

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));

Page 48: Drupal security

  

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