Durante las últimas semanas, los desarrolladores de avast! han estado trabajando en mejoras para el motor de avast! 5 y, mientras lo hacían, encontraron ciertos elementos que podían estar ralentizando más de lo necesario su rendimiento (es decir, la duración de los análisis bajo demanda).

Una de las grandes novedades de avast! 5 es el elemento denominado caché persistente (persistent caché), un mecanismo que permite a nuestro antivirus obviar el reescaneo de ciertos archivos. En particular, se aplica a ficheros que están en nuestra lista interna de apliaciones benignas (lista blanca), como también a los archivos que están firmados digitalmente por editores de confianza (hay una lista relativamente corta de desarrolladores de software en los que confiamos, y por tanto consideramos los archivos creados y firmados digitalmente por ellos como seguros).

Anteriormente, usábamos los sistemas de encriptación que nos proporcionaba el sistema operativo (denominado “wintrust”) para realizar las verificaciones de las firmas digitales. Sabíamos que no era un método ideal (especialmente porque éramos conscientes de que en caso de que el sistema estuviera comprometido alguna API del sistema podía ser redirigida por malware y esto no es, por tanto, 100% seguro). Por esta razón, hemos estado trabajando en nuestra propia implementación de un verificador de firmas. Lo que parecía una tarea sencilla al principio se convirtió en un largo y complicado proyecto de decenas de miles de líneas de código, y también muchos meses de duro trabajo.

Esta larga odisea finalizó más o menos hace un mes y, después de realizar varios test de funcionamiento, se implementó esta nueva característica como parte la actualización de la base de datos de virus del día 19 de Abril. Lo que es interesante es que este cambio no sólo ha conllevado un aumento de la seguridad (que es la razón principal por la que lo hemos hecho), sino que además ha proporcionado un incremento considerable del rendimiento. En nuestro equipo de pruebas (una estación de trabajo Dell con una CPU Intel Core i7, 4 GB de RAM y Windows 7) la duración de un análisis completo del sistema bajó de 39:35 minutos a 16:03, lo cual implica un aumento de 2.5x en la velocidad.

Todavía no hemos hecho una investigación completa de por qué ocurre esto, pero nuestra hipótesis actual es que el aumento de rendimiento está relacionado con la comprobación de los catálogos de firmas. Es posible que la API de Wintrust reabra/relea los catálogos cada vez que un fichero se analiza, mientras que nuestro desarrollo hace esta lectura una vez y mantiene esta lectura cacheada en la memoria mientras dura el escaneo. Pero todavía conseguimos hacer otras mejoras para aumentar aún más el rendimiento de avast!

Al ver todo esto, nuestros técnicos empezaron a interesarse por si todavía se podía mejorar. Así que empezaron a revisar el código de verificación otra vez, y encontraron que el código gasta mucho tiempo en una función que es responsable del cálculo del hash SHA-1. Esto no supone una sorpresa, en el sentido de que muchos certificados están basados en el algoritmo SHA-1, y el hashing actual es la parte más cargante del proceso de verificación.

Así pues, el siguiente paso lógico era optimizar la parte de nuestro desarrollo encargada del algoritmo SHA-1. Uno de los ingenieros de Intel publicó recientemente un buen artículo describiendo las posibilidades de aumentar la velocidad de SHA-1 usando las instrucciones SSE2 que incorporan los procesadores Intel desde los Pentium 4. Usando estas ideas, fuimos capaces de de optimizar el código de manera que ahora corre un 30% más rápido (especialmente en procesadores Core 2 y i7).

Mientras hacíamos las pruebas pertinentes, también observamos algo extraño: el análisis completo del sistema tardaba lo mismo la primera vez que se realizaba y las siguientes ocasiones. Esto no debería ocurrir dado que nuestro sistema de caché persistente debería dar como resultado que a partir del segundo escaneo completo la duración de los mismos disminuyera de manera notable dado que se supone que no se deberían volver a verificar las firmas digitales de ciertos ficheros en esos análisis posteriores. Así que revisamos el código y descubrimos con sorpresa que la tarea de verificación se realizaba cada vez, y no sólo en la primera pasada. Todo esto fue solucionado en la actualización de la base de datos de virus del día 24 de Abril, consiguiendo que el tiempo de escaneo en nuestra máquina de pruebas descrita más arriba bajara hasta 6 minutos y 54 segundos, lo cual implica un aumento de seis veces en la velocidad (por supuesto, sin afectar al ratio de detección).

Para nosotros, esto ha implicado un gran ejercicio que nos ha vuelto a mostrar la belleza de la ingeniería de software. Algunas veces, si trabajas duro, puedes marcar la diferencia.

 

El presente artículo es una traducción y adaptación de un post escrito por Ondrej Vlcek en el blog oficial de avast! en inglés.