Slide 1

Slide 1 text

Segurança em aplicativos web Nando Vieira

Slide 2

Slide 2 text

@fnando Nando Vieira

Slide 3

Slide 3 text

@fnando http://hellobits.com

Slide 4

Slide 4 text

@fnando howto. http://howto.io

Slide 5

Slide 5 text

@fnando http://codeplane.com.br

Slide 6

Slide 6 text

@fnando UM NOVO PROJETO.

Slide 7

Slide 7 text

@fnando VOCÊ TEM MUITO TRABALHO PELA FRENTE.

Slide 8

Slide 8 text

@fnando VOCÊ COLOCA O PROJETO NO AR.

Slide 9

Slide 9 text

@fnando VOCÊ SABE QUE É APENAS O COMEÇO.

Slide 10

Slide 10 text

@fnando VOCÊ ESTÁ SEGURO?

Slide 11

Slide 11 text

@fnando 75% DOS ATAQUES ESTÃO NA CAMADA DA APLICAÇÃO.

Slide 12

Slide 12 text

@fnando BRECHAS DE SEGURANÇA PODEM ACABAR COM A SUA CREDIBILIDADE.

Slide 13

Slide 13 text

Injection Broken Authentication & Session Management Cross-Site Scripting (XSS) Insecure Direct Object References Security Misconfiguration Sensitive Data Exposure Missing Function Level Access Control Cross-Site Request Forgery (CSRF) Using Components with Known Vulnerability Unvalidated Redirects and Forwards OWASP — TOP 10 2013

Slide 14

Slide 14 text

@fnando owasp.org

Slide 15

Slide 15 text

@fnando FRAMEWORKS COMO O RAILS SÃO BEM SEGUROS POR PADRÃO.

Slide 16

Slide 16 text

@fnando AINDA ASSIM, FRAMEWORKS TEM BRECHAS.

Slide 17

Slide 17 text

@fnando OUTRAS BRECHAS SÃO INTRODUZIDAS PELOS DEVS.

Slide 18

Slide 18 text

@fnando HOJE VAMOS VER COMO MINIMIZAR FALHAS DE SEGURANÇA.

Slide 19

Slide 19 text

@fnando CONFIGURAÇÃO

Slide 20

Slide 20 text

@fnando NUNCA ARMAZENE CONFIGS NO REPOSITÓRIO.

Slide 21

Slide 21 text

@fnando SE VOCÊ USA HEROKU, USE VARIÁVEIS DE AMBIENTE.

Slide 22

Slide 22 text

@fnando OU COPIE O ARQUIVO DE CONFIG NA HORA DO DEPLOY.

Slide 23

Slide 23 text

@fnando set :user, "deploy"! set :domain, 'howtocode.com.br'! set :deploy_to, '/var/www/howto-site'! set :repository, '[email protected]:fnando/howto-site.git'! set :branch, 'master'! ! set :shared_paths, ['.env', 'log', 'tmp']! ! desc "Deploys the current version to the server."! task :deploy => :environment do! deploy do! invoke :'git:clone'! invoke :'deploy:link_shared_paths'! invoke :'bundle:install'! invoke :'rails:assets_precompile'! ! to :launch do! queue "touch #{deploy_to}/shared/tmp/restart.txt"! end! end! end

Slide 24

Slide 24 text

@fnando NO RUBY, UTILIZE A BIBLIOTECA DOTENV. http://fnando.me/z0

Slide 25

Slide 25 text

@fnando NO PHP EXISTE O PHPDOTENV. http://fnando.me/yz

Slide 26

Slide 26 text

@fnando CRIE ARQUIVOS DE CONF QUE SÃO CARREGADOS NO BOOT DO APP.

Slide 27

Slide 27 text

@fnando DB_NAME=myapp_production DB_USERNAME=myapp DB_PASSWORD=8ea388a3a22c14b2c3 DB_HOSTNAME=127.0.0.1

Slide 28

Slide 28 text

@fnando

Slide 29

Slide 29 text

@fnando NÃO ADICIONE OS ARQUIVOS .ENV AO REPOSITÓRIO DO PROJETO.

Slide 30

Slide 30 text

@fnando SESSION HIJACKING

Slide 31

Slide 31 text

@fnando O PROTOCOLO HTTP É STATELESS.

Slide 32

Slide 32 text

@fnando USO DE COOKIES PARA FAZER A IDENTIFICAÇÃO DO USUÁRIO.

Slide 33

Slide 33 text

@fnando UM ATACANTE PODE ROUBAR O COOKIE DE UM USUÁRIO.

Slide 34

Slide 34 text

@fnando FORCE O USO DE SSL EM TUDO QUE EXIGE AUTENTICAÇÃO.

Slide 35

Slide 35 text

@fnando EXPIRE A SESSÃO EM CASO DE INATIVIDADE.

Slide 36

Slide 36 text

@fnando MARQUE COOKIES COM A OPÇÃO HTTP ONLY.

Slide 37

Slide 37 text

@fnando MARQUE COOKIES COM A OPÇÃO SECURE.

Slide 38

Slide 38 text

@fnando

Slide 39

Slide 39 text

@fnando

Slide 40

Slide 40 text

@fnando NUNCA ARMAZENE DADOS CONFIDENCIAIS NO CLIENTE.

Slide 41

Slide 41 text

@fnando OU USE SESSÃO.

Slide 42

Slide 42 text

@fnando PASSWORD

Slide 43

Slide 43 text

@fnando NUNCA ARMAZENE SENHAS EM TEXTO PURO.

Slide 44

Slide 44 text

@fnando http://fnando.me/z2

Slide 45

Slide 45 text

@fnando HASHING É UM POUCO MELHOR, MAS NÃO AJUDA MUITO.

Slide 46

Slide 46 text

@fnando

Slide 47

Slide 47 text

@fnando

Slide 48

Slide 48 text

@fnando FAZER SALTING É UM POUCO MELHOR.

Slide 49

Slide 49 text

@fnando

Slide 50

Slide 50 text

@fnando

Slide 51

Slide 51 text

@fnando O PROBLEMA É QUE HASHING FOI FEITO PARA SER RÁPIDO.

Slide 52

Slide 52 text

@fnando http://fnando.me/z3

Slide 53

Slide 53 text

@fnando USE UM ALGORITMO BASEADO EM BLOWFISH.

Slide 54

Slide 54 text

@fnando # Ruby require "bcrypt" ! # Saving to the database password = "darthvader" password_digest = BCrypt::Password.create(password, cost: 12) ! # Comparing the password if BCrypt::Password.new(password) == password_digest puts "Valid password!" else puts "Invalid password!" end

Slide 55

Slide 55 text

@fnando

Slide 56

Slide 56 text

@fnando ISSO MINIMIZA ATAQUES DE FORÇA BRUTA.

Slide 57

Slide 57 text

@fnando COMPLEMENTE SUA DEFESA COM OUTRAS TÉCNICAS.

Slide 58

Slide 58 text

@fnando REDIRECTIONS

Slide 59

Slide 59 text

@fnando O ATACANTE PODE USAR A ENTRADA DE URL PARA PHISHING.

Slide 60

Slide 60 text

@fnando CASO DE USO: REDIRECIONAR O USUÁRIO PARA UMA PÁGINA APÓS O LOGIN.

Slide 61

Slide 61 text

@fnando # Rails redirect_to params[:return_to] ! # PHP header("Location: " . $_GET["return_to"]);

Slide 62

Slide 62 text

@fnando PROCESSE A URL ANTES DE REDIRECIONAR O USUÁRIO.

Slide 63

Slide 63 text

@fnando class ReturnUrl attr_reader :default_url def initialize(default_url) @default_url = default_url end ! def return_url(url) return default_url if url.blank? ! uri = URI.parse(url) path = uri.path path << "?#{uri.query}" if uri.query path << "##{uri.fragment}" if uri.fragment path end end

Slide 64

Slide 64 text

@fnando defaultUrl = $defaultUrl; } ! function returnUrl($url) { if (!$url) { return $this->defaultUrl; } ! $uri = parse_url($url); $path = $uri["path"]; $path = $path ?: "/"; ! if ($uri["query"]) { $path .= "?" . $uri["query"]; } if ($uri["fragment"]) { $path .= "#" . $uri["fragment"]; } ! return $path; } }

Slide 65

Slide 65 text

@fnando O REFERRER PODE CONTER INFORMAÇÕES CONFIDENCIAIS.

Slide 66

Slide 66 text

@fnando http://presentta.com.br/386d31a6d7

Slide 67

Slide 67 text

@fnando FAÇA O REDIRECT À PARTIR DE UMA PÁGINA ESPECÍFICA.

Slide 68

Slide 68 text

@fnando EXIBA UMA PÁGINA INTERMEDIÁRIA.

Slide 69

Slide 69 text

@fnando

Slide 70

Slide 70 text

@fnando SQL INJECTION

Slide 71

Slide 71 text

@fnando UM ATACANTE PODE INJETAR SQL À PARTIR DE PARÂMETROS E FORMULÁRIOS.

Slide 72

Slide 72 text

@fnando # Rails id = params[:id] User.where("id = #{id}").destroy ! // PHP $id = $_GET["id"]; mysqli_query("DELETE FROM users WHERE id = '${id}'");

Slide 73

Slide 73 text

@fnando OMG!

Slide 74

Slide 74 text

@fnando # Rails id = "0 OR 1=1" User.where("id = #{id}").destroy ! // PHP $id = "0 OR 1=1"; mysqli_query("DELETE FROM users WHERE id = ${id}");

Slide 75

Slide 75 text

@fnando NUNCA INTERPOLE EM QUERIES SQL.

Slide 76

Slide 76 text

@fnando USE PREPARED STATEMENTS.

Slide 77

Slide 77 text

@fnando # Rails id = "0 OR 1=1" ! User.where("id = ?", id).destroy User.where("id = :id", id: id).destroy

Slide 78

Slide 78 text

@fnando prepare("delete from users where id = :id"); $query->bindParam(":id", $id, PDO::PARAM_INT); $query->execute();

Slide 79

Slide 79 text

@fnando TODOS ORMS IMPLEMENTAM ISSO.

Slide 80

Slide 80 text

@fnando CROSS-SITE SCRIPTING (XSS)

Slide 81

Slide 81 text

@fnando NUNCA CONFIE EM DADOS ENVIADOS PELOS USUÁRIOS.

Slide 82

Slide 82 text

@fnando VALIDE AS INFORMAÇÕES ANTES DE SALVÁ- LAS NO BANCO DE DADOS.

Slide 83

Slide 83 text

@fnando TODO DADO ENVIADO PELO USUÁRIO É INSEGURO.

Slide 84

Slide 84 text

@fnando TODO DADO INSEGURO DEVE SER PROCESSADO ANTES DE SER EXIBIDO.

Slide 85

Slide 85 text

@fnando REMOVA AS TAGS HTML ANTES DE RENDERIZAR O CONTEÚDO.

Slide 86

Slide 86 text

@fnando

Slide 87

Slide 87 text

@fnando ESCAPE CARACTERES COMO < e &.

Slide 88

Slide 88 text

@fnando

Slide 89

Slide 89 text

@fnando O RAILS POSSUI O MÉTODO SANITIZE.

Slide 90

Slide 90 text

@fnando OU USE O LOOFAH. http://fnando.me/o7

Slide 91

Slide 91 text

@fnando NÃO INTERPOLE VALORES ENVIADOS PELO USUÁRIO EM STRINGS HTML.

Slide 92

Slide 92 text

@fnando def annotation(text) %[#{text}].html_safe end def annotation(text) content_tag :em, text, class: "annotation" end def annotation(text) %[#{h(text)}].html_safe end

Slide 93

Slide 93 text

@fnando function annotation($text) { return "${text}"; } function annotation($text) { $text = escape_html(text); return "${text}"; }

Slide 94

Slide 94 text

@fnando NO JAVASCRIPT, VOCÊ PRECISA TOMAR O MESMO CUIDADO.

Slide 95

Slide 95 text

@fnando NÃO ATRIBUA HTML AO DEFINIR O CONTEÚDO FORNECIDO POR USUÁRIOS.

Slide 96

Slide 96 text

@fnando $.getJSON("/info", function(profile){ $(".profile").html(profile.bio); }); $.getJSON("/info", function(profile){! $(".profile").text(profile.bio);! });

Slide 97

Slide 97 text

@fnando SE VOCÊ PRECISAR DE UMA ESTRUTURA HTML, CRIE UMA ETAPA INTERMEDIÁRIA.

Slide 98

Slide 98 text

@fnando $.getJSON("/info", function(profile){ var content = $("
") .text(profile.bio) ; ! $(".profile").html(content); });

Slide 99

Slide 99 text

@fnando SOFTWARE UPDATE

Slide 100

Slide 100 text

@fnando NUNCA USE SOFTWARE DESATUALIZADO.

Slide 101

Slide 101 text

@fnando APLIQUE AS ATUALIZAÇÕES DE SEGURANÇA O MAIS RÁPIDO POSSÍVEL.

Slide 102

Slide 102 text

@fnando http://heartbleed.com

Slide 103

Slide 103 text

@fnando http://xkcd.com/1354

Slide 104

Slide 104 text

@fnando $ python heartbleed.py example.org

Slide 105

Slide 105 text

@fnando Received heartbeat response: 0000: 02 40 00 D8 03 00 53 43 5B 90 9D 9B 72 0B BC 0C [email protected][...r... 0010: BC 2B 92 A8 48 97 CF BD 39 04 CC 16 0A 85 03 90 .+..H...9....... 00d0: 10 00 11 00 23 00 00 00 0F 00 01 01 2F 33 34 2E ....#......./34. 00e0: 30 2E 31 38 34 37 2E 31 33 37 20 53 61 66 61 72 0.1847.137 Safar 00f0: 69 2F 35 33 37 2E 33 36 0D 0A 52 65 66 65 72 65 i/537.36..Refere 0100: 72 3A 20 68 74 74 70 73 3A 2F 2F 77 77 77 2E 74 r: https://examp 0110: 72 61 79 2E 63 6F 6D 2E 62 72 2F 0D 0A 41 63 63 le.org/......Acc 0120: 65 70 74 2D 45 6E 63 6F 64 69 6E 67 3A 20 67 7A ept-Encoding: gz 0130: 69 70 2C 64 65 66 6C 61 74 65 2C 73 64 63 68 0D ip,deflate,sdch. 0140: 0A 41 63 63 65 70 74 2D 4C 61 6E 67 75 61 67 65 .Accept-Language 0150: 3A 20 70 74 2D 42 52 2C 70 74 3B 71 3D 30 2E 38 : pt-BR,pt;q=0.8 0160: 2C 65 6E 2D 55 53 3B 71 3D 30 2E 36 2C 65 6E 3B ,en-US;q=0.6,en; 0170: 71 3D 30 2E 34 0D 0A 43 6F 6F 6B 69 65 3A 20 5F q=0.4..Cookie: _ 0180: 5F 75 74 6D 61 3D 34 37 35 37 33 32 31 38 2E 31 _utma=47573218.1 0190: 33 31 31 35 32 35 38 34 37 2E 31 34 30 30 30 39 311525847.140009 01a0: 31 35 31 39 2E 31 34 30 30 30 39 36 38 36 35 2E 1519.1400096865. 01b0: 31 34 30 30 31 35 31 35 33 34 2E 33 3B 20 5F 5F 1400151534.3; __ 01c0: 75 74 6D 7A 3D 34 37 35 37 33 32 31 38 2E 31 34 utmz=47573218.14 01d0: 30 30 30 39 31 35 31 39 2E 31 2E 31 2E 75 74 6D 00091519.1.1.utm 01e0: 63 73 72 3D 28 64 69 72 65 63 74 29 7C 75 74 6D csr=(direct)|utm 01f0: 63 63 6E 3D 28 64 69 72 65 63 74 29 7C 75 74 6D ccn=(direct)|utm 0200: 63 6D 64 3D 28 6E 6F 6E 65 29 0D 0A 0D 0A 25 30 cmd=(none)....%0

Slide 106

Slide 106 text

@fnando SE VOCÊ NÃO ATUALIZA SEU APLICATIVO, É HORA DE FICAR COM MEDO.

Slide 107

Slide 107 text

@fnando EXISTE UMA FERRAMENTA CHAMADA METASPLOIT.

Slide 108

Slide 108 text

@fnando ELA POSSUI EXPLOITS PARA AS FALHAS DE SEGURANÇA MAIS CONHECIDAS.

Slide 109

Slide 109 text

@fnando POSSUI DIVERSOS EXPLOITS PARA RAILS, PHP, JAVA, E MUITO MAIS.

Slide 110

Slide 110 text

@fnando EXPLOIT: SECRET TOKEN DO RAILS

Slide 111

Slide 111 text

@fnando

Slide 112

Slide 112 text

@fnando EXPLOIT: SERIALIZAÇÃO DE DADOS ENVIADOS

Slide 113

Slide 113 text

@fnando

Slide 114

Slide 114 text

@fnando ATUALIZE SEU APLICATIVO AGORA MESMO.

Slide 115

Slide 115 text

@fnando E ATUALIZE TODO E QUALQUER SOFTWARE QUE VOCÊ USA.

Slide 116

Slide 116 text

@fnando SE VOCÊ USA SOFTWARE DESATUALIZADO, ASSUME O RISCO DE SER INVADIDO.

Slide 117

Slide 117 text

@fnando MINIMIZE O DANO E SIGA O PRINCÍPIO DE MENOR PRIVILÉGIO.

Slide 118

Slide 118 text

@fnando VOCÊ NÃO PRECISA DE UM USUÁRIO SUDOER PARA O DEPLOY.

Slide 119

Slide 119 text

@fnando ACEITE AUTENTICAÇÃO APENAS POR SSH.

Slide 120

Slide 120 text

@fnando # /etc/ssh/sshd_config PasswordAuthentication no

Slide 121

Slide 121 text

@fnando LIBERE APENAS AS PORTAS NECESSÁRIAS.

Slide 122

Slide 122 text

@fnando apt-get install ufw ! ufw default deny ufw enable ufw logging low ufw delete ufw allow ssh ufw allow www ufw allow https ufw limit ssh

Slide 123

Slide 123 text

@fnando CONTRATE UM SYSADMIN EXPERIENTE.

Slide 124

Slide 124 text

@fnando FINALIZANDO

Slide 125

Slide 125 text

@fnando SEGURANÇA É COISA SÉRIA.

Slide 126

Slide 126 text

@fnando EXISTE MUITO MAIS DO QUE MOSTREI AQUI.

Slide 127

Slide 127 text

@fnando SEGURANÇA DEVE SER UMA PREOCUPAÇÃO CONSTANTE.

Slide 128

Slide 128 text

@fnando ACOMPANHE OS PROJETOS QUE VOCÊ USA.

Slide 129

Slide 129 text

@fnando ACOMPANHE OS SITES DE SEGURANÇA.

Slide 130

Slide 130 text

@fnando É A SUA CREDIBILIDADE QUE ESTÁ EM JOGO.

Slide 131

Slide 131 text

@fnando OBRIGADO. http://fnando.me/z1