Este documento discute programação defensiva e como escrever código seguro. Ele explica por que a segurança do software é importante, conceitos como spoofing e negação de serviço, e técnicas como validação de entrada de usuário, uso de abstrações de banco de dados e frameworks, escrita de testes e configuração de headers de segurança.
2. Aviso Legal
Meu empregador não tem qualquer
responsabilidade sobre o que será
tratado aqui. Este documento contém
informações confidenciais e/ou
privilegiadas.
AVISO DE CONFIDENCIALIDADE
Se você não for o destinatário ou a
pessoa autorizada a receber este
documento, não deve usar, copiar ou
divulgar as informações nele contidas
ou tomar qualquer ação baseada nessas
informações.
3. Alcyon Junior
Head of Cyber Security na
POUPEX
Três graduações
Redes de
Computadores
Pós em Redes pela
Cisco | MBA em
Governança de TI |
Pós em
CyberSecurity
Mestrado em
Segurança
Cibernética
Autor de livros
sobre Segurança
Cibernética
EHF | ISO27002
| ITILF | CNAP |
CEH | MVM |
LPIC-1
Instrutor
credenciado
pela EXIN e
Líder da OWASP
BSB
#WHOAMI
8. DESAFIOS DA SEGURANÇA DA
INFORMAÇÃO
CONCEITOS
Por que os desenvolvedores não escrevem código seguro?
Nós não estamos falando ainda outra vez sobre "código limpo" aqui. Estamos
falando de algo mais, em uma perspectiva prática pura, segurança e segurança
do software. Sim, porque um software inseguro é praticamente inútil. Vamos
ver o que significa software inseguro
9. DESAFIOS DA SEGURANÇA DA
INFORMAÇÃO
CONCEITOS
• O voo 501 do Ariane 5 da Agência Espacial Europeia foi
destruído 40 segundos após a decolagem (4 de junho de
1996). O protótipo de foguete de US $ 1 bilhão foi
destruído devido a um bug no software de orientação a
bordo
• Um bug no código que controla a máquina de terapia por
radiação Therac-25 foi diretamente responsável por pelo
menos cinco mortes de pacientes nos anos 80, quando
administrou quantidades excessivas de raios-X.
• O erro de software de um MIM-104 Patriot fez com que o
relógio do sistema se desviasse um terço de segundo em
um período de cem horas - resultando na falha de localizar
e interceptar um míssil de entrada. O míssil iraquiano teve
impacto em um complexo militar em Dhahran, na Arábia
Saudita (25 de fevereiro de 1991), matando 28 americanos
10.
11. DESAFIOS DA SEGURANÇA DA
INFORMAÇÃO
CONCEITOS
S Spoofing Forjamento de Identidade
Fingir ser alguém ou algo
que você não é
Autenticação
A2-Broken Authentication
and Session Management;
A3-Cross-Site Scripting (XSS)
T Tampering Adulteração de Dados
Modificar dados
armazenados ou dados
em trânsito
Integridade
A1-Injection;
A3-Cross-Site Scripting (XSS);
A4- Insecure Direct Object
References;
A6- Sensitive Data Exposure
R Repudiation Rejeição
Negar que fez ou não fez
algo
Não Repúdio
AA2-Broken Authentication and
Session Management;
A10-Unvalidated Redirects and
Forwards
I
Information
Discosure
Divulgação de
Informações
Ver informações que você
não está permitido a ver
Confidencialidade
A1-Injection;
A3- Cross-Site Scripting (XSS);
A4- Insecure Direct Object
References;
A6- Sensitive Data Exposure
D Denial of Service Recusa de Serviço
Negar um serviço, deixar o
sistema indisponível.
Disponibilidade
A5-Security Misconfiguration;
A9- Using Components with Known
Vulnerabilities
E
Elevation of
Privilege
Elevação de Privilégio Fazer algo sem permissão Autorização
A2-Broken Authentication and
Session Management;
A7- Missing Function Level Access
Control;
A8- Cross-Site Request Forgery (CSRF)
15. DESAFIOS DA SEGURANÇA DA
INFORMAÇÃO
DEFENSIVE PROGRAMMING
Por que eu acho que a Programação Defensiva é uma boa
abordagem para resolver esses problemas em certos tipos de
projetos?
Defenda-se contra o impossível, porque o impossível acontecerá.
A programação defensiva é uma forma de design defensivo
destinado a garantir a função contínua de um software em
circunstâncias imprevistas. Práticas de programação defensiva
são frequentemente usadas onde alta disponibilidade,
segurança ou segurança são necessárias - Wikipedia
16. DESAFIOS DA SEGURANÇA DA
INFORMAÇÃO
DEFENSIVE PROGRAMMING
Nunca confie na entrada do usuário
Suponha sempre que você vai receber algo que você não espera. Esta deve
ser sua abordagem como um programador defensivo, contra a entrada do
usuário ou, em geral, coisas que entram no seu sistema. Isso porque, como
dissemos, podemos esperar o inesperado.
• Tente ser o mais rigoroso possível.
• Imponha os seus valores de entrada.
As listas de desbloqueio que não são listas negras, por exemplo, ao
validar uma extensão de imagem, não verificam os tipos inválidos, mas
verificam os tipos válidos, excluindo todo o restante. No PHP, no
entanto, você também tem um número infinito de bibliotecas de validação
de código aberto para tornar seu trabalho mais fácil.
A melhor defesa é um bom ataque. Seja rigoroso
17. DESAFIOS DA SEGURANÇA DA
INFORMAÇÃO
DEFENSIVE PROGRAMMING
Use abstração de banco de dados
A primeira das 10 principais vulnerabilidades de segurança do OWASP é a
injeção. Isso significa que alguém (muitas pessoas por aí) ainda não está
usando ferramentas seguras para consultar seus bancos de dados.
Por favor, use pacotes e bibliotecas de abstração de banco de dados. No
PHP você pode usar o PDO para garantir proteção básica contra injeção .
19. DESAFIOS DA SEGURANÇA DA
INFORMAÇÃO
DEFENSIVE PROGRAMMING
Não reinvente a roda
Você não usa um framework (ou micro framework)?
Bem, você gosta de fazer um trabalho extra sem motivo, parabéns! Não se
trata apenas de frameworks, mas também de novos recursos nos quais você
poderia facilmente usar algo que já existe, bem testado, confiável por
milhares de desenvolvedores e estável , em vez de criar algo sozinho
apenas por causa disso. As únicas razões pelas quais você deve construir
algo por si mesmo é que você precisa de algo que não existe ou que
existe, mas não se encaixa nas suas necessidades (mau desempenho, falta
de recursos, etc.)
Isso é o que é chamado de reutilização de código inteligente. Abrace
isso!!!
20. DESAFIOS DA SEGURANÇA DA
INFORMAÇÃO
DEFENSIVE PROGRAMMING
Não confie em desenvolvedores
A programação defensiva pode estar relacionada a algo chamado Direção
Defensiva.
Na Direção Defensiva, assumimos que todos ao nosso redor podem,
potencialmente e possivelmente, cometer erros. Portanto, temos que ter
cuidado até mesmo com o comportamento dos outros.
O mesmo conceito se aplica à Programação Defensiva onde nós, como
desenvolvedores, não devemos confiar no código de outros desenvolvedores.
Nós não devemos confiar em nosso código também.
Em grandes projetos, onde muitas pessoas estão envolvidas, podemos ter
muitas maneiras diferentes de escrever e organizar o código. Isso também
pode levar a confusão e até mais bugs.
É por isso que devemos impor estilos de codificação e detector erro para
tornar nossa vida mais fácil.
21. DESAFIOS DA SEGURANÇA DA
INFORMAÇÃO
DEFENSIVE PROGRAMMING
Escrever código seguro
Essa é a parte difícil para um programador (defensivo), escrever código
que não é ruim. E isso é uma coisa que muitas pessoas conhecem e falam,
mas ninguém realmente se importa ou coloca a quantidade certa de atenção
e esforço nisso para alcançar o código sólido.
22. DESAFIOS DA SEGURANÇA DA
INFORMAÇÃO
DEFENSIVE PROGRAMMING
<?php
//In order to set the XXSSProtection header, you'll have to add the following code to the head of your application:
header("XXSSProtection:1; mode=block");
?>
23. DESAFIOS DA SEGURANÇA DA
INFORMAÇÃO
DEFENSIVE PROGRAMMING
<?php
class passwordPolicy{
public function createPassword($pwd){
$proceed = true;
//Recommended to use a small phrase instead of a password:
if(strlen($pwd) < 8 ){
$error .= "Password too short!";
$proceed = false;
}
$pattern = array("/[09]+/","/[az]+/","/[AZ]+/","/W+/");
/*
The password should include at least one number, a small letter, a CAPS,
and a special character as defined in the patterns array:
*/
foreach($pattern as $value){
if(!preg_match($value, $pwd)){
$error .= "Password incomplete";
$proceed = false;
}
}
24. DESAFIOS DA SEGURANÇA DA
INFORMAÇÃO
DEFENSIVE PROGRAMMING
$file = file_get_contents('badpasswords.txt');
$pattern = explode(',', $file);
foreach($pattern as $password){
if(preg_match($password, $pwd)){
$error .= "Your password was matched with the bad password list, please try
again.";
$proceed = false;
}
}
if($proceed == true){
echo "Your password is allowed!";
return true;
}else{
echo "Password validation failure(your choice is weak): $error";
return false
}
}
}
25. DESAFIOS DA SEGURANÇA DA
INFORMAÇÃO
DEFENSIVE PROGRAMMING
<?php
class includeXSL{
public function including($whiteListing, $inputParam, $countLevel){
//Include the classes of which you want to use objects from
include_once("classes.php");
$whitelist = new whitelisting();
$continue = true;
if($whitelist>checkpattern($whiteListing, $inputParam, $countLevel) == false)
{$continue = false;}
//If all went good we do the function
if($continue == true){
LOAD XML FILE
// Load the XML source
$xml = new DOMDocument;
$xml>load('test.xml');
$xsl = new DOMDocument('1.0','UTF8');
$xsl>load($inputParam);
// Configure the transformer
$proc = new XSLTProcessor;
$proc>importStyleSheet($xsl); // attach the xsl rules
echo $proc>transformToXML($xml);
26. DESAFIOS DA SEGURANÇA DA
INFORMAÇÃO
DEFENSIVE PROGRAMMING
Escrever testes
Eu ainda preciso dizer isso?
Escrever testes unitários ajudará você a aderir a princípios comuns, como
Alta Coesão, Responsabilidade Única, Baixo Acoplamento e composição de
objetos corretos. Ele ajuda você não só a testar o caso de unidade
pequena de trabalho, mas também a maneira como você estruturou seu
objeto.
Na verdade, você verá claramente ao testar suas pequenas funções quantos
casos você precisa testar e quantos objetos você precisa reproduzir para
obter uma cobertura de código de 100%.
28. VAMOS PENSAR UM POUCO?
“- aquele que conhece o inimigo e a si mesmo,
lutará cem batalhas sem perigo de derrota;
- para aquele que não conhece o inimigo, mas
conhece a si mesmo, as chances para a vitória ou
para a derrota serão iguais;
- aquele que não conhece nem o inimigo e nem a si
próprio, será derrotado em todas as batalhas.”
Sun Tzu (A arte da Guerra)