Criando uma receita de regex do Procmail para texto do corpo do e-mail malicioso

0

No trabalho, começamos a receber e-mails com o que parece ser um código malicioso contido no corpo do e-mail. Estou tentando criar uma receita do procmail que use o regex para corresponder apenas aos caracteres não pertencentes à palavra listados em uma string longa como esta:

/]\/[%}(-:{{[%+\!(?|}[[+{>-|*;\]}>?]}?(>:-\-/[\[%-=\//>[??+]}}(:)/|{/#Afe0:/]\/[%}(-:{{[%+\!(?|}[[+{>-|*;\]}>?]}?(>:-\-/[\[%-=\//>[??+]}}(:)/|{/#Jenny:/]\/[%}(-:{{[%+\!(?|}[[+{>-|*;\]}>?]}?(>:-\-/[\[%-=\//>[??+]}}(:)/|{/#preston:/]\/[%}(-:{{[%+\!(?|}[[+{>-|*;\]}>?]}?(>:-\-/[\[%-=\//>[??+]}}(:)/|{/#Afectarac:/]\/[%}(-:{{[%+\!(?|}[[+{>-|*;\]}>?]}?(>:-\-/[\[%-=\//>[??+]}}(:)/|{/#FORTHCO:/]\/[%}(-:{{[%+\!(?|}[[+{>-|*;\]}>?]}?(>:-\-/[\[%-=\//>[??+]}}(:)/|{/#backgrounds:/]\/[%}(-:{{[%+\!(?|}[[+{>-|*;\]}>?]}?(>:-\-/[\[%-=\//>[??+]}}(:)/|{/#legumes

Note que não há espaços. Este é um pequeno exemplo, alguns e-mails têm linhas com mais de 20.000 caracteres. Isso está atrapalhando nossa filtragem de spam e espero que haja uma maneira de combinar longas linhas de caracteres que não sejam de palavras sem separadores de espaços em branco. Até agora eu tentei usar várias variantes / peças / combinações do que está abaixo com apenas um sucesso parcial - estou tendo problemas para encontrar uma maneira de fazer isso funcionar sem ter muitos falsos positivos:

:0 
* B ?? ^.*(!@#$%^&*()[]{})+ && ! </([a-z|A-Z])/>
$DEFAULT/MalSpam/

Eu estava pensando que, se eu puder fazer um regex compatível, posso combinar isso com outra regra que envie o email para um diretório separado, se o total de caracteres por linha exceder um determinado valor, digamos 500. Não tenho que parte descobriu ainda ... outro regex que eu usei no passado tinha o \ W sinalizador que correspondia apenas caracteres não-palavra, o procmail tem um equivalente? Como posso fazer isso?

    
por lennys 23.10.2017 / 15:54

2 respostas

0

Com relação à sua última pergunta sobre \W , você não precisa disso. Você pode apenas fazer o inverso de \w . Por exemplo, se você considerar que isso é um caractere de palavra [a-zA-Z0-9_] (essa é a definição do Vim de \w , por exemplo), use [^a-zA-Z0-9_] .

    
por 23.10.2017 / 16:40
0

A correção superficial de sua tentativa seria

:0 
*   B ?? [][!@#$%^&*(){}]+
* ! B ?? </[a-zA-Z]+/>
$DEFAULT/MalSpam/

se eu estiver achando que você está tentando corresponder uma sequência de dois ou mais caracteres de pontuação e uma seqüência de caracteres que são alfabéticos entre </ e /> como uma condição negada (ou seja, uma correspondência se presente impede a receita de combinar).

No entanto, quaisquer dois caracteres de pontuação (como apenas !! ) corresponderão ao primeiro regex; e não vejo por que você articula a segunda condição como você fez.

Um desafio é que muitos caracteres de pontuação são metacaracteres de expressão regular. Para corresponder a um literal [ ou ( ou * , você precisa fazer escape de barra invertida ou colocá-los em uma classe de caracteres. (Uma classe de caractere contendo [ é [[] , o que leva um tempo para quebrar a cabeça. Isso é um literal [ dentro dos colchetes de classe de caractere [ ... ] . E uma classe de caractere contendo ] e [ precisam tê-los nessa ordem, então [][] .) Eu fiz o primeiro regex simples colocando tudo em uma classe de caractere, mas como é, provavelmente é muito amplo . Eu talvez exigisse que houvesse uma sequência de, digamos, quatro ou cinco em sequência. (Infelizmente, a variante regex do Procmail não suporta o quantificador numérico egrep 'co_de%; seria útil aqui.)

:0B
* [][!@#$%^&*(){}][][!@#$%^&*(){}][][!@#$%^&*(){}][][!@#$%^&*(){}][][!@#$%^&*(){}]
* ! </[a-zA-Z]+/>
$DEFAULT/MalSpam/

Se você observar com atenção, verá que o primeiro é [class]{5,} repetido cinco vezes. Se você quiser torná-lo mais longo (como 500 ocorrências adjacentes), basta repetir quantas vezes for necessário. Se a expressão inteira for maior que [][!@#$%^&*(){}] , você precisará observar também - se quiser criar espaço para uma regex de sete caracteres 500 vezes, ou seja, 10.200 bytes, é necessário certificar-se de que LINEBUF é pelo menos tão grande antes da receita que contém essa expressão longa.

Observe também como um sinalizador LINEBUF na receita elimina a necessidade de colocar B em cada linha de receita individual.

Se você quiser comparar a duração da mensagem, basta usar B ?? e o número desejado. Com o sinal > , :0B corresponderá a um corpo com mais de 512 bytes.

Para sua pergunta final, * > 512 é basicamente equivalente à classe de caractere \W (um único caractere que não está no intervalo [^A-Za-z0-9_] ou o intervalo A-Z ou o intervalo a-z ou o caractere 0-9 ).

    
por 23.10.2017 / 16:46