Обнаружение и контроль несанкционированного чтения разделяемой памяти

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

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

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

Мой вопрос по частям -

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

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

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

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


person viksit    schedule 14.07.2009    source источник


Ответы (1)


Общая память 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.gid = 200;
perms.mode = 0660; // Allow read/write only by 
                   // uid '100' or members of group '200'
shmctl(shmid, IPC_SET, &perms);

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

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

person DaveR    schedule 14.07.2009