2009-07-14 2 views
3

Ich frage mich - gibt es irgendwelche Techniken, um den Zugriff auf ein Shared-Memory-Objekt von überall zu steuern, außer von einem autorisierten Programm?Erkennen und Kontrollieren von nicht autorisierten Lesevorgängen im Shared Memory

Nehmen wir zum Beispiel an, ich erstelle ein Shared-Memory-Segment für die Verwendung in einem Programm P, um von Q zugegriffen werden, und ich mache es Read-Write. Ich kann mit Q darauf zugreifen, weil ich ihm (Q) die erforderlichen Berechtigungen dafür gegeben habe (läuft als ein bestimmter Benutzer mit Gruppen usw.).

Ich vermute jedoch, es gibt Fälle, in denen jemand potenziell auf diesen freigegebenen Speicher von einem Programm R zugreifen könnte - einfach daran anhängen und es ändern. Um dies zu stoppen, könnten Sie das Speichersegment nur lesen - aber jetzt könnte Programm R noch lesen was im Speicher war.

Meine Frage ist in Teilen -

  1. Gibt es eine Möglichkeit zu,

    a) erlauben nur Q auf den gemeinsamen Speicher zugreifen?

    b) Stellen Sie fest, ob jemand von Q gelesen hat - und wer hat das gemacht? [Ist das überhaupt möglich?] Könnte dies für Bonuspunkte plattformübergreifend gemacht werden? [Wahrscheinlich nicht, aber nicht schaden versucht :)]

  2. Unter welchen Umständen könnte ein Rogue-Programm an den gemeinsamen Speicher anschließen? Ich gehe davon aus, dass ein Benutzer OS-Lücken ausnutzen und der Benutzer werden kann, der das Programm gestartet hat. Irgendwelche anderen?

Antwort

9

POSIX Shared Memory hat das gleiche Berechtigungssystem als Dateien - wenn Sie ipcs ausgeführt werden Sie die Berechtigungen der gemeinsam genutzten Speichersegmente auf Ihrem System sehen:

$ 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 

In Antwort auf Frage 1a) können Sie das normale UNIX-Berechtigungssystem verwenden, um nur Zugriff von einem bestimmten Benutzer und/oder einer bestimmten Gruppe zu erlauben. Dies kann shmctl gesteuert werden:

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); 

Für 1b), das glaube ich keine Revision Schnittstellen für Shared-Memory-Zugriff vorhanden sind.

In Bezug auf Ihre zweite Frage kann jeder Prozess, der als shm Besitzer/Gruppe ausgeführt wird oder als root ausgeführt wird, auf Ihren Speicher zugreifen - dies unterscheidet sich nicht vom Zugriff auf andere Ressourcen. Root kann immer auf alles auf einem * ix-System zugreifen; und so würde jeder Exploit, der einen Benutzer zu Root eskalierte, den Zugriff auf irgendeinen gemeinsam genutzten Speicherbereich erlauben.

+0

Großartig, danke! Das hilft sehr – viksit