A) ¿Existe una ventaja / desventaja de realizar revisiones de
binarios sobre código fuente?
Los compiladores a menudo NO escriben código expresamente según lo previsto en la fuente. Por ejemplo, Return Oriented Programming explota el hecho de que los compiladores insertarán muchos más RET
opcodes de los que el programador está consciente. Debido a la canalización y otros trucos de optimización, los compiladores esencialmente reescriben su código y posiblemente pueden agregar vulnerabilidades propias. ¡Esto significa que algunas construcciones en el código fuente pueden no expresarse en absoluto en el binario!
Esta es una clase de error que es esencialmente imposible para detectar mediante el análisis manual del código ... y sospecho que el riesgo todavía estaría allí para el código Java / C # JIT también, pero esto estar confuso de una herramienta de análisis estático.
El análisis manual del código fuente puede ayudar con el hecho de que la mayoría de las vulnerabilidades comunes pueden ser detectadas por inspección visual. Y tiene otros beneficios también, sobre todo en la reducción de la cantidad de bugs prod en general. (Y por lo tanto, el costo). Y también ayuda al aspecto social: las revisiones de fuentes alientan a las personas a escribir como si alguien más estuviera mirando. Una de las principales desventajas es que si está tratando con un lenguaje de tipo dinámico, como PERL, Groovy, LISP y sus derivados ... la mayoría de los datos no se verán hasta el tiempo de ejecución, lo que significa ninguno estático El análisis o el análisis del código fuente es suficiente.
Incluso puede engañar a las herramientas de análisis estático convirtiendo el código escrito de manera estática en instrucciones en tiempo de ejecución. ¿A Veracode no le gusta tu construcción Java? Vuelva a escribirlo con la reflexión, y el error Veracode desaparece y nadie es más sabio. Como experto en seguridad, también debe asumir que los programadores que trabajan en su propia empresa son una amenaza potencial.
En resumen, no hay forma de escapar del análisis del código fuente, el análisis estático y el análisis dinámico en una aplicación determinada si su esperanza es una base de código aceptablemente segura. *
B) Cuál proporciona más cobertura / vulnerabilidades.
El análisis del código fuente depende de que los revisores tengan excelentes habilidades de seguridad y, dado que son seres humanos, no se puede esperar razonablemente un rendimiento perfecto. Es por eso que las herramientas de análisis estático son útiles. Mi preferencia es ejecutar primero las herramientas de análisis estático y luego realizar las revisiones de código seguro después , se mitigan los descubrimientos. Prefiero usar STRIDE, pero hay otros marcos a considerar. Esto permite a los humanos concentrarse en los problemas de seguridad menos mundanos que están más relacionados con la lógica. Pero un ser humano inteligente vencerá a una herramienta de análisis estático tonto cualquier día de la semana.
El análisis de código fuente puede ayudarlo a encontrar dónde un programador dejó una puerta trasera ... las herramientas de análisis estático no están equipadas para manejar eso.
Entonces, la respuesta a esta pregunta es ... "depende". ¿Qué tipo de amenazas quieres dejar sin marcar?
* A menos que "aceptablemente seguro" se defina como dejar las ventanas abiertas y la puerta frontal desbloqueada.