Es una carrera entre las personas que quieren arreglar las vulnerabilidades y las personas que quieren explotarlas. Encontrar vulnerabilidades es difícil: escribir el código correcto es mucho más difícil que escribir el código casi correcto .
Supongamos (números extraídos) que los propios autores encuentran y solucionan el 99% de los defectos de seguridad en los productos lanzados, o los informan de forma privada a los autores. Eso significa que el 1% de los defectos de seguridad se hacen públicos a través de un exploit (un día cero ). Solo escuchas sobre las hazañas publicitadas, no sobre las que están arregladas silenciosamente, por lo que el 1% es todo lo que escuchas. Los autores y los analistas tienen que corregir cada vulnerabilidad para poder hacer un producto completamente seguro; los "piratas informáticos" solo necesitan encontrar una vulnerabilidad no solucionada.
Pero en realidad es peor que eso: incluso en el caso del 99%, cuando los autores lanzan una nueva versión, no todos se actualizan de inmediato. Hay otra raza: la carrera entre la explotación y el parche. Una vez que la actualización está disponible, los crackers pueden estudiar las diferencias con la versión anterior y crear exploits para versiones anteriores que las personas aún están ejecutando. Esto deja muchas máquinas expuestas.
Existen varias técnicas para buscar vulnerabilidades, utilizadas por ambos lados por igual. Fuzzing es uno de ellos: intente enviar datos aleatorios a un programa y ver si reacciona de manera interesante. Por ejemplo, si el programa falla (lo que en sí mismo es a menudo una denegación de servicio), estudie la forma en que se bloquea con cuidado; a menudo, la creación de los datos de entrada le permite escalar para ejecutar código arbitrario. Otro enfoque es análisis estático : ejecuta análisis automáticos en el código fuente o en el código compilado, para buscar patrones sospechosos (por ejemplo, buscar sin marcar acceso a la matriz) o verifique la ausencia de ciertos tipos de mal comportamiento (por ejemplo, probar que todos los accesos de la matriz no están verificados). El análisis estático puede complementarse con revisiones manuales, para buscar aspectos que las herramientas automatizadas no son suficientes para detectar (por ejemplo, revisar que todos los archivos temporales se crean de forma segura). La experiencia ayuda, por supuesto, a veces alguien pensará "hey, este es un problema difícil, me pregunto si los desarrolladores entendieron bien el caso".
Recomiendo leer la presentación de proceso de auditoría de OpenBSD y seguir estudiando el proyecto OpenBSD. Este es un proyecto de código abierto, con discusiones abiertas, y hacen de la seguridad una prioridad. No conozco una presentación más completa de su proceso de auditoría de seguridad; Puede encontrar más información al respecto en sus listas de correo .
Más generalmente, consulte los anuncios de seguridad para software de código abierto (por ejemplo, una distribución de Linux). Cuando se anuncie un parche de seguridad, mire la descripción de la vulnerabilidad, la fuente original y el parche. Trate de tener una idea de qué patrones pueden ser problemáticos, cómo se encontraron (el anuncio de vulnerabilidad a menudo tiene un enlace a una descripción más detallada) y cómo se solucionaron.