Diário de Bordo – Mateus Vieira
Disciplina: Gestão de Configuração e Evolução de Software
Equipe: OWASP (Time Red)
Comunidade/Projeto de Software Livre: OWASP (ej-application)
Sprint 4 – 22/10/2025 – 11/11/2025
Resumo da Sprint
Nesta sprint, foi realizado um estudo aprofundado sobre a biblioteca nh3, utilizada para sanitização de HTML. Após entender seu funcionamento, foram conduzidos testes práticos para validar como a biblioteca se comporta com diferentes entradas que poderiam gerar vulnerabilidades XSS. Por fim, a solução foi implementada diretamente no backend do projeto ej-application, garantindo proteção efetiva contra ataques de Cross-Site Scripting.
Atividades realizadas (detalhado)
| Data | Atividade | Tipo | Referência / Observação |
|---|---|---|---|
| 27-31/10 | Estudo sobre biblioteca nh3 |
Estudo | |
| 03-07/11 | Realização de testes com a biblioteca nh3 |
Estudo/Testes | |
| 08-11/11 | Solução do XSS a partir da sanitização em backend com nh3 |
Implementação | Implementação da Solução |
| 18/11/25 | Abertura do MR no GitLab | Contribuição | MR #392 |
Estudo sobre nh3
Durante o período de estudo, analisei a documentação oficial da biblioteca nh3, bem como exemplos de uso em diferentes projetos Python. O foco do estudo foi:
- Entender como a biblioteca realiza sanitização de HTML de forma segura.
- Identificar a diferença entre whitelists globais e whitelists por tag.
- Ver como nh3 lida com atributos como style, href e propriedades CSS.
- Explorar o mecanismo de filtragem de propriedades via filter_style_properties.
- Compreender limitações da biblioteca e casos onde comportamentos perigosos poderiam sobreviver sem configuração adequada.
Além disso, foi avaliada a compatibilidade da biblioteca com formulários Django, especialmente campos que recebem HTML enriquecido.
Testes da Biblioteca
Os testes envolveram envio de múltiplas strings contendo HTML válido, inválido e malicioso, como:
<script>alert(1)</script><img src=x onerror=alert(1)><a href="javascript:alert(1)">click</a>-
Uso de CSS malicioso, incluindo:
-
background-image: url("javascript:alert(1)") expression(alert(1))
Foram testados também:
- Limitação de atributos por tag.
- Entrada de HTML com
span,p,dive tags inline. - Como o
nh3remove atributos não permitidos. - Como a biblioteca trata CSS permitido e não permitido com
filter_style_properties.
Conclusões dos testes:
nh3remove completamente tags perigosas como<script>.- Eventos JavaScript (ex.:
onerror,onclick) são automaticamente removidos. - URLs com prefixo
javascript:são eliminadas. - Apenas as propriedades CSS explicitamente autorizadas são mantidas.
- A sanitização funciona consistentemente mesmo quando o HTML chega "quebrado" ou parcialmente malformado.
Implementação da Solução
Após estudos e testes, a solução foi implementada diretamente nos métodos clean_welcome_message e clean_ending_message do formulário de conversação. Para evitar duplicação de código, foi criada uma função auxiliar responsável por aplicar as regras de sanitização em qualquer campo HTML:
def _clean_html_field(self, field_name):
data = self.cleaned_data.get(field_name, "")
return nh3.clean(
data,
attributes={
"*": {"style", "href"}
},
filter_style_properties={"color", "font-weight", "text-align", "background-color"}
)
def clean_welcome_message(self):
return self._clean_html_field("welcome_message")
def clean_ending_message(self):
return self._clean_html_field("ending_message")
Dessa forma:
- O código fica mais organizado.
- A manutenção e expansão da sanitização se tornam mais fáceis.
- A chance de divergência entre sanitizações de diferentes campos é eliminada.
A implementação foi concluída e enviada como MR #392.
Maiores Dificuldades
- Não houve dificuldade durante o processo de estudo e implementação da solução
Aprendizados
- Utilização da lib
nh3para sanitizar strings recebidas como HTML e remover tags maliciosas
Plano pessoal para a próxima sprint
- Documentar TTPs no formato MITRE ATT&CK