¿Cómo puedo rechazar el correo electrónico spam codificado en base64?

11

Acabo de recibir un par de correos con contenido similar que fueron codificados con base64. Ahora quiero rechazar o descartar este tipo de correos electrónicos utilizando la verificación del cuerpo.

Antes de tener en mi body_checks algo como esto:

/Quanzhoucooway/ DISCARD

Pero como el mensaje está codificado, esa palabra clave no se detectará.

Aquí hay un mensaje codificado en base64:

DQpIaSBGcmllbmRzLA0KDQpHb29kIGRheSENCg0KVGhpcyBpcyBWaWN0b3JpYSBmcm9tIFF1YW56
aG91Y29vd2F5IHNob2VzIHRyYWRpbmcgY28uLGx0ZCwgYSBwcm9mZXNzaW9uYWxtYW51ZmFjdHVy
ZXIgYW5kIGV4cG9ydGVyIG9mIGFsbCBraW5kcyBvZiBzaG9lcywgbWFpbmx5IGluIGNhc3VhbCBz
aG9lcyBhbmQgc3BvcnRzIHNob2VzICwgd2hpY2ggaGFzIGJlZW4gc3VwcGxpZWQgdG8gdGhlIGZh
bW91cyBmYXNoaW9uIGJyYW5kIHN0b3JlcyBmcm9tIDIwMTAuDQoNCk5vdGljaW5ndGhhdCB5b3Ug
YXJlIGxvb2tpbmcgZm9yIGhpZ2ggcXVhbGl0eSBmYXNoaW9uIHNob2VzLCBzbyBJIGhvcGUgd2Ug
Y2FuIHdvcmsgdG9nZXRoZXIgaW4gdGhlIGZ1dHVyZS4gSWYgeW91IGFyZSBpbnRlcmVzdGVkLCBJ
IHdpbGwgc2VuZCB5b3Ugb3VyIGl0ZW1zIGFjY29yZGluZ2x5Lg0KDQpGWUksIHdlIGNhbiBtYWtl
IGN1c3RvbWl6ZWQgc2FtcGxlcyBmb3IgeW91IGFjY29yZGluZ2x5Lg0KDQpMb29raW5nIGZvciB5
b3VyIHNvb25lc3QgcmVzcG9uc2UuDQoNCkJSIQ0KDQpWaWN0b3JpYSANCg==

Entonces, ¿cuál es la mejor práctica para bloquear este tipo de correos electrónicos?

usuario134969
fuente
3
¿Filtro de spam adecuado que actúa sobre los contenidos decodificados reales del mensaje?
ceejayoz
¿Podría ser más específico, qué tipo de mecanismo debería usarse? Ya estoy usando spamassassin y está haciendo un gran trabajo cuando se trata de luchar contra el spam.
user134969
Los rechazaría por MTA con un mensaje de error de "No codifique los cuerpos de mensajes en base64".
joshudson

Respuestas:

19

No haga esto con Postfix, body_checksino que escriba una regla de Spamassassin para ello. Spamassain decodifica el cuerpo del mensaje antes de aplicar sus reglas. Algo como:

body     LOCAL_QUANZHOUCOOWAY  /Quanzhoucooway/
score    LOCAL_QUANZHOUCOOWAY  7.0
describe LOCAL_QUANZHOUCOOWAY  Block word Quanzhoucooway

Estas reglas pertenecen a /etc/mail/spamassassin/local.cf(o ~/.spamassassin/user_prefs).

Esa Jokinen
fuente
1
¿Funcionará incluso si esa palabra clave está codificada con base64, como ese contenido allí arriba?
user134969
2
Si. Alguien ya editó mi respuesta para aclarar esto. Gracias a esa persona anónima! :)
Esa Jokinen
9

Técnicamente, puede filtrar directamente los datos codificados en base64 para palabras clave. No digo que sea algo práctico o razonable, dada la existencia de alternativas mejores y más simples (como se describe, por ejemplo, en la respuesta de Esa), pero es posible.

El truco consiste en darse cuenta de que la codificación base64 es una asignación determinista de bloques de 3 bytes de datos sin codificar sin procesar en bloques de 4 caracteres de caracteres base64. Por lo tanto, cada vez que aparece una cierta secuencia de bloques de 3 bytes en los datos no codificados, la misma secuencia de bloques de 4 caracteres aparecerá en la versión codificada.

Por ejemplo, si ingresa la cadena Quanzhoucoowayen un codificador base64 , obtendrá la salida UXVhbnpob3Vjb293YXk=. Como la longitud de la entrada no es un múltiplo de 3 bytes, la salida contiene algo de relleno al final, pero si omitimos los =signos finales y el último carácter base64 real k(ya que también codifica algunos bits de relleno), obtenemos la cadena UXVhbnpob3Vjb293YXque está garantizado para aparecer en los datos codificados en base64 siempre que los tripletes de bytes Qua, nzh, ouc, oowy el triplete parcial ayaparecen en la entrada en ese orden.

Pero, por supuesto, la cadena Quanzhoucoowaypodría no comenzar exactamente en el límite del triplete. Por ejemplo, si codificamos la cadena en su XQuanzhoucoowaylugar, obtenemos la salida WFF1YW56aG91Y29vd2F5, que se ve completamente diferente. Esta vez, la longitud de entrada es divisible por tres, por lo que no hay caracteres de relleno para descartar al final, pero necesitamos descartar los dos primeros caracteres ( WF) que codifican cada uno de los bits del Xbyte antepuesto , dejándonos con F1YW56aG91Y29vd2F5.

Finalmente, la codificación base64 XXQuanzhoucoowayproporciona la salida WFhRdWFuemhvdWNvb3dheQ==, que tiene relleno en ambos extremos. Eliminando los primeros tres caracteres WFh(que codifican el XXprefijo) y los últimos tres caracteres Q==(que codifican el relleno de bit cero al final), nos queda la cadena RdWFuemhvdWNvb3dhe. Por lo tanto, obtenemos las siguientes tres cadenas codificadas en base64:

UXVhbnpob3Vjb293YX
F1YW56aG91Y29vd2F5
RdWFuemhvdWNvb3dhe

de los cuales (al menos) uno debe aparecer en la forma codificada en base64 de cualquier cadena de entrada que contenga la palabra Quanzhoucooway.

Por supuesto, si no tiene suerte, el codificador base64 puede insertar un salto de línea en el medio de ellos, entre dos tripletes codificados. (Su mensaje de ejemplo, por ejemplo, tiene uno entre F1YW56y aG91Y29vd2F5.) Por lo tanto, para hacer coincidir de manera confiable estas cadenas con expresiones regulares, necesitaría algo como lo siguiente (usando la sintaxis PCRE):

/UXVh\s*bnpo\s*b3Vj\s*b293\s*YX/ DISCARD
/F1\s*YW56\s*aG91\s*Y29v\s*d2F5/ DISCARD
/R\s*dWFu\s*emhv\s*dWNv\s*b3dh\s*e/ DISCARD

Generar estos patrones a mano es algo tedioso, pero no sería difícil escribir un script simple para hacerlo en su lenguaje de programación favorito, al menos siempre que proporcione un codificador base64.

Si realmente quisiera, incluso podría implementar una coincidencia que no distinga entre mayúsculas y minúsculas al codificar en base64 tanto la versión en minúsculas como en mayúsculas de la palabra clave y combinarlas en una expresión regular que coincida con cualquier combinación de ellas. Por ejemplo, la codificación base64 de quanzhoucoowayes cXVhbnpob3Vjb293YXk=mientras que la de QUANZHOUCOOWAYes UVVBTlpIT1VDT09XQVk=, por lo que la regla:

/[cU][XV]V[hB]\s*[bT][nl]p[oI]\s*[bT][31]V[jD]\s*[bT][20]9[3X]\s*[YQ][XV]/ DISCARD

coincidirá con la palabra codificada en base64 "Quanzhoucooway" en cualquier caso, siempre que comience en un límite de triplete. La generación de las otras dos expresiones regulares correspondientes para las versiones modificadas se deja como ejercicio. ;)

Por desgracia, hacer algo más complicado que una simple coincidencia de subcadenas como esta rápidamente se vuelve poco práctico. Pero al menos es un buen truco. En principio, incluso podría ser útil, si por alguna razón no pudieras usar SpamAssassin o cualquier otro filtro que pueda decodificar la codificación base64 antes de filtrar. Pero si puedes hacer eso, en lugar de usar hacks como este, ciertamente deberías hacerlo.

Ilmari Karonen
fuente
1
Si es posible ; no tan práctico, y no es algo que te gustaría hacer de nuevo por cada palabra. +1 para la explicación: si bien esto puede no ser muy útil, ¡ciertamente es educativo!
Esa Jokinen