Recientemente leí sobre dos de ellos:
1. Desbordamiento del búfer: sucede cuando los datos escritos en un búfer (fragmento de memoria) se desbordan y se sobrescriben en la memoria adyacente debido a la falta de verificaciones de límites adecuadas. Permíteme mostrarte algo: considera el siguiente código que probé en Compilar y ejecutar C en línea, (Un compilador en línea de C):
Puede ver claramente que he asignado memoria para solo 8 enteros en la matriz ‘a’, pero he tratado de acceder y modificar el valor correspondiente al décimo entero en la matriz ‘a’ (una ubicación de memoria que pertenece a alguna otra entidad) . Ciertamente, no debe permitirse nada tan poco ético, muchachos … pero el resultado es bastante sorprendente, ¿no es así?
- ¿Qué antivirus es el mejor para Windows 10 y cuyo precio es el más bajo?
- ¿Cuál es la mejor manera de bloquear las llamadas de phishing en India?
- ¿Los mensajes enviados con iMessage de Apple están encriptados?
- Si lo desea, ¿es probable el trabajo remoto en seguridad cibernética / aseguramiento de la información?
- El siguiente resumen de Black Hat 2011 establece que no existen firewalls para redes comerciales de alta frecuencia. ¿Es esto cierto?
Luego, me volví un poco más ambicioso e intenté lo siguiente:
y obtuve la falla de segmentación más temida :
Entonces, ¿qué pasó ?
Bueno, C permitirá que un programa modifique una memoria siempre que pertenezca al mismo programa. En caso de un [9] , la ubicación de la memoria pertenecía al programa, pero en el caso de un [10000] no lo hizo.
(Tenga en cuenta que aunque la ubicación de memoria a [9] pertenecía al programa y podía modificarse, no era una buena práctica hacerlo, porque simplemente significa que está corrompiendo alguna otra información almacenada por el programa).
2. Doble llamada libre: como su nombre lo indica, ocurre cuando intenta liberar la memoria asignada a un puntero, que ya se ha liberado. Veamos algo genial:
(El código anterior se compiló y ejecutó en Compilar y ejecutar C en línea, (Un compilador en línea de C) )
Entonces, ¿cuál es el problema, me parece bastante bien?
El problema, queridos amigos, es que una vez que han liberado el puntero ‘a’, no saben si su nuevo valor es ‘NULL’ o si apunta a alguna otra ubicación. Si apunta a alguna otra ubicación, que puede ser, entonces también puede liberar esa memoria.
Entonces, intenté ver si un puntero liberado siempre se establece automáticamente en ‘NULL’, pero parece que no:
Pero no temas, amigos, porque todo este mundo no está lleno de oscuridad, y todavía hay algo de esperanza. El código donde intenté liberar el mismo puntero dos veces sin reasignación me arrojó un error con el mensaje: “doble libre o corrupción”. ¡Uf! … .., parece que este ha sido atendido.
(ps: me gustaría saber acerca de más vulnerabilidades en C, sería genial si otros pudieran compartirlas aquí).
—–
Editar: después de un comentario de Pawan Kumar, decido que debo agregar a mi respuesta que el segundo error ( doble llamada gratuita ) en realidad se puede evitar restableciendo el puntero una vez liberado a NULL . Por ejemplo, ver a continuación:
y la salida:
(El código anterior se compiló y ejecutó en Compilar y ejecutar C en línea, (Un compilador en línea de C) )