Depende de lo que se entiende por "análisis de código fuente seguro". Uno puede hacer cualquier cosa que uno quiera. El problema, supongo, es cuando alguien más ha pedido algo llamado "análisis seguro del código fuente", y uno se pregunta por qué uno no está calificado para ello.
En muchos casos, dicho análisis debe ser realizado por un Experto en la Materia (SME). En el producto final, una pyme entregará una declaración que básicamente dice "declaro que este código es seguro", con un entendimiento que es una declaración más profunda que "busqué un montón de patrones conocidos y no encontré problemas". / p>
Si estuviera interesado en la traducción auténtica de una filosofía china, ¿confiaría en una persona que sabía mucho de filosofía y tenía un montón de hojas de trucos para ayudar a descifrarla, pero en realidad no sabía chino?
Un gran ejemplo que viene a la mente es un error que afecta a un motor SQL. Perdóneme por no tener el nombre de qué motor, o qué versión para que pueda verificar, he tenido problemas para encontrarlo desde entonces. Sin embargo, el error fue conmovedor. El error estaba en el código que se veía así:
int storeDataInCircularBuffer(Buffer* dest, const char* src, size_t length)
{
if (dest->putPtr + length < dest->putPtr)
return ERROR; // prevent buffer overflow caused by overflow
if (dest->putPtr + length > dest->endPtr) {
... // write the data in two parts
return OK;
} else {
... // write the data in one part
return OK;
}
}
Este código fue creado para formar parte de un búfer circular. En un búfer circular cuando llegas al final del búfer, te envuelves. A veces esto te obliga a dividir el mensaje entrante en dos partes, lo cual está bien. Sin embargo, en este programa SQL, estaban preocupados por el caso en el que length
podría ser lo suficientemente grande como para provocar el desbordamiento de dest->putPtr + length
, creando una oportunidad para un desbordamiento de búfer porque la siguiente verificación no funcionaría bien. Así que ponen en una prueba: if (dest->putPtr + length < dest->putPtr)
. Su lógica era que la única forma en que esta afirmación podría ser cierta es si se produce un desbordamiento, por lo que detectamos el desbordamiento.
Esto creó un agujero de seguridad que realmente fue explotado, y tuvo que ser parchado. ¿Por qué? Bueno, sin que lo sepa el autor original, la especificación de C ++ declara que el desbordamiento de un puntero es un comportamiento indefinido, lo que significa que el compilador puede hacer lo que quiera. Como sucedió, cuando el autor original lo probó, gcc realmente emitió el código correcto. Sin embargo, unas pocas versiones más tarde, gcc tuvo optimizaciones para aprovechar esto. Vio que no había un comportamiento definido en el que esa declaración if
pudiera pasar su prueba, y la optimizó!
Por lo tanto, para algunas versiones, las personas tenían servidores SQL que tenían un exploit, ¡aunque el código tenía controles explícitos para evitar dicho exploit!
Fundamentalmente, los lenguajes de programación son herramientas muy poderosas que pueden morder al desarrollador con facilidad. Analizar si esto ocurrirá requiere una base sólida en el idioma en cuestión.
(Edición: Greg Bacon fue lo suficientemente bueno como para desenterrar una advertencia del CERT sobre esto: Nota de vulnerabilidad VU # 162289 C los compiladores pueden descartar silenciosamente algunas comprobaciones envolventes. , y también esto relacionado. Gracias Greg!)