Я знаю, что на машине Linux, если процесс может получить привилегии root, он может получить доступ к частям файловой системы, к которым он обычно не имеет доступа.
Я хочу спросить, может ли процесс Linux с правами root проверять память любого другого процесса в системе? Так что если у меня есть процесс, который содержит секрет в своей куче или стеке, сможет ли процесс с правами root получить к нему доступ, и если да, то как он это сделает?
(Тот, кто ответит, может также рассмотреть процесс оболочки с правами root; меня просто беспокоит процесс с правами root)
решение1
да, можно, для примера смотрите этот ответ https://stackoverflow.com/questions/12977179/чтение-проживающего-процесса-памяти-без-прерывания-его
или играть с этим /dev/<pid>/mem
или /dev/kmem
нравится это
например с этим кодом,кореньпользователь может читать память любого процесса на хосте.
#! /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()
См. также использование ptrace
и gdb
, инструментов, которые предназначены для выполнения этой задачи в режиме реального времени.
решение2
Да.
Возможности root были разделены. Теперь процесс может иметь подмножество из них (включая root, не имеющий ни одного).
Глядя настраница руководства по возможностям, мы можем увидеть, что root может (обычно) делать.
Я включаюнемногоздесь:
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.
Из показанных здесь CAP_SYS_MODULE
можно использовать для загрузки модуля ядра, который может это сделать; CAP_SYS_RAWIO
можно использовать для открытия /dev/mem
; Существуют и другие способы с другими возможностями, включая ptrace
.