Skip to content

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, div e tags inline.
  • Como o nh3 remove atributos não permitidos.
  • Como a biblioteca trata CSS permitido e não permitido com filter_style_properties.

Conclusões dos testes:

  • nh3 remove 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 nh3 para sanitizar strings recebidas como HTML e remover tags maliciosas

Plano pessoal para a próxima sprint

  • Documentar TTPs no formato MITRE ATT&CK