Slide 1

Slide 1 text

© 2021 Thoughtworks | Confidential Escrevendo códigos seguros em Python 1 @yyyyyyyan_

Slide 2

Slide 2 text

© 2021 Thoughtworks | Confidential “Programar em Python é fácil” 2 2 © 2021 Thoughtworks

Slide 3

Slide 3 text

© 2021 Thoughtworks | Confidential “Programar em Python é fácil?” 3 3 © 2021 Thoughtworks

Slide 4

Slide 4 text

© 2021 Thoughtworks | Confidential eval() é realmente perigoso 4 1.

Slide 5

Slide 5 text

© 2021 Thoughtworks | Confidential eval(expression[, globals[, locals]]) Avalia uma expressão Python e retorna o resultado 5 Parâmetros opcionais: - globals Dicionário - locals Qualquer mapping object

Slide 6

Slide 6 text

© 2021 Thoughtworks | Confidential 6 O perigo começa quando...

Slide 7

Slide 7 text

© 2021 Thoughtworks | Confidential 7 E se limparmos as variáveis globais?

Slide 8

Slide 8 text

© 2021 Thoughtworks | Confidential 8 O Python insere builtins automaticamente...

Slide 9

Slide 9 text

© 2021 Thoughtworks | Confidential 9 E se especificamente limparmos os builtins?

Slide 10

Slide 10 text

© 2021 Thoughtworks | Confidential 10 Montando um payload

Slide 11

Slide 11 text

© 2021 Thoughtworks | Confidential 11 Montando um payload

Slide 12

Slide 12 text

© 2021 Thoughtworks | Confidential 12 eval() é realmente perigoso SamuelAnttila / netsec.expert

Slide 13

Slide 13 text

© 2021 Thoughtworks | Confidential - ast.literal_eval(node_or_string) - Parse de string 13 Alternativas

Slide 14

Slide 14 text

© 2021 Thoughtworks | Confidential 14 Então quando devemos usar o eval()? Quando não há outra maneira viável de realizar uma tarefa

Slide 15

Slide 15 text

© 2021 Thoughtworks | Confidential 15 Então quando devemos usar o eval()? Quando não há outra maneira viável de realizar uma tarefa (nunca)

Slide 16

Slide 16 text

© 2021 Thoughtworks | Confidential Executando código arbitrário com o pickle 16 2.

Slide 17

Slide 17 text

© 2021 Thoughtworks | Confidential pickle.dump(obj, file, protocol=None, *) pickle.dumps(obj, protocol=None, *) Serializa um objeto Python em uma sequência de bytes 17 Parâmetros opcionais: - protocol Número inteiro indicando o protocolo usado para a serialização. Atualmente vai de 0 (mais antigo) a 5 Python 3.8.

Slide 18

Slide 18 text

© 2021 Thoughtworks | Confidential 18 O método mágico __reduce__() Usado para customizar como instâncias de classe são serializadas. Deve retornar uma string ou uma tupla com um callable e seus argumentos.

Slide 19

Slide 19 text

© 2021 Thoughtworks | Confidential 19 O método mágico __reduce__() Usado para customizar como instâncias de classe são serializadas. Deve retornar uma string ou uma tupla com um callable e seus argumentos.

Slide 20

Slide 20 text

© 2021 Thoughtworks | Confidential 20 Abrindo o pote de picles com o pickletools

Slide 21

Slide 21 text

© 2021 Thoughtworks | Confidential 21 Mas e para executar código arbitrário?

Slide 22

Slide 22 text

© 2021 Thoughtworks | Confidential 22 Serializando código arbitrário com marshal

Slide 23

Slide 23 text

© 2021 Thoughtworks | Confidential 23 E pra executar isso?

Slide 24

Slide 24 text

© 2021 Thoughtworks | Confidential 24 Montando o pickle malicioso

Slide 25

Slide 25 text

© 2021 Thoughtworks | Confidential 25 Demonstração

Slide 26

Slide 26 text

© 2021 Thoughtworks | Confidential Assinar pickle com HMAC 26 Prevenção Alternativa Usar um padrão de serialização mais seguro (JSON)

Slide 27

Slide 27 text

© 2021 Thoughtworks | Confidential O poder do pip install 27 3.

Slide 28

Slide 28 text

© 2021 Thoughtworks | Confidential 28 O que acontece quando rodamos pip install? 1. Identificação das requisições base e dos argumentos passados 2. Resolução das dependências e determinação do que será instalado 3. Determinação do método de instalação 4. Instalação dos pacotes

Slide 29

Slide 29 text

© 2021 Thoughtworks | Confidential 29 Determinação do método de instalação Se tem uma wheel disponível: Baixa a wheel e instala por ela; Senão: Baixa o código fonte do pacote; Se for possível fazer o build da wheel pelo código fonte: Faz o build da wheel e instala por ela; Senão: Instala pelo setup.py;

Slide 30

Slide 30 text

© 2021 Thoughtworks | Confidential 30 setup.py - metadados dinâmicos

Slide 31

Slide 31 text

© 2021 Thoughtworks | Confidential 31 Executando código arbitrário na instalação

Slide 32

Slide 32 text

© 2021 Thoughtworks | Confidential 32 Demonstração

Slide 33

Slide 33 text

© 2021 Thoughtworks | Confidential 33 Risco na prática - Typosquatting

Slide 34

Slide 34 text

© 2021 Thoughtworks | Confidential 34 Risco na prática - --extra-index-url https://medium.com/@alex.birsan/dependency-confusion-4a5d60fec610

Slide 35

Slide 35 text

© 2021 Thoughtworks | Confidential - --only-binary - --require-hashes - NUNCA instale um pacote como sudo/administrador 35 Prevenção

Slide 36

Slide 36 text

© 2021 Thoughtworks | Confidential Dependências desatualizadas 36 4.

Slide 37

Slide 37 text

© 2021 Thoughtworks | Confidential 37 Vulnerabilidades são encontradas sempre!

Slide 38

Slide 38 text

© 2021 Thoughtworks | Confidential - Acompanhar releases dos pacotes que usamos - Acompanhar lista de vulnerabilidades do CVE (cve.mitre.org) 38 Prevenção

Slide 39

Slide 39 text

© 2021 Thoughtworks | Confidential Python desatualizado 39 5.

Slide 40

Slide 40 text

© 2021 Thoughtworks | Confidential 40 Vulnerabilidades são encontradas sempre!

Slide 41

Slide 41 text

© 2021 Thoughtworks | Confidential 41 Entendendo os status das branches do Python

Slide 42

Slide 42 text

© 2021 Thoughtworks | Confidential 42 Atenção com funções obsoletas!

Slide 43

Slide 43 text

© 2021 Thoughtworks | Confidential str.format() não guarda segredos 43 6.

Slide 44

Slide 44 text

© 2021 Thoughtworks | Confidential 44 Quem controla a formatação pode ver tudo! https://lucumr.pocoo.org/2016/12/29/careful-with-str-format/

Slide 45

Slide 45 text

© 2021 Thoughtworks | Confidential 45 Alternativa https://lucumr.pocoo.org/2016/12/29/careful-with-str-format/

Slide 46

Slide 46 text

© 2021 Thoughtworks | Confidential O problema do pseudo aleatório 46 7.

Slide 47

Slide 47 text

© 2021 Thoughtworks | Confidential 47 Como não gerar senhas seguras

Slide 48

Slide 48 text

© 2021 Thoughtworks | Confidential 48 O módulo random e a tal seed

Slide 49

Slide 49 text

© 2021 Thoughtworks | Confidential - Módulo secrets - os.urandom() - random.SystemRandom 49 Alternativas

Slide 50

Slide 50 text

© 2021 Thoughtworks | Confidential Cuidado com arquivos-bombas 50 8.

Slide 51

Slide 51 text

© 2021 Thoughtworks | Confidential 51 Billion laughs attack

Slide 52

Slide 52 text

© 2021 Thoughtworks | Confidential 52 Prevenção

Slide 53

Slide 53 text

© 2021 Thoughtworks | Confidential 53 Tarbombs e path traversal

Slide 54

Slide 54 text

© 2021 Thoughtworks | Confidential 54 Prevenção Não use o extractall() sem inspeção!

Slide 55

Slide 55 text

© 2021 Thoughtworks | Confidential assert é para debug! 55 9.

Slide 56

Slide 56 text

© 2021 Thoughtworks | Confidential 56 Para que serve o assert?

Slide 57

Slide 57 text

© 2021 Thoughtworks | Confidential 57 Economizando uma linha com o assert?

Slide 58

Slide 58 text

© 2021 Thoughtworks | Confidential 58 Não são equivalentes São equivalentes

Slide 59

Slide 59 text

© 2021 Thoughtworks | Confidential 59 A constante __debug__ e a flag -O

Slide 60

Slide 60 text

© 2021 Thoughtworks | Confidential Auditando nosso código 60

Slide 61

Slide 61 text

© 2021 Thoughtworks | Confidential 61 Muitas opções! - Codacy (gratuito para projetos Open Source) - Horusec (Open Source) - Pyre/Pysa (Open Source) - Coverity Scan (exclusivo para projetos Open Source) - Bandit (Open Source)

Slide 62

Slide 62 text

© 2021 Thoughtworks | Confidential 62 Usando o bandit

Slide 63

Slide 63 text

© 2021 Thoughtworks | Confidential Pontos-chaves para nunca esquecer 63

Slide 64

Slide 64 text

© 2021 Thoughtworks | Confidential Nunca confie no input do usuário 64 1.

Slide 65

Slide 65 text

© 2021 Thoughtworks | Confidential Evite executar código Python como sudo/administrador 65 2.

Slide 66

Slide 66 text

© 2021 Thoughtworks | Confidential Mantenha seu sistema atualizado 66 3.

Slide 67

Slide 67 text

© 2021 Thoughtworks | Confidential Leia a documentação 67 4.

Slide 68

Slide 68 text

© 2021 Thoughtworks | Confidential Leia a documentação 68 4.

Slide 69

Slide 69 text

© 2021 Thoughtworks | Confidential Use ferramentas de análise estática de código 69 5.

Slide 70

Slide 70 text

© 2021 Thoughtworks | Confidential Obrigado! 70 @yyyyyyyan_ @esquerdev https://speakerdeck.com/yyyyyyyan/escrevendo-codigos-seguros-em-python