Segurança de Aplicação

Melhorando a detecção de SPAM

Com advento acelerado da evolução tecnológica, a cada dia vemos maior número de incidência de ataques por engenharia social usando recursos como e-mails, SMS, whatsapp, twitter, facebook etc…

Muitas empresas gastam milhões para tentar mitigar esses ataques, ainda assim boa parte passa pelos filtros de proteção. No mundo underground, alguns servidores obscuros do IRC e Tox, onde trabalham os crackers, tem muitos mercados negros aquecidos por forte demanda por SPAM, Black Search Engine Optimization (SEO), Infect para banking, venda de shells, pedidos de Denial of Service entre outros serviços em prol do crime.

detecção de SPAM

Esse mercado investe constantemente em melhorias para ataques. Todos os dias surgem mitigações que deixam recursos maliciosos inválidos, então surge outra melhoria nos ataques, e nessa constante guerra, quem sofre é o civil, ou seja, o usuário.

SPAM não é um problema identificado apenas em e-mail?

No contexto principal desses ataques, o elo mais fraco é o humano, aquele lembrete de banco pedindo informações inocentes, aquela suposta promoção de viagem, download grátis daquele software que tem alto valor no mercado, ou mesmo na mais inocente propaganda que não tem nenhum vírus (atacante ganha por click “pay per click”). Em outras palavras, SPAM pode ter relação com situações inconvenientes, alguns humoristas até brincam com o contexto de SPAM, por exemplo no TED talks do James Veith.

Não recebemos SPAM apenas em e-mail, recebemos em comentários de blog, CMS, e-commerce, skype, telegram, SMS… todo sistema com uma entrada esta sujeito a spams se não tiver uma validação por trás.

Em meus programas, como posso detectar SPAM de forma inteligente?

Caso seja desenvolvedor e queira classificar entradas no seu sistema, uma sugestão seria fazer uso de algum classificador, como Naive Bayes, KNN ou SVM. Esses classificadores trabalham com matrizes de números, então como vamos trabalhar com texto, temos que seguir alguns passos:

  • Separar os documentos por classificação, remover qualquer tipo de caracteres especiais, remover tags html entre outras coisas que não seja texto bruto, também remover virgulas, por fim, tokenizar, ou seja, separar por palavras e abstrair isso para uma lista.
  • Criar uma matriz para cada documento, usar algum algoritmo para ranqueamento das palavras, no caso, podemos usar o modelo BOW (Bag of words), também podemos usar tf–idf (term frequency–inverse document frequency). Com tudo, temos as informações distribuídas em uma matriz, caso queira aproveitar recursos já existentes, pode usar a ferramenta do google word2vec.
  • Escolher o classificador, fazer aprendizado supervisionado, ou seja, treinar com as matrizes de SPAM e matrizes de não SPAM.
  • Obter uma entrada e converter para matriz, só então podemos usar o algoritmo classificador para apontar se é SPAM ou não SPAM.

 Adiantando os testes para você leitor, veja alguns resultados:

Classifier Accuracy Performance
KNN 96% low
SVM 92% medium
Naive Bayes 94% fast

KNN é um algoritmo que faz analogias para classificar, embora tenha uma acurácia boa, é muito lento (no caso testei com distância euclidiana), Naive Bayes tem uma taxa elevada tanto de performance, quanto de acurácia, isso justifica sua escolha por muitos softwares Open Source para classificação de SPAM. Lembrando que acurácia desta tabela foi feita com a média de acertos dos documentos de SPAM e uma média de acertos com documentos que não são SPAM. Existem muitos outros algoritmos, que dependendo do contexto, podem ser tão eficientes quanto Naive Bayes.

Usando Naive Bayes

Como exemplo, usei o método Naive Bayes, um classificador probabilístico simples, baseado no teorema de Bayes. Esse método é denominado ingênuo (naive) porque ele assume que os atributos contribuem de forma independente para formar probabilidades estimativas da ocorrência de uma determinada classe do problema durante o processo de classificação. Logo, segundo a existência de redundância nos atributos, pode distorcer o processo de aprendizagem.

Escrevi uma biblioteca em C++ para ajudar a classificar textos usando Naive Bayes. Caso queira detalhes de uso e exemplo veja clicando aqui.

Como melhorar acuracidade?

Algo que recomendo antes de usar classificador usando algum algoritmo de machine learning, seria usar seu próprio filtro, utilizando máquina de estados finita determinística (AFD) e ranqueamento para ajudar classificar o que é SPAM antes mesmo de usar, logo, se classificar como SPAM antes de passar para o classificador, ganharia performance e iria melhorar acurácia durante a detecção de SPAM.

Confira o seguinte código:

detecção de SPAM

Note que é feita uma aritmética simples bem como soma de pontos por relevância, por fim, temos um ranqueamento simples.

detecção de SPAM

Esse código faz parte de um projeto meu para auditoria de e-mails usando IMAP, caso tenha interesse ou queira participar do projeto clique aqui.

 

Referências:

About author

Articles

Uma equipe de profissionais, altamente conectados com as notícias, técnicas e informações sobre a segurança de aplicações.
Related posts
Code FightersSegurança de Aplicação

Como integrar o Semgrep no CI/CD e enviar os resultados para a Conviso Platform

Atualmente, é uma prática muito comum integrar verificações de segurança durante a fase de…
Read more
Segurança de Aplicação

Impactos Negativos Gerados pela Ausência de Logs e Monitoramento de Segurança

Primeiramente, os logs são registros de atividades gerados também por sistemas, aplicações e…
Read more
Segurança de Aplicação

Dockers e Containers

Containers são soluções cada vez mais populares na indústria de desenvolvimento de software.
Read more

Deixe um comentário