Históricamente, el software (sistemas operativos incluidos) no estaba realmente diseñado para proteger contra la intención maliciosa. Si existía alguna protección, estaban más allí solo para preservar la estabilidad del sistema que para realmente detener a los “malos”.
Por supuesto, después de ver que realmente necesitamos defendernos de los “tipos malos”, estudiamos las vulnerabilidades y encontramos defensas bastante sólidas contra ellos.
Esa es esencialmente la respuesta, y el resto de esto son solo ejemplos. Tenga en cuenta que esta información es justo lo que recuerdo de mi clase de pregrado (y mi memoria es borrosa), así que no dude en corregirme.
- ¿Cómo manipulan las computadoras la aleatoriedad?
- ¿Cómo puede determinar eficientemente el k-ésimo elemento máximo en un árbol de búsqueda binario?
- ¿Por qué hay tantos métodos diferentes de compresión de archivos?
- ¿En qué universidad debo estudiar mi licenciatura en informática (informatik) en Berlín? (TU Berlín, FU Berlín o HU Berlín)
- ¿Cuáles son los proyectos geniales que uno puede hacer en Inteligencia Artificial y Aprendizaje Automático?
En el pasado, si quería comprometer un programa escrito en C, todo lo que realmente tenía que hacer para tomar el control completo de un programa era desbordar un búfer, sobrescribir un puntero de retorno y ejecutar un código de shell arbitrario (esto se simplifica demasiado) .
Ahora, hay varias razones por las que esto ya no funcionará. Por un lado, evitamos desbordamientos del búfer en la pila al poner un valor canario aleatorio. Si desborda la pila, este valor se sobrescribirá y el programa sabrá que algo está mal y dejará de ejecutarse.
Puede sortear el valor canario si puede sobrescribir un puntero, pero los compiladores son lo suficientemente inteligentes como para colocar todos los búferes al final, de modo que tendrá dificultades para sobrescribir otras variables. Esto ni siquiera es posible en la mayoría de los lenguajes de nivel superior como Java, ya que hacen cosas como verificar si está escribiendo más allá del final de una matriz.
Además, para ejecutar el código de shell, debe conocer la dirección del código en ejecución. Entonces, para detener a los piratas informáticos, los sistemas operativos ahora utilizan la asignación aleatoria del diseño del espacio de direcciones (ASLR). Básicamente, lo que hace es aleatorizar dónde comienzan las áreas de memoria, lo que hace que sea muy difícil saber dónde se ubicaría el código shell que inyectó.
Es probable que el sistema operativo también haga que la memoria de escritura sea de solo lectura, por lo que incluso si inyectó el código de shell, no sería ejecutable. Aún así, los piratas informáticos también pueden solucionar esto uniendo diferentes partes de un programa legítimo para que haga algo malo. Puede leer sobre una técnica, programación orientada al retorno, aquí: http://cseweb.ucsd.edu/~hovav/di…
Estoy seguro de que hay mucho más que no sé teniendo en cuenta mi experiencia limitada. Aún así, está bastante claro que crear virus es mucho más difícil de lo que solía ser.
Puede ver que ahora la mayoría de las vulnerabilidades están relacionadas con la web. Esto es probable porque los navegadores son relativamente nuevos y la Internet está evolucionando a un ritmo increíble. Si no recuerdo mal, las vulnerabilidades de cross site scripting (XSS) son ahora las vulnerabilidades más comúnmente reportadas. Desafortunadamente, muchas vulnerabilidades web son el resultado de que los desarrolladores web no logran desinfectar adecuadamente las entradas de los usuarios, pero parece poco razonable esperar que cada desarrollador web comprenda realmente la seguridad web y no cometa errores.
Otra razón por la que el navegador es un buen objetivo es que es un programa muy especial, por lo que algunas de las protecciones normales proporcionadas por el sistema operativo no se pueden usar. Por un lado, su navegador tiene que ejecutar el código de JavaScript que carga desde las páginas web, lo que significa que la memoria dinámica debe ser ejecutable para que los navegadores funcionen correctamente. Además, en cierto sentido, como hacker, usted ya tiene un control limitado del navegador si consigue que alguien acceda a su página web, porque puede hacer que el navegador ejecute su javascript.
Un ejemplo de lo que un atacante podría hacer es hacer que el JavaScript “rocíe” el montón con muchas copias del código de shell que desea ejecutar, y luego adivine dónde está el código. La razón por la que esto funciona en un navegador y no en un programa tradicional es que la memoria dinámica es ejecutable en el navegador, y también porque puede solicitar una gran cantidad de memoria incluso cuando el navegador no está comprometido. Tenga en cuenta que esta técnica es para evitar las defensas, por lo que aún necesitaría encontrar una vulnerabilidad en el navegador en primer lugar. Aún así, por lo que mi profesor me dijo, no está fuera del alcance de las posibilidades si realmente quieres, ¡aunque obviamente es mucho más inteligente que yo!