Обнаружение и контроль несанкционированных операций чтения из общей памяти - PullRequest
3 голосов
/ 15 июля 2009

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

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

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

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

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

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

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

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

1 Ответ

9 голосов
/ 15 июля 2009

Совместно используемая память 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);

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

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

...