Откриване и контролиране на неоторизирани четения на споделена памет

Чудех се - има ли известни техники за контрол на достъпа до обект със споделена памет отвсякъде, освен от оторизирана програма?

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

Предполагам обаче, че има случаи, в които някой потенциално може да получи достъп до тази споделена памет от програма R - просто да се прикачи към нея и да я модифицира. За да спрете това, можете да направите сегмента на паметта само за четене - но сега програмата R все още може да чете какво има в паметта.

Въпросът ми е на части -

  1. има ли начин да

    а) позволява само на Q достъп до споделената памет?

    b) разберете дали четенето е извършено от някой различен от 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