¿Hay algún lenguaje de programación realmente bajo que pueda acceder directamente a la variable de memoria? Por ejemplo, si tengo un programa, tengo una variable i
. ¿Alguien puede acceder a la memoria para cambiar mi variable de programa i
a otro valor?¿Puede un programa asignar la memoria directamente?
Respuesta
Como un ejemplo de cómo cambiar la variable en un programa desde "el exterior", considere el uso de un depurador. Programa de ejemplo:
$ cat print_i.c
#include <stdio.h>
#include <unistd.h>
int main (void) {
int i = 42;
for (;;) { (void) printf("i = %d\n", i); (void) sleep(3); }
return 0;
}
$ gcc -g -o print_i print_i.c
$ ./print_i
i = 42
i = 42
i = 42
…
(. El programa imprime el valor de i
cada 3 segundos)
En otro terminal, encontrar el identificador de proceso del programa en ejecución y adjuntar el depurador gdb
a ella:
$ ps | grep print_i
1779 p1 S+ 0:00.01 ./print_i
$ gdb print_i 1779
…
(gdb) bt
#0 0x90040df8 in mach_wait_until()
#1 0x90040bc4 in nanosleep()
#2 0x900409f0 in sleep()
#3 0x00002b8c in main() at print_i.c:6
(gdb) up 3
#3 0x00002b8c in main() at print_i.c:6
6 for (;;) { (void) printf("i = %d\n", i); (void) sleep(3); }
(gdb) set variable i = 666
(gdb) continue
Ahora la salida del programa de cambios:
…
i = 42
i = 42
i = 666
Entonces, sí, es posible cambiar la variable de un programa desde "afuera" si tiene acceso a su memoria. Aquí hay muchas advertencias, p. uno necesita ubicar dónde y cómo se almacena la variable. Aquí fue fácil porque compilé el programa con símbolos de depuración. Para un programa arbitrario en un lenguaje arbitrario es mucho más difícil, pero todavía teóricamente posible. Por supuesto, si yo no fuera el propietario del proceso en ejecución, entonces un sistema operativo con buena conducta no me permitiría acceder a su memoria (sin "piratear"), pero esa es una pregunta completamente diferente.
Si otro proceso tiene suficientes permisos, puede cambiar la memoria de su proceso. En Linux, es tan simple como leer y escribir el pseudo-archivo /proc/{pid}/mem
. Esta es la cantidad de vulnerabilidades que funcionan, aunque confían en alguna vulnerabilidad que les permite ejecutarse con privilegios muy altos (root en Unix).
Claro, a menos que, por supuesto, el sistema operativo proteja esa memoria en su nombre. El lenguaje de máquina (el lenguaje de programación de nivel más bajo) siempre "accede a la memoria directamente", y es bastante fácil de lograr en C (por ejemplo, al convertir un tipo de entero en puntero). El punto es que, a menos que este código se ejecute en su proceso (o kernel), sea cual sea el idioma en el que esté escrito, el sistema operativo normalmente protegería su proceso de dicha interferencia (asignando la memoria de varias maneras para diferentes procesos, por ejemplo).
Es posible que desee ver varias API de depuración por ahí. Puede que se sorprenda de cuán insegura puede ser la memoria "protegida" en el mundo real. –
@ttmrichter: el punto no es la seguridad, es la estabilidad. –
Esas mismas API de depuración también hacen que la estabilidad sea un problema. Especialmente cuando los codificadores vaqueros los usan para evitar problemas de diseño. –
Respuesta corta: sí. Respuesta larga: depende de muchos factores, incluyendo su hardware (¿administración de memoria?), Su sistema operativo (características de espacios de direcciones virtuales protegidos para eludir estas protecciones?) Y el conocimiento detallado que su oponente puede o no tener de su lenguaje arquitectura y la estructura de tu aplicación.
Depende. En general, una de las funciones de un sistema operativo se llama segmentación - eso significa mantener programas fuera de la memoria del otro. Si escribo un programa que intenta acceder a la memoria que pertenece a su programa, el sistema operativo debería bloquearme, ya que estoy cometiendo algo llamado falla de segmentación.
Pero hay situaciones en las que puedo evitar eso. Por ejemplo, si tengo privilegios de administrador en el sistema, es posible que pueda acceder a su memoria. O peor aún: puedo ejecutar su programa dentro de una máquina virtual y luego sentarme fuera de esa VM y hacer lo que quiera con su memoria.
Por lo tanto, en general, debe suponer que una persona malintencionada puede acercarse y jugar con la memoria de su programa si se esfuerzan lo suficiente.
- 1. Memoria máxima. Un proceso .NET puede asignar
- 2. No se puede asignar memoria
- 3. memoria máxima que malloc puede asignar
- 4. playframework - IOException no puede asignar memoria
- 5. Asignar memoria para un vector
- 6. no puede asignar la memoria de archivos en MongoDB
- 7. ¿Cuánta memoria debería poder asignar?
- 8. No se puede asignar un objeto a un objeto volátil
- 9. rails asset Pipeline "No se puede asignar memoria - nodejs"
- 10. FANN Error 11: No se puede asignar memoria
- 11. zlib, deflate: ¿Cuánta memoria asignar?
- 12. ¿Asignar memoria al puntero doble?
- 13. Sin memoria al asignar cursores
- 14. Use mmap para asignar memoria
- 15. Cualquiera todavía programa usando directamente xlib
- 16. Durante la ejecución, ¿cómo puede un programa Java decir cuánta memoria está usando?
- 17. ¿Se puede limpiar la memoria?
- 18. ¿Podemos asignar un valor a una ubicación de memoria dada?
- 19. Pre-asignar memoria entre HostApp y DLL
- 20. ¿Se puede asignar un TypeConverter sin TypeConverterAttribute?
- 21. SIGKILL al asignar memoria en C++
- 22. POSIX error 12 ("No se puede asignar memoria") al cargar archivos desde un iPhone
- 23. ¿Cómo carga DOS un programa en la memoria?
- 24. Cómo obtener la memoria utilizada por un programa Delphi
- 25. ¿Un programa C++ libera automáticamente la memoria cuando se bloquea?
- 26. Asignar salida de un programa a una variable
- 27. ¿Cuánta memoria debe asignar 'managed_shared_memory'? (Impulso)
- 28. ¿Por qué las estructuras no se pueden asignar directamente?
- 29. Manejo de la memoria asignada Archivo en C# directamente desde la memoria
- 30. ¿Puede un programa calcular la complejidad de un algoritmo?
@Marcelo - parece implicar que el sistema de archivos 'proc' es un agujero de seguridad. De hecho, el agujero de seguridad es lo que permite que los malos obtengan privilegios de root. –
Estoy muy de acuerdo, @Stephen, por lo que expresé este punto de forma explícita en mi respuesta ("... confían en cierta vulnerabilidad ..."). –