Eu sei que em uma máquina Linux, se um processo for capaz de obter privilégios de root, ele poderá acessar partes do sistema de arquivos às quais normalmente não teria acesso.
Quero perguntar se um processo Linux com root pode inspecionar a memória de qualquer outro processo em um sistema. Portanto, se eu tiver um processo que contém um segredo em seu heap ou pilha, um processo com acesso root poderá acessá-lo e, em caso afirmativo, como o fará?
(Quem responder também pode considerar um processo shell enraizado; só estou preocupado com um processo com acesso root)
Responder1
sim, você pode, por exemplo, veja esta resposta https://stackoverflow.com/questions/12977179/reading-living-process-memory-without-interrupting-it
ou brincar com /dev/<pid>/mem
ou /dev/kmem
gostar disso
por exemplo, com este código,raizo usuário pode ler a memória de qualquer processo no 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()
Veja também o uso de ptrace
e gdb
, ferramentas projetadas para fazer isso em tempo real.
Responder2
Sim.
Os recursos raiz foram divididos. Agora, um processo pode ter um subconjunto deles (incluindo o root sem nenhum).
Ao olhar parapágina de manual de recursos, podemos ver o que o root pode (normalmente) fazer.
Eu incluo umalgunsaqui:
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.
Dos mostrados aqui, CAP_SYS_MODULE
poderiam ser usados para carregar um módulo do kernel que pudesse fazer isso; CAP_SYS_RAWIO
poderia ser usado para abrir /dev/mem
; Existem outras maneiras com outros recursos, incluindo ptrace
.