¿Es posible crear software que no sea vulnerable a ningún tipo de desbordamiento de búfer? Por ejemplo, un software que recibe paquetes de datos y los transfiere a destino después del análisis de datos.
Depende de lo que se llama desbordamiento de búfer.
Es posible y fácil hacer que el software nunca escriba fuera de un búfer. Todo lo que necesita es un lenguaje de programación que verifique los límites de la matriz, por ejemplo, Python, Java, C #, VB, Pascal, Ruby ... de hecho, casi cualquier idioma, excepto C, C ++, Forth y Assembly. En un lenguaje que comprueba los límites de la matriz, cualquier intento de desbordamiento de un búfer desencadena una condición de error (por ejemplo, se lanza una excepción) que evita la escritura de memoria no deseada.
Es difícil hacer un software que nunca intente escribir fuera de un búfer. La verificación de límites evita que el búfer se desborde realmente, pero el código todavía está intentando hacer algo que no tiene sentido, y eso es un error. No permitir que se realice la escritura es bueno, pero el subproceso / proceso sigue fallando (convierte un exploit de shell remoto en una denegación de servicio, que es mejor , pero no bueno ). Escribir un código libre de errores es teóricamente posible, pero nunca sucede en la práctica (la única aplicación que se considera verdaderamente libre de errores es la Metafont
Hay muchas personas que trabajan en el concepto de demostrar la corrección del código. En un sentido bastante fuerte (consulte el problema de detención ), no es posible hacer un comprobador de corrección genérico, pero se puede Espero que algunos consejos añadidos en el código fuente puedan ayudar a un buscador automático. Esto significa usar algunos idiomas específicos que permiten que ocurran este tipo de cosas (por ejemplo, Esterel o Eiffel ). Que yo sepa, un programador que piensa mucho todavía es necesario en el proceso. Se ha dicho que la NASA paga bastante por tener software sin errores (escuché alrededor de 20000 $ por línea de código) y, sin embargo, esto no está garantizado (cuando el Apolo 11 aterrizó en la Luna, el la computadora a bordo se estrelló, y Armstrong tuvo que hacer el aterrizaje manualmente, en la verdadera moda de Hollywood).
Lea otras preguntas en las etiquetas buffer-overflow