SlideShare una empresa de Scribd logo
1 de 34
Descargar para leer sin conexión
Před čím tě Nette ani
Symfony neochrání
@ProchazkaFilip
#makeCodeNotWar
~ Anonym, v současnosti v programu ochrana svědků
Staré verze
● PHP7
● I v Nette jsou security bugy
● Composer
● PECL
● Systém
● Roave/SecurityAdvisories
● Symfony security:check
Knihovny
● Je knihovna “stable”? Stará se o ni autor?
● Nastudovat api/internals
● Security audit?
● Nikdy nic nepředpokládejte!
● Integrační testy
● Pochopení flow dat - xdebug
Špatné nastavení
● Umyslně
● Z neznalosti/nepochopení
● security: false
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
Security through obscurity
● PHP: expose_php=Off
● Nginx: server_tokens off;
● Http client knihovny vs verze PHP
XSS
$this->flashMessage(Html::el('p')->setHtml(sprintf(
'Váš nový účet je <b>%s</b>',
$username
)));
XSS / escapování
● |noescape
○ translator
● href="foo?bar={$bar|urlescape}"
● escapeshellarg()
SQL
"UPDATE users
SET pwd = '$pwd'
WHERE id = '$uid'";
SQL: escapování LIKE
addcslashes($search_term, "%_");
function like($s, $e) {
return str_replace([$e, '_', '%'], [$e.$e, $e.'_', $e.'%'], $s);
}
$q = $db->prepare("... WHERE name LIKE ? ESCAPE '=' AND ...");
$q->bindValue(1, '%'.like($name, '=').'%', PDO::PARAM_STR);
Source
SQL: escapování REGEX
● preg_quote()
SQL: IS vs =
SELECT * FROM t WHERE col IS NULL;
SELECT * FROM t WHERE col = NULL;
SQL: PDO::ATTR_EMULATE_PREPARES
● Auto fallback WTF
● Výjimky při prepare
dump($dbh->prepare('INSERT;'));
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
dump($dbh->prepare('INSERT;'));
SQL: kódování
● SET NAMES utf8;
● DSN charset=utf8
● Nové MySQL => utf8mb4
SQL: MySQL sql mode
● strict = STRICT_TRANS_TABLES or STRICT_ALL_TABLES
○ Různá výchozí hodnota v závislosti na verzi MySQL
● ERROR_FOR_DIVISION_BY_ZERO + strict => error
● NO_UNSIGNED_SUBTRACTION
● NO_ZERO_DATE + strict => error
● NO_ZERO_IN_DATE + strict => error
Validace vstupů
● Vyvarovat se
○ Použití globals $_
○ filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
● Používat
○ Value/DTO objekty
■ Symfony Data Transformers?
○ Json Schema
○ JMS Serializer
○ Symfony/Validator
● Filesystém
○ fopen($file, "t");
Validace vstupů: regulární výrazy
● Multiline
● A Z
● ^ $
Type juggling
● uživatelské vstupy - především scalar vs array
● Podmínky
○ == vs ===
○ in_array(,,true), array_search(,,true)
○ switch()
○ isset() vs array_key_exists()
○ empty() ~ !isset($var) || $var == false
● declare(strict_types=1)
● $objectA > $objectB
CSRF
● nextras/secured-links
● $form->addProtection();
Cache
● Sdílená cache
○ APC
● Cache poisoning
○ Router
○ Data v aplikaci
○ HTTP (proxyny atd)
● umask(0);
File Upload
● $_FILES["file"]["type"];
● Kontrolovat
○ koncovku
○ mime typ
● Stripnout EXIF data a uložit bokem, pokud je potřebuju
● Zajistit, aby nešlo spustit soubor připojením .php za název
● Vlastní názvy pomocí
○ Strings::webalize(), lépe random/UUID
○ lomítka a speciální znaky
○ null byte exploity v názvu souboru
HTTPS & Security Headers
● Secured session sušenka (& permanent login cookie)
○ session.cookie_httponly=1
○ session.cookie_secure=1
○ session.use_only_cookies=1
● HSTS
○ Zavádět s malou expirací, postupně zvyšovat když vše funguje
● CORS
● CSP
○ https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
○ https://github.com/spaze/csp-config
○ https://csp-evaluator.withgoogle.com/
HTTPS & Security Headers
● SRi
○ Michal Špaček: HTTP hlavičky, Subresource Integrity a spol.
○ https://github.com/spaze/sri-macros
● securityheaders.io
● observatory.mozilla.org
Přístupný důvěrný obsah
● Čitelné .neon/.yml configy
● git, svn
● Uniknutí Laděnky
○ Debug mode
○ Přístupné na veřejné adrese, která je nezabezpečená
Insecure Direct Object References
● Možnost editace něčeho k čemu nemám přístup
● Možnost vykradení dat
● UUID (neřeší problém, jen ho zmírní)
Unvalidated Redirects and Forwards
● Zneužití redirect parametru
● Backlinky
Random
● Kde
○ Generovaná hesla
○ jakékoliv tokeny v url a formulářích
● Co nepoužívat
○ rand, srand, getrandmax -> mt_rand()
● Co použít
○ random_int()
○ random_bytes()
○ Random::generate()
● paragonie/random_compat
Crypto:
● Použít libsodium nebo openssl
● mcrypt je od 7.1 deprecated
● defuse/php-encryption
“The First Rule of Cryptography: Don't Implement it Yourself”
Hashování
Cryptographic Hashes
● Fast
● Only one input: The message
Password Hashes
● Intentionally slow
● At least three inputs:
○ The password
○ A per-user salt
○ A cost factor (how expensive to make the computation)
Source
Hashování
● memory-hard algoritmy
○ Scrypt
○ Argon2
○ Bcrypt - don’t be smart, just use Bcrypt
● Bcrypt omezení (bugs in the algorithm itself)
○ 72 znaků
○ Truncate NUL byte
○ base64_encode(hash('sha384', $password, true));
● password_hash() & password_verify()
● Kdy má smysl šifrovat hashe hesel?
○ Když je všechno ostatní vyřešný!
Source
Side-channel attack
● Constant-time porovnávání stringů
○ hash_equals()
○ baseN kódování paragonie/constant_time_encoding
○ Anthony Ferrara: It's All About Time
● password_verify() má ochranu zabudovanou
Monitoring
● Logovat “nebezpečné” operace
○ Přihlášení
○ Registrace
○ Zapomenuté heslo
○ …?
Díky všem co přispěli!
● Jan Tvrdík @jantvrdik
● Jakub Chábek @grongor
● Jan-Sebastian Fabík @janfabik
● David Matějka @matej_21
● Petr Soukup @petrsoukup
● Jan Škrášek @hrachcz
● Jiří Pudil @jiripudil
● Patrik Votoček @PatrikVotocek
● Michal Špaček @spazef0rze
● Jan Kuchař @honzakuchar
Díky za pozornost!
@ProchazkaFilip
#makeCodeNotWar

Más contenido relacionado

Similar a Před čím vás Nette ani Symfony neochrání

Český fulltext a sdílené slovníky
Český fulltext a sdílené slovníkyČeský fulltext a sdílené slovníky
Český fulltext a sdílené slovníkyTomas Vondra
 
Malware Houdiny
Malware HoudinyMalware Houdiny
Malware HoudinyCESNET
 
Softwarove protektory / KAREL LEJSKA, MILAN BARTOŠ [DEFENDIO]
Softwarove protektory / KAREL LEJSKA, MILAN BARTOŠ [DEFENDIO]Softwarove protektory / KAREL LEJSKA, MILAN BARTOŠ [DEFENDIO]
Softwarove protektory / KAREL LEJSKA, MILAN BARTOŠ [DEFENDIO]Security Session
 
Pokročilé techniky programování .NET a C#
Pokročilé techniky programování .NET a C#Pokročilé techniky programování .NET a C#
Pokročilé techniky programování .NET a C#Jan Hřídel
 
Mikro­kontrolér s Wi-Fi za $3! nejen pro IOT
Mikro­kontrolér s Wi-Fi za $3! nejen pro IOTMikro­kontrolér s Wi-Fi za $3! nejen pro IOT
Mikro­kontrolér s Wi-Fi za $3! nejen pro IOTAdam Hořčica
 
WP výkon a jeho profilování
WP výkon a jeho profilováníWP výkon a jeho profilování
WP výkon a jeho profilováníVladimír Smitka
 
React premature performance optimization
React premature performance optimizationReact premature performance optimization
React premature performance optimizationMartinKritof1
 
Czech Oracle Solaris Administrators Day 2011 - DTrace
Czech Oracle Solaris Administrators Day 2011 - DTrace Czech Oracle Solaris Administrators Day 2011 - DTrace
Czech Oracle Solaris Administrators Day 2011 - DTrace Martin Cerveny
 
20101124 Aplikované nástroje SW inženýra
20101124 Aplikované nástroje SW inženýra20101124 Aplikované nástroje SW inženýra
20101124 Aplikované nástroje SW inženýraJiří Mareš
 
ClojureScript
ClojureScriptClojureScript
ClojureScriptjakubkoci
 
Zabezpečení nejen SSH na serveru pomocí Fail2Ban a jednoduchého honeypotu. / ...
Zabezpečení nejen SSH na serveru pomocí Fail2Ban a jednoduchého honeypotu. / ...Zabezpečení nejen SSH na serveru pomocí Fail2Ban a jednoduchého honeypotu. / ...
Zabezpečení nejen SSH na serveru pomocí Fail2Ban a jednoduchého honeypotu. / ...Security Session
 
Jakub Vrána: Dokazatelná bezpečnost
Jakub Vrána: Dokazatelná bezpečnostJakub Vrána: Dokazatelná bezpečnost
Jakub Vrána: Dokazatelná bezpečnostDevelcz
 

Similar a Před čím vás Nette ani Symfony neochrání (14)

Český fulltext a sdílené slovníky
Český fulltext a sdílené slovníkyČeský fulltext a sdílené slovníky
Český fulltext a sdílené slovníky
 
Malware Houdiny
Malware HoudinyMalware Houdiny
Malware Houdiny
 
Softwarove protektory / KAREL LEJSKA, MILAN BARTOŠ [DEFENDIO]
Softwarove protektory / KAREL LEJSKA, MILAN BARTOŠ [DEFENDIO]Softwarove protektory / KAREL LEJSKA, MILAN BARTOŠ [DEFENDIO]
Softwarove protektory / KAREL LEJSKA, MILAN BARTOŠ [DEFENDIO]
 
Pokročilé techniky programování .NET a C#
Pokročilé techniky programování .NET a C#Pokročilé techniky programování .NET a C#
Pokročilé techniky programování .NET a C#
 
Mikro­kontrolér s Wi-Fi za $3! nejen pro IOT
Mikro­kontrolér s Wi-Fi za $3! nejen pro IOTMikro­kontrolér s Wi-Fi za $3! nejen pro IOT
Mikro­kontrolér s Wi-Fi za $3! nejen pro IOT
 
WP výkon a jeho profilování
WP výkon a jeho profilováníWP výkon a jeho profilování
WP výkon a jeho profilování
 
React premature performance optimization
React premature performance optimizationReact premature performance optimization
React premature performance optimization
 
Czech Oracle Solaris Administrators Day 2011 - DTrace
Czech Oracle Solaris Administrators Day 2011 - DTrace Czech Oracle Solaris Administrators Day 2011 - DTrace
Czech Oracle Solaris Administrators Day 2011 - DTrace
 
20101124 Aplikované nástroje SW inženýra
20101124 Aplikované nástroje SW inženýra20101124 Aplikované nástroje SW inženýra
20101124 Aplikované nástroje SW inženýra
 
ClojureScript
ClojureScriptClojureScript
ClojureScript
 
Tag management
Tag managementTag management
Tag management
 
Zabezpečení nejen SSH na serveru pomocí Fail2Ban a jednoduchého honeypotu. / ...
Zabezpečení nejen SSH na serveru pomocí Fail2Ban a jednoduchého honeypotu. / ...Zabezpečení nejen SSH na serveru pomocí Fail2Ban a jednoduchého honeypotu. / ...
Zabezpečení nejen SSH na serveru pomocí Fail2Ban a jednoduchého honeypotu. / ...
 
Django
DjangoDjango
Django
 
Jakub Vrána: Dokazatelná bezpečnost
Jakub Vrána: Dokazatelná bezpečnostJakub Vrána: Dokazatelná bezpečnost
Jakub Vrána: Dokazatelná bezpečnost
 

Más de Filip Procházka

Más de Filip Procházka (15)

4 roky remote
4 roky remote4 roky remote
4 roky remote
 
Doctrine: co dělat, když entity nestačí
Doctrine: co dělat, když entity nestačíDoctrine: co dělat, když entity nestačí
Doctrine: co dělat, když entity nestačí
 
Nejlepší cache je žádná cache
Nejlepší cache je žádná cacheNejlepší cache je žádná cache
Nejlepší cache je žádná cache
 
Testování prakticky
Testování praktickyTestování prakticky
Testování prakticky
 
Doctrine ORM & model
Doctrine ORM & modelDoctrine ORM & model
Doctrine ORM & model
 
CQRS v rohlik.cz
CQRS v rohlik.czCQRS v rohlik.cz
CQRS v rohlik.cz
 
Nette framework - How to compile an extensible di container
Nette framework - How to compile an extensible di containerNette framework - How to compile an extensible di container
Nette framework - How to compile an extensible di container
 
Kdyby/Translation
Kdyby/TranslationKdyby/Translation
Kdyby/Translation
 
Kdyby/Events #posobota
Kdyby/Events #posobotaKdyby/Events #posobota
Kdyby/Events #posobota
 
Kdyby/Events
Kdyby/EventsKdyby/Events
Kdyby/Events
 
Kdyby/Redis
Kdyby/RedisKdyby/Redis
Kdyby/Redis
 
Dependency injection v Nette 2.1 prakticky
Dependency injection v Nette 2.1 praktickyDependency injection v Nette 2.1 prakticky
Dependency injection v Nette 2.1 prakticky
 
Usnadněte si soužití s Doctrine
Usnadněte si soužití s DoctrineUsnadněte si soužití s Doctrine
Usnadněte si soužití s Doctrine
 
Nette Tester / Posobota
Nette Tester / PosobotaNette Tester / Posobota
Nette Tester / Posobota
 
Composer / Posobota
Composer / PosobotaComposer / Posobota
Composer / Posobota
 

Před čím vás Nette ani Symfony neochrání

  • 1. Před čím tě Nette ani Symfony neochrání @ProchazkaFilip #makeCodeNotWar
  • 2. ~ Anonym, v současnosti v programu ochrana svědků
  • 3. Staré verze ● PHP7 ● I v Nette jsou security bugy ● Composer ● PECL ● Systém ● Roave/SecurityAdvisories ● Symfony security:check
  • 4. Knihovny ● Je knihovna “stable”? Stará se o ni autor? ● Nastudovat api/internals ● Security audit? ● Nikdy nic nepředpokládejte! ● Integrační testy ● Pochopení flow dat - xdebug
  • 5. Špatné nastavení ● Umyslně ● Z neznalosti/nepochopení ● security: false curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
  • 6. Security through obscurity ● PHP: expose_php=Off ● Nginx: server_tokens off; ● Http client knihovny vs verze PHP
  • 8. XSS / escapování ● |noescape ○ translator ● href="foo?bar={$bar|urlescape}" ● escapeshellarg()
  • 9. SQL "UPDATE users SET pwd = '$pwd' WHERE id = '$uid'";
  • 10. SQL: escapování LIKE addcslashes($search_term, "%_"); function like($s, $e) { return str_replace([$e, '_', '%'], [$e.$e, $e.'_', $e.'%'], $s); } $q = $db->prepare("... WHERE name LIKE ? ESCAPE '=' AND ..."); $q->bindValue(1, '%'.like($name, '=').'%', PDO::PARAM_STR); Source
  • 12. SQL: IS vs = SELECT * FROM t WHERE col IS NULL; SELECT * FROM t WHERE col = NULL;
  • 13. SQL: PDO::ATTR_EMULATE_PREPARES ● Auto fallback WTF ● Výjimky při prepare dump($dbh->prepare('INSERT;')); $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); dump($dbh->prepare('INSERT;'));
  • 14. SQL: kódování ● SET NAMES utf8; ● DSN charset=utf8 ● Nové MySQL => utf8mb4
  • 15. SQL: MySQL sql mode ● strict = STRICT_TRANS_TABLES or STRICT_ALL_TABLES ○ Různá výchozí hodnota v závislosti na verzi MySQL ● ERROR_FOR_DIVISION_BY_ZERO + strict => error ● NO_UNSIGNED_SUBTRACTION ● NO_ZERO_DATE + strict => error ● NO_ZERO_IN_DATE + strict => error
  • 16. Validace vstupů ● Vyvarovat se ○ Použití globals $_ ○ filter_var($_POST['email'], FILTER_VALIDATE_EMAIL); ● Používat ○ Value/DTO objekty ■ Symfony Data Transformers? ○ Json Schema ○ JMS Serializer ○ Symfony/Validator ● Filesystém ○ fopen($file, "t");
  • 17. Validace vstupů: regulární výrazy ● Multiline ● A Z ● ^ $
  • 18. Type juggling ● uživatelské vstupy - především scalar vs array ● Podmínky ○ == vs === ○ in_array(,,true), array_search(,,true) ○ switch() ○ isset() vs array_key_exists() ○ empty() ~ !isset($var) || $var == false ● declare(strict_types=1) ● $objectA > $objectB
  • 20. Cache ● Sdílená cache ○ APC ● Cache poisoning ○ Router ○ Data v aplikaci ○ HTTP (proxyny atd) ● umask(0);
  • 21. File Upload ● $_FILES["file"]["type"]; ● Kontrolovat ○ koncovku ○ mime typ ● Stripnout EXIF data a uložit bokem, pokud je potřebuju ● Zajistit, aby nešlo spustit soubor připojením .php za název ● Vlastní názvy pomocí ○ Strings::webalize(), lépe random/UUID ○ lomítka a speciální znaky ○ null byte exploity v názvu souboru
  • 22. HTTPS & Security Headers ● Secured session sušenka (& permanent login cookie) ○ session.cookie_httponly=1 ○ session.cookie_secure=1 ○ session.use_only_cookies=1 ● HSTS ○ Zavádět s malou expirací, postupně zvyšovat když vše funguje ● CORS ● CSP ○ https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP ○ https://github.com/spaze/csp-config ○ https://csp-evaluator.withgoogle.com/
  • 23. HTTPS & Security Headers ● SRi ○ Michal Špaček: HTTP hlavičky, Subresource Integrity a spol. ○ https://github.com/spaze/sri-macros ● securityheaders.io ● observatory.mozilla.org
  • 24. Přístupný důvěrný obsah ● Čitelné .neon/.yml configy ● git, svn ● Uniknutí Laděnky ○ Debug mode ○ Přístupné na veřejné adrese, která je nezabezpečená
  • 25. Insecure Direct Object References ● Možnost editace něčeho k čemu nemám přístup ● Možnost vykradení dat ● UUID (neřeší problém, jen ho zmírní)
  • 26. Unvalidated Redirects and Forwards ● Zneužití redirect parametru ● Backlinky
  • 27. Random ● Kde ○ Generovaná hesla ○ jakékoliv tokeny v url a formulářích ● Co nepoužívat ○ rand, srand, getrandmax -> mt_rand() ● Co použít ○ random_int() ○ random_bytes() ○ Random::generate() ● paragonie/random_compat
  • 28. Crypto: ● Použít libsodium nebo openssl ● mcrypt je od 7.1 deprecated ● defuse/php-encryption “The First Rule of Cryptography: Don't Implement it Yourself”
  • 29. Hashování Cryptographic Hashes ● Fast ● Only one input: The message Password Hashes ● Intentionally slow ● At least three inputs: ○ The password ○ A per-user salt ○ A cost factor (how expensive to make the computation) Source
  • 30. Hashování ● memory-hard algoritmy ○ Scrypt ○ Argon2 ○ Bcrypt - don’t be smart, just use Bcrypt ● Bcrypt omezení (bugs in the algorithm itself) ○ 72 znaků ○ Truncate NUL byte ○ base64_encode(hash('sha384', $password, true)); ● password_hash() & password_verify() ● Kdy má smysl šifrovat hashe hesel? ○ Když je všechno ostatní vyřešný! Source
  • 31. Side-channel attack ● Constant-time porovnávání stringů ○ hash_equals() ○ baseN kódování paragonie/constant_time_encoding ○ Anthony Ferrara: It's All About Time ● password_verify() má ochranu zabudovanou
  • 32. Monitoring ● Logovat “nebezpečné” operace ○ Přihlášení ○ Registrace ○ Zapomenuté heslo ○ …?
  • 33. Díky všem co přispěli! ● Jan Tvrdík @jantvrdik ● Jakub Chábek @grongor ● Jan-Sebastian Fabík @janfabik ● David Matějka @matej_21 ● Petr Soukup @petrsoukup ● Jan Škrášek @hrachcz ● Jiří Pudil @jiripudil ● Patrik Votoček @PatrikVotocek ● Michal Špaček @spazef0rze ● Jan Kuchař @honzakuchar