En
la conferencia de la Asociación para el Diseño de Lenguajes de
Programación de Equipamiento Informático, investigadores del MIT
presentaron un nuevo sistema que repara bugs peligrosos en el software importando la funcionalidad desde otras aplicaciones más seguras.
Cabe destacar que el sistema, bautizado como CodePhage, no requiere acceso al código fuente de las aplicaciones cuya funcionalidad coge prestada.
En vez de eso, analiza la ejecución de las aplicaciones y clasifica los
tipos de controles de seguridad que realizan. Como consecuencia, puede importar chequeos de aplicaciones escritos en lenguajes de programación distintos al del programa que está reparando y proporciona una capa adicional de análisis que garantiza que el error ha sido reparado.
"Tenemos
un montón de código fuente disponible en los repositorios de código
abierto, millones de proyectos, y muchos de estos proyectos implementan
especificaciones similares", dice Stelios Sidiroglou-Douskos,
científico investigador del laboratorio de Ciencias de la Computación e
Inteligencia Artificial (CSAIL) del MIT que ha liderado el desarrollo de
CodePhage. "Aunque podría no ser la funcionalidad principal del
programa, con frecuencia existen subcomponentes que comparten
funcionalidad a través de un gran número de proyectos".
Con CodePhage, el dice, "con
el tiempo, lo que estaríamos haciendo es construir un sistema híbrido
que toma los mejores elementos de todas estas implementaciones".
Funcionamiento general
Sidiroglou-Douskos
y sus co-autores se refieren al programa que CodePhage repara como
"receptor" y al programa del que se toma la funcionalidad como
"donante".
Para comenzar su análisis, CodePhage requiere dos
entradas de ejemplo: una que haga que el receptor se bloquee (crash) y
otra que no. Se puede usar un buscador de bugs que el mismo grupo
publicó en marzo, llamado DIODE, que genera automáticamente las entradas
que hacen que el programa falle (crash) o simplemente un bug que un
usuario podría haber identificado al intentar abrir un archivo en
particular, por ejemplo.
Primero CodePhage introduce en el
programa donante una entrada segura (safe) y otra que provoca un fallo
(bug). Hace un seguimiento de cada una de las secuencias de operaciones
que ejecuta el donante y graba cada una utilizando una expresión
simbólica. Cuando la nueva expresión simbólica (bug) diverge de la
antigua (safe), sin embargo, CodePhage interrumpe el proceso. La
divergencia representa una limitación que la entrada segura encontró
pero que la entrada que provoca un error no lo hace. Como tal, podría
ser un control de seguridad que falta en el receptor.
CodePhage
entonces analiza el receptor para encontrar lugares en los que la
entrada se encuentra con la mayoría, aunque no todas, de las
limitaciones descritas por la nueva expresión simbólica. El receptor
puede realizar diferentes operaciones en un orden diferente que el
donante hace, y puede almacenar datos en diferentes formas. Pero la
expresión simbólica describe el estado de los datos después de haber
sido procesado, no el procesamiento.
En cada uno de los lugares
que identifica, CodePhage puede prescindir de la mayoría de las
limitaciones descritas por las expresiones simbólicas de las
limitaciones que el receptor, también, impone. Comenzando con la primera
ubicación, traduce las pocas restricciones que quedan a la lengua del
destinatario y los inserta en el código fuente. Luego se ejecuta el
destinatario de nuevo, utilizando la entrada que provoca el crash.
Si
el programa sigue funcionando, el nuevo código ha resuelto el problema.
Si no lo hace, CodePhage mueve a la siguiente ubicación candidata en el
receptor. Si el programa todavía está fallando, incluso después de
CodePhage haya intentado reparaciones en todos los lugares candidatos,
vuelve al programa del donante y continúa la construcción de su
expresión simbólica, hasta que llega a otro punto de divergencia.
Futuro automatizado
Los
investigadores probaron CodePhage en siete programas de código abierto
en las que DIODE había encontrado errores, importando entre dos y cuatro
reparaciones en cada uno. En todos los casos, CodePhage fue capaz de
arreglar el código vulnerable, y por lo general tomó entre 2 y 10
minutos en arreglarlos.
Como explican los investigadores, en
el software comercial moderno, los controles de seguridad pueden ocupar
hasta 80 por ciento del código, o incluso más. Una de sus esperanzas es
que las futuras versiones de CodePhage puedan reducir drásticamente el tiempo que los desarrolladores de software gastan en trabajo pesado, mediante la automatización de la inserción de esas comprobaciones.
"La visión a largo plazo es que nunca tengas que escribir una pieza de código que alguien más haya escrito antes", dice Rinard. "El
sistema encuentra ese trozo de código y automáticamente lo pone junto
con cualquier pieza de código que necesita para hacer que su programa
funcione".
"La técnica de usar código de otro programa que
tiene una funcionalidad similar, y ser capaz de corregir un programa
que falla solucionándolo de esa manera, es un resultado bastante bueno", dice Emery Berger, profesor de ciencias informáticas en la Universidad de Massachusetts en Amherst. "Para ser honesto, me sorprendió que funcionó totalmente".
"El programa de los donantes no fue escrito por la misma gente", explica Berger. "Ellos
tienen diferentes estándares de programación, renombran las variables
de forma diferente, utilizan todo tipo de diferentes variables, las
variables pueden ser locales o podrían estar más arriba en la pila. Y
CodePhage es capaz de identificar estas conexiones y decir: 'Estas
variables correlan a estas variables '. Hablando en términos de la
donación de órganos, transforma ese código para que sea un injerto
perfecto, como si hubiera sido escrito de esa manera en el principio. El
hecho de que funcione tan bien como lo hace es sorprendente y fresco".