drupal security
DESCRIPTION
TRANSCRIPT
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ő)
WiFi 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
SSLlel 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 APIjait 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ó jogosulte 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 includeoljunk felhasználó által
feltöltött fájlt
CSRF
<img src=”http://drupal.org/logout”/>
CSRF
Crosssite request forgery
Megelőzés Ahol lehet, ott form apit 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” escapeelni kell htmlspecialchars($text, ENT_QUOTES, 'UTF8'); 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:
<b> 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&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 checkboxes #options radios #options l() drupal_set_title drupal_set_message watchdog
Sima szöveg select #options
l()
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/safestringtheoryfortheweb http://drupal.org/writingsecurecode http://drupal.org/securityteam http://owasp.org http://crackingdrupal.com http://api.drupal.org