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…
. 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.
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 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 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
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:
Note que é feita uma aritmética simples bem como soma de pontos por relevância, por fim, temos um ranqueamento simples.
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:
- Natural Language Processing by Dan Jurafsky, Christopher Manning
- John, G. H. e Langley, P. (1995). Estimating continuous distributions in bayesian classifiers. Montreal, Quebec;, Canada.
- Svore, K. M., Wu, Q., e Burges, C. J. (2007). Improving web spam classification using rank-time features. Banff, Alberta, Canada.