Sé que en una máquina Linux, si un proceso puede obtener privilegios de root, puede acceder a partes del sistema de archivos a las que normalmente no tendría acceso.
Quiero preguntar si un proceso de Linux rooteado puede inspeccionar la memoria de cualquier otro proceso en un sistema. Entonces, si tengo un proceso que contiene un secreto en su montón o pila, ¿un proceso rooteado podrá acceder a él y, en caso afirmativo, cómo lo hará?
(Quien responda también puede considerar un proceso de shell rooteado; solo me preocupa un proceso con acceso de root)
Respuesta1
Sí, puedes, para ver ejemplos, mira esta respuesta. https://stackoverflow.com/questions/12977179/reading-living-process-memory- without-interrupting-it
o jugar con /dev/<pid>/mem
o /dev/kmem
como esto
por ejemplo, con este código,raízEl usuario puede leer la memoria de cualquier proceso en el host.
#! /usr/bin/env python
import re
import sys
print(sys.argv[1] + ".dump")
maps_file = open("/proc/"+ sys.argv[1] + "/maps", 'r')
mem_file = open("/proc/" + sys.argv[1] + "/mem", 'rb', 0)
output_file = open(sys.argv[1] + ".dump", 'wb')
for line in maps_file.readlines(): # for each mapped region
m = re.match(r'([0-9A-Fa-f]+)-([0-9A-Fa-f]+) ([-r])', line)
if m.group(3) == 'r': # if this is a readable region
start = int(m.group(1), 16)
end = int(m.group(2), 16)
mem_file.seek(start) # seek to region start
chunk = mem_file.read(end - start) # read region contents
output_file.write(chunk) # dump contents to standard output
maps_file.close()
mem_file.close()
output_file.close()
Vea también el uso de ptrace
y gdb
, herramientas diseñadas para hacer esto en tiempo real.
Respuesta2
Sí.
Las capacidades raíz se han roto. Ahora un proceso puede tener un subconjunto de ellos (incluida la raíz que no tiene ninguno).
Al mirar elpágina man de capacidades, podemos ver lo que root puede hacer (normalmente).
incluyo unpocosaquí:
CAP_DAC_OVERRIDE
Bypass file read, write, and execute permission checks. (DAC
is an abbreviation of "discretionary access control".)
CAP_KILL
Bypass permission checks for sending signals (see kill(2)).
This includes use of the ioctl(2) KDSIGACCEPT operation.
CAP_NET_BIND_SERVICE
Bind a socket to Internet domain privileged ports (port
numbers less than 1024).
CAP_SYS_MODULE
* Load and unload kernel modules (see init_module(2) and
delete_module(2));
* in kernels before 2.6.25: drop capabilities from the system-
wide capability bounding set.
CAP_SYS_TIME
Set system clock (settimeofday(2), stime(2), adjtimex(2)); set
real-time (hardware) clock.
CAP_SYS_RAWIO
* Perform I/O port operations (iopl(2) and ioperm(2));
* access /proc/kcore;
* employ the FIBMAP ioctl(2) operation;
* open devices for accessing x86 model-specific registers
(MSRs, see msr(4));
* update /proc/sys/vm/mmap_min_addr;
* create memory mappings at addresses below the value
specified by /proc/sys/vm/mmap_min_addr;
* map files in /proc/bus/pci;
* open /dev/mem and /dev/kmem;
* perform various SCSI device commands;
* perform certain operations on hpsa(4) and cciss(4) devices;
* perform a range of device-specific operations on other
devices.
De los que se muestran aquí, CAP_SYS_MODULE
podrían usarse para cargar un módulo del kernel que pudiera hacerlo; CAP_SYS_RAWIO
podría usarse para abrir /dev/mem
; Hay otras formas con otras capacidades, incluidas ptrace
.