2009-07-14 2 views
3

Мне было интересно - существуют ли какие-либо известные методы контроля доступа к объекту общей памяти из любой точки, кроме авторизованной программы?Обнаружение и управление неавторизованными данными общей памяти

Например, можно сказать, что я создаю сегмент разделяемой памяти для использования в программе P, к которой обращается Q, и я делаю его Read-Write. Я могу получить доступ к нему с помощью Q, потому что я дал ему (Q) необходимые разрешения для этого (работает как конкретный пользователь с группами и т. Д.).

Тем не менее, я предполагаю, что есть случаи, когда кто-то потенциально может получить доступ к этой общей памяти из программы R - просто подключив ее и изменив ее. Чтобы остановить это, вы можете сделать только сегмент памяти - но теперь программа R может все еще читать то, что было в памяти.

Мой вопрос в части -

  1. Есть ли способ,

    а) разрешить только Q, чтобы получить доступ к общей памяти?

    б) фигурирует ли прочитанное кем-то, кроме Q - и кто это сделал? [Возможно ли это?] Для бонусных очков это можно сделать кросс-платформенными? [Наверное, нет, но никакого вреда не пытается :))

  2. При каких обстоятельствах программа мошенников может подключаться к общей памяти? Я предполагаю, что один из способов заключается в том, что пользователь может использовать дыры в ОС и стать пользователем, который запустил программу. Любые другие?

ответ

9

POSIX разделяемой памяти имеет ту же систему разрешений в виде файлов - при запуске ipcs вы увидите разрешения общих сегментов памяти на вашей системе:

$ ipcs -m 
IPC status from <running system> as of Tue Jul 14 23:21:25 BST 2009 
T  ID  KEY  MODE  OWNER GROUP 
Shared Memory: 
m 65536 0x07021999 --rw-r--r--  root wheel 
m 65537 0x60022006 --rw-r--r--  root wheel 

В ответ на вопрос 1а) , вы можете использовать стандартную систему разрешений UNIX, чтобы разрешать доступ только от определенного пользователя и/или группы. Это можно управлять с помощью shmctl:

struct ipc_perm perms; 
perms.uid = 100; 
perms.giu = 200; 
perms.mode = 0660; // Allow read/write only by 
        // uid '100' or members of group '200' 
shmctl(shmid, IPC_SET, &perms); 

Для 1б), я не думаю, что существуют какие-либо аудита интерфейсы для общего доступа к памяти.

Что касается вашего второго вопроса, любой процесс, выполняющийся как владелец/группа shm или работающий от имени пользователя root, сможет получить доступ к вашей памяти - это ничем не отличается от доступа к любому другому ресурсу. Корень всегда может получить доступ к чему-либо в системе * ix; и поэтому любой эксплойт, который увеличил пользователя до корня, обеспечит доступ к любой области общей памяти.

+0

Отлично, спасибо! Это очень помогает – viksit

Смежные вопросы