Detectar vulnerabilidades en el código C es hard science y sigue siendo un problema abierto. La herramienta más conocida para eso sigue siendo el cerebro humano. Esto se llama revisión de código . Este tipo de cosas funcionan si te encargas de poner la carga de la prueba en el desarrollador.
De hecho, la situación común es que el desarrollador produjo el código, luego el revisor intenta darle sentido. Pero el desarrollador no solucionará nada hasta que el revisor demuestre una vulnerabilidad. Eso es lo que ocurre en muchos proyectos de software en los que los "revisores" son "Internet en general", y el proveedor de software propone un parche solo cuando se ha encontrado y publicado un exploit real. Esto es bastante insatisfactorio.
En su lugar, haga que el desarrollador escriba código claro con muchos comentarios, de modo que un revisor con acceso al código fuente pueda entender lo que hace el código, y vea por qué los búferes no están desbordados. Bajo estas condiciones, la revisión del código puede ser eficiente, principalmente porque obliga al desarrollador a tener una visión clara de su propia tarea.
Las
herramientas dinámicas como Valgrind son excelentes como herramientas de depuración, pero no tanto para detectar posibles vulnerabilidades. Le dirán si se produjo un desbordamiento de búfer durante las pruebas , no si se pudo haber producido un desbordamiento con diferentes datos de entrada .
C es un lenguaje difícil porque tienes que pensar en todo. Una fuente común de desbordamientos de búfer en C es el manejo de cadenas de caracteres, ya que C no tiene cadenas de caracteres que valgan ese nombre, solo una matriz de caracteres con la convención de un cero final. Otros lenguajes de programación ofrecerán cadenas reales que pueden ser concatenadas, divididas y compartidas como si fueran meros enteros; tales cadenas evitan muchos desbordamientos de búfer simplemente siendo mucho más fáciles de usar. Por supuesto, las cadenas fáciles de usar requieren algún tipo de gestión automática de la memoria, ya sea un recolector de basura o recuento de referencias (hasta cierto punto, C ++ puede hacer recuento de referencias para cadenas, pero aún debe volver a convertirlas en matrices de caracteres al interactuar con el sistema operativo).
Nada de lo anterior se aplica directamente a su problema de detección de vulnerabilidades en aplicaciones existentes. Solo muestra que su tarea es difícil . Se puede demostrar que es imposible en generalidades (es posible que nunca detecte automáticamente las vulnerabilidades todas ).