◇ OpenCyber Academy
Engenharia · Capítulo 9 · Português

Capítulo 9 — Programação II

Ensino gratuito e aberto para quem deseja proteger pessoas e tecnologias. Não é preciso criar uma conta para estudar ou consultar as respostas.

Capítulo 9 — Programação II

Mapa da aula

Aula 09 publicada. Mapa, exemplo, EX025.

flowchart TD
  N0["9.1 Um programa de triagem"]
  N1["Laboratório — Agrupamento de reportes duplicados e t"]
  N2["9.2 Estruturas de dados"]
  N3["9.3 Privacidade no processamento"]
  N4["Síntese"]
  N0 --> N1 --> N2 --> N3 --> N4
  N4 --> EX["Exemplo resolvido"]
  EX --> Q["Exercício EX025"]

Desenho lógico

flowchart LR
  N0["9.1 Um programa de triagem"]
  N1["Laboratório — Agrupamento de reportes duplicados e t"]
  N2["9.2 Estruturas de dados"]
  N3["9.3 Privacidade no processamento"]
  N4["Síntese"]
  N0 --> N1 --> N2 --> N3 --> N4 --> Q["EX025"]
[9.1 Um programa de triagem]
    |
    v
[Laboratório — Agrupamento de reportes duplicados e t]
    |
    v
[9.2 Estruturas de dados]
    |
    v
[9.3 Privacidade no processamento]
    |
    v
[Síntese]
    |
    v
[Exemplo resolvido] --> [Exercício EX025]

Objetivos de aprendizagem

Você vai (1) estruturar um programa que processa e-mails reportados; (2) desenhar estruturas de dados para a triagem; (3) proteger a privacidade no processamento automatizado.

9.1 Um programa de triagem

A equipe de segurança da Greyford recebe muitos e-mails reportados. Aiko escreve um programa que agrupa os reportes do mesmo e-mail, conta quantos funcionários reportaram cada um e registra o horário do primeiro reporte. Agrupar reduz a carga da equipe, porque vinte reportes de um mesmo e-mail de phishing exigem uma só investigação. Ela estrutura o programa em funções pequenas para leitura, agrupamento e resumo, cada uma testada separadamente, para que mudanças futuras sejam mais seguras. Escreve um teste curto para cada função usando pequenas listas de reportes feitas à mão, de modo que qualquer mudança posterior que quebre o agrupamento ou a contagem de tempo seja notada imediatamente, e não descoberta durante um incidente real.

Laboratório — Agrupamento de reportes duplicados e tempo até o primeiro reporte

# Group duplicate reported emails and find first-report delay (synthetic; minutes after arrival).
reports = [("payroll@greyf0rd.co", "Update your bank details", m) for m in (9, 11, 12, 14, 15, 18, 20, 22, 25, 30, 33, 40, 41, 45)] + \
          [("it-help@vendorx.io", "Mailbox full", m) for m in (25, 31, 38, 47, 52, 60, 66, 70, 75)] + \
          [("news@supplier.example", "Monthly newsletter", m) for m in (120, 180, 200)] + \
          [("dhl-track@parcel.example", "Missed delivery", m) for m in (16, 19, 27, 29, 35, 44, 48)] + \
          [("ceo.greyford@gmail.example", "Quick favour", m) for m in (14, 17, 26, 39, 55)] + \
          [("hr@greyford.example", "Benefits survey", m) for m in (90, 95)]
groups = {}
for sender, subject, m in reports:
    key = (sender, subject.lower()); c, first = groups.get(key, (0, 10**9)); groups[key] = (c + 1, min(first, m))
print(f"{len(reports)} reports -> {len(groups)} distinct emails")
for (s, subj), (c, first) in sorted(groups.items(), key=lambda x: -x[1][0]):
    print(f"{c:3d} reports, first after {first:3d} min: {subj} <{s}>")

Execute com python3 lab_triage.py. Saída verificada:

40 reports -> 6 distinct emails
 14 reports, first after   9 min: update your bank details <payroll@greyf0rd.co>
  9 reports, first after  25 min: mailbox full <it-help@vendorx.io>
  7 reports, first after  16 min: missed delivery <dhl-track@parcel.example>
  5 reports, first after  14 min: quick favour <ceo.greyford@gmail.example>
  3 reports, first after 120 min: monthly newsletter <news@supplier.example>
  2 reports, first after  90 min: benefits survey <hr@greyford.example>

9.2 Estruturas de dados

Aiko usa um dicionário indexado por uma impressão digital do remetente e do assunto de cada e-mail. Cada entrada guarda a contagem e o horário do primeiro reporte. Essa estrutura torna o agrupamento rápido mesmo com milhares de reportes. O laboratório mostra que quarenta reportes se reduzem a seis e-mails distintos e que o e-mail mais reportado teve seu primeiro reporte nove minutos após a chegada. Esse tempo até o primeiro reporte é o número-chave da exposição, que remete ao modelo de cálculo do capítulo 1. Ela observa que um remetente digitado de forma ligeiramente diferente poderia dividir uma campanha em dois grupos, e acrescenta uma opção de fusão manual.

9.3 Privacidade no processamento

E-mails reportados podem conter informações pessoais. O programa de Aiko guarda apenas o remetente, a impressão digital do assunto e os horários dos reportes, e não o corpo das mensagens nem os nomes de quem reportou. A equipe de segurança pode abrir o e-mail original em uma ferramenta controlada quando necessário. Ela documenta o que o programa guarda e por quê. Minimizar os dados guardados em ferramentas automatizadas reduz o risco caso o banco de dados da ferramenta seja exposto, e tranquiliza os funcionários de que reportar não expõe a própria caixa de e-mail. Ela compartilha a lista de campos guardados com os representantes dos funcionários, que a recebem bem e concordam em mencioná-la ao divulgar o botão de reporte.

Exemplo resolvido

Aiko escreve um programa de triagem testado que agrupa reportes duplicados com um dicionário, encontra o tempo até o primeiro reporte e guarda dados mínimos.

Caso sintético. Os reportes são sintéticos.

Erros e limites

Impressões digitais podem separar variantes de uma mesma campanha. O armazenamento mínimo pode limitar investigações posteriores.

Exercícios

Síntese

Um código de triagem bem estruturado reduz a carga de trabalho e mede a exposição, armazenando apenas o que precisa.

Continue estudando — aula 09 (capítulo 09 de 50)

← Capítulo 08 · Índice das aulas · Capítulo 10 →

Continue para a próxima aula já escrita.