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?
Respuestas:
No haga esto con Postfix,
body_check
sino que escriba una regla de Spamassassin para ello. Spamassain decodifica el cuerpo del mensaje antes de aplicar sus reglas. Algo como:Estas reglas pertenecen a
/etc/mail/spamassassin/local.cf
(o~/.spamassassin/user_prefs
).fuente
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
Quanzhoucooway
en un codificador base64 , obtendrá la salidaUXVhbnpob3Vjb293YXk=
. 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 realk
(ya que también codifica algunos bits de relleno), obtenemos la cadenaUXVhbnpob3Vjb293YX
que está garantizado para aparecer en los datos codificados en base64 siempre que los tripletes de bytesQua
,nzh
,ouc
,oow
y el triplete parcialay
aparecen en la entrada en ese orden.Pero, por supuesto, la cadena
Quanzhoucooway
podría no comenzar exactamente en el límite del triplete. Por ejemplo, si codificamos la cadena en suXQuanzhoucooway
lugar, obtenemos la salidaWFF1YW56aG91Y29vd2F5
, 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 delX
byte antepuesto , dejándonos conF1YW56aG91Y29vd2F5
.Finalmente, la codificación base64
XXQuanzhoucooway
proporciona la salidaWFhRdWFuemhvdWNvb3dheQ==
, que tiene relleno en ambos extremos. Eliminando los primeros tres caracteresWFh
(que codifican elXX
prefijo) y los últimos tres caracteresQ==
(que codifican el relleno de bit cero al final), nos queda la cadenaRdWFuemhvdWNvb3dhe
. Por lo tanto, obtenemos las siguientes tres cadenas codificadas en base64: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
F1YW56
yaG91Y29vd2F5
.) Por lo tanto, para hacer coincidir de manera confiable estas cadenas con expresiones regulares, necesitaría algo como lo siguiente (usando la sintaxis PCRE):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
quanzhoucooway
escXVhbnpob3Vjb293YXk=
mientras que la deQUANZHOUCOOWAY
esUVVBTlpIT1VDT09XQVk=
, por lo que la regla: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.
fuente