Disculpas si esto no es tanto una "pregunta" como una discusión. He estado pensando en esto por un tiempo.
¿Cómo podría capacitar a un sistema de aprendizaje automático para identificar (nuevas) vulnerabilidades en bases de código de código abierto? ¿O incluso binarios cerrados? ¿Es posible?
Aquí está mi solución propuesta ... Tengo curiosidad por saber si alguien está familiarizado con el trabajo en este sentido o si tiene alguna idea sobre su factibilidad.
Requisitos:
Una base de datos CVE con las siguientes propiedades:
1) The source diff of the patch applied to fix the vulnerability, i.e. the "before/after" of the critical section of code
2) The bindiff of the binary before and after patching the vulnerability
Goce
Use el código de las vulnerabilidades previamente identificadas para capacitar al sistema de LD para que reconozca el código "vulnerable", y luego aplíquelo a las secciones críticas de código en proyectos de código abierto.
Se vería algo así ...
FASE DE RECOPILACIÓN DE DATOS
1) Collect the before/after code of all previous vulnerabilities
2) Use the before/after code to identify the "critical section" that caused the vulnerability
3) Convert the "critical section" to its AST representation
FASE DE ENTRENAMIENTO:
1) Determine the best ML algorithms to use for comparing AST representations
2) Using labeled inputs of "vulnerable" and "safe" AST representations, train the ML system to recognize a "vulnerable" AST
IDENTIFICACIÓN DE LA NUEVA FASE DE VULNERABILIDADES:
1) Download open source code bases
2) Somehow prioritize which code to convert to AST
3) Convert code to AST and feed to ML system to determine likelihood of "vulnerability"
4) Apply some combination of static and manual analysis to verify the vulnerability
5) Use results as further feedback to train the ML system
De nuevo, me doy cuenta de que esto no es estrictamente una "pregunta", pero espero que pueda fomentar un debate interesante. Es una idea con la que he estado jugando en mi cabeza por un tiempo, pero la mayor parte está fuera de mi experiencia.
Definitivamente hay muchos desafíos, principalmente falsos positivos (por ejemplo, tal vez un doble ciclo anidado con una docena de condicionales parece un AST vulnerable, pero está en una parte no crítica del código). Pero creo que la idea central de entrenar algoritmos de ML basados en vulnerabilidades existentes llevaría a una forma muy eficiente de encontrar NUEVAS vulnerabilidades. Como mínimo, podría proporcionar un aumento de la eficiencia a herramientas como los fuzzers, dirigiéndolos a las partes críticas del código. Además, no necesariamente tiene que funcionar solo en código fuente abierto. También podría desarmar el binario vulnerable y el binario parcheado, y comparar sus instrucciones ASM. De hecho, esto podría incluso conducir a una señal más alta que el método AST.