Identificar e corrigir vulnerabilidades de segurança em código Python com Bandit
Tags: python, devsecops, security, sast
Published: 2023-09-10 08:04:06

A segurança da informação em falta no desenvolvimento de software oferece preocupações críticas, o código pode conter vulnerabilidades que passam despercebidas, colocando em risco a integridade e a privacidade dos dados. Hoje, vamos explorar três incidentes de segurança identificados pelo Bandit, uma poderosa ferramenta de análise de segurança para código Python, e aprender como corrigi-los.


O [Bandit](https://bandit.readthedocs.io/en/latest/) é uma ferramenta de análise de segurança de código-fonte Python que verifica seu código em busca de vulnerabilidades conhecidas e potenciais ameaças de segurança.

## Código Python

```python
import requests
from flask import Flask, Response

app = Flask(__name__)

@app.route('/')
def home():
    json_url = 'http://127.0.0.1:3000'
    response = requests.get(json_url)
    json_data = response.json()

    page = []
    for data in json_data:
        dia_jogo = f"<h2>{data.get('diaJogo', '')}</h2>"
        tabela_html = data.get('content', '')
        page.append(dia_jogo)
        page.append(tabela_html)

    return Response(page)

if __name__ == '__main__':
     app.run(debug=True, host='0.0.0.0', port=5000)
```

Este exemplo define uma aplicação web usando o framework Flask. Quando alguém acessa a raiz ("/") da aplicação, ele envia uma solicitação HTTP para um servidor local (http://127.0.0.1:3000) usando a biblioteca "requests" e obtém dados JSON como resposta. Em seguida, ele formata esses dados em HTML e os exibe como uma página da web no navegador do usuário, incluindo títulos `(<h2>)` e tabelas. A aplicação é executada em "0.0.0.0" na porta 5000 em modo de depuração quando o script é executado diretamente.

Imagine a situação na qual este código foi desenvolvido localmente e, após funcionar de maneira esperada, está em execução em algum servidor. Vamos executar o Bandit para ver se encontraremos algo de errado.

## Bandit

Instalando o Bandit: `pip install bandit`
 
`fut.py`, nome do arquivo onde está localizado o código de exemplo acima.

Execução: `bandit fut.py`

Temos a saída do comando com estes três incidentes encontrados:

![bandit](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0d6fc3hwq8jfdtgny06y.jpg)



### Incidente 1: Solicitação sem Limite de Tempo

A primeira vulnerabilidade identificada pelo Bandit é a falta de um limite de tempo (timeout) em uma solicitação HTTP. Em nosso código, a chamada requests.get(json_url) não possui um timeout especificado, o que pode levar a problemas de desempenho ou bloqueio se o servidor não responder. Para evitar isso, você deve definir um limite de tempo para sua solicitação, conforme explicado [aqui](https://bandit.readthedocs.io/en/1.7.5/plugins/b113_request_without_timeout.html).

### Incidente 2: Exposição do Modo de Depuração do Flask

Um dos problemas mais graves identificados pelo Bandit é a exposição do modo de depuração do Flask. Em nosso exemplo, a configuração debug=True permite que o depurador Werkzeug seja acessado externamente, o que poderia permitir a execução de código arbitrário por meio de solicitações HTTP. Para corrigir isso, certifique-se de desativar o modo de depuração em ambientes de produção, como discutido [aqui](https://bandit.readthedocs.io/en/1.7.5/plugins/b201_flask_debug_true.html).

### Incidente 3: Vinculação a Todas as Interfaces

O último incidente identificado é a possível vinculação a todas as interfaces de rede. Neste caso, o código vincula a aplicação a todas as interfaces usando host='0.0.0.0', o que pode ser arriscado em termos de segurança. Para corrigir isso, você deve especificar a interface à qual deseja vincular sua aplicação, além de que muito provavelmente para este caso será utilizado um servidor web reverso para encaminhar as solicitações para o aplicativo Flask executando em localhost (127.0.0.1) e na porta específica. Detalhes sobre este incidente é discutido [aqui](https://bandit.readthedocs.io/en/1.7.5/plugins/b104_hardcoded_bind_all_interfaces.html).


```python
import requests
from flask import Flask, Response

app = Flask(__name__)

@app.route('/')
def home():
    json_url = 'http://127.0.0.1:3000'
    response = requests.get(json_url, timeout=10)
    json_data = response.json()

    page = []
    for data in json_data:
        dia_jogo = f"<h2>{data.get('diaJogo', '')}</h2>"
        tabela_html = data.get('content', '')
        page.append(dia_jogo)
        page.append(tabela_html)

    return Response(page)

if __name__ == '__main__':
     app.run()
```


## Conclusão

O Bandit fornecerá relatórios detalhados sobre quaisquer problemas de segurança que encontrar no seu código. Você deve revisar esses relatórios e tomar as medidas apropriadas para corrigir as vulnerabilidades identificadas.

Lembre-se de que o Bandit se concentra em verificar problemas específicos de segurança em Python, como vulnerabilidades de execução de código arbitrário (por exemplo, injeção de código), gerenciamento inadequado de segredos e outros riscos conhecidos.

Ao abordar esses três incidentes identificados pelo Bandit, você aprendeu que é importante sempre manter seu código seguro e atualizado, seguindo as melhores práticas de segurança.