मैं एक Gentoo हार्डडेन बॉक्स का उपयोग करता /bin/ping
हूं, जो सेतु -रूट बायनेरिज़ (जैसे CAP_NET_RAW, आदि) की अधिकांश आवश्यकता को समाप्त करने के लिए फ़ाइल क्षमताओं का उपयोग करता है ।
वास्तव में, मेरे पास जो एकमात्र बाइनरी है वह यह है:
abraxas ~ # find / -xdev -type f -perm -u=s
/usr/lib64/misc/glibc/pt_chown
abraxas ~ #
यदि मैं सेट्यूड बिट को हटा देता हूं, या अपने रूट फाइलसिस्टम nosuid
, sshd और GNU स्क्रीन को रोक देता हूं , तो वे काम करना बंद कर देते हैं, क्योंकि वे grantpt(3)
अपने मास्टर पेसुडोटर्मिनल्स पर कॉल करते हैं और ग्लिब्क जाहिरा तौर पर गुलाम स्यूडोटर्मिनल के तहत इस कार्यक्रम को चांस और चोदने के लिए निष्पादित करते हैं /dev/pts/
, और GNU स्क्रीन इस फ़ंक्शन के बारे में परवाह करता है। विफल रहता है।
समस्या यह है कि, मेन्यू में grantpt(3)
स्पष्ट रूप से कहा गया है कि लिनक्स के तहत, devpts
फाइलसिस्टम माउंटेड होने के साथ, इस तरह के किसी भी सहायक बाइनरी की आवश्यकता नहीं है; कर्नेल स्वचालित रूप से UID & GID को गुलाम की वास्तविक UID & GID प्रक्रिया में सेट कर देगा जो खुल गया /dev/ptmx
(कॉल करके getpt(3)
)।
मैंने इसे प्रदर्शित करने के लिए एक छोटा सा उदाहरण कार्यक्रम लिखा है:
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
int main(void)
{
int master;
char slave[16];
struct stat slavestat;
if ((master = getpt()) < 0) {
fprintf(stderr, "getpt: %m\n");
return 1;
}
printf("Opened a UNIX98 master terminal, fd = %d\n", master);
/* I am not going to call grantpt() because I am trying to
* demonstrate that it is not necessary with devpts mounted,
* the owners and mode will be set automatically by the kernel.
*/
if (unlockpt(master) < 0) {
fprintf(stderr, "unlockpt: %m\n");
return 2;
}
memset(slave, 0, sizeof(slave));
if (ptsname_r(master, slave, sizeof(slave)) < 0) {
fprintf(stderr, "ptsname: %m\n");
return 2;
}
printf("Device name of slave pseudoterminal: %s\n", slave);
if (stat(slave, &slavestat) < 0) {
fprintf(stderr, "stat: %m\n");
return 3;
}
printf("Information for device %s:\n", slave);
printf(" Owner UID: %d\n", slavestat.st_uid);
printf(" Owner GID: %d\n", slavestat.st_gid);
printf(" Octal mode: %04o\n", slavestat.st_mode & 00007777);
return 0;
}
हटाए गए पूर्वोक्त कार्यक्रम पर सेट बिट के साथ कार्रवाई में इसे देखें:
aaron@abraxas ~ $ id
uid=1000(aaron) gid=100(users) groups=100(users)
aaron@abraxas ~ $ ./ptytest
Opened a UNIX98 master terminal, fd = 3
Device name of slave pseudoterminal: /dev/pts/17
Information for device /dev/pts/17:
Owner UID: 1000
Owner GID: 100
Octal mode: 0620
मेरे पास केवल कुछ विचार हैं कि इस समस्या को कैसे हल किया जाए:
1) प्रोग्राम को एक कंकाल के साथ बदलें जो केवल 0 देता है।
2) मेरे कुछ नहीं करने के लिए पैच अनुदान () मेरे libc में।
मैं इन दोनों को स्वचालित कर सकता हूं, लेकिन क्या किसी के पास एक के लिए एक सिफारिश है, या इसे कैसे हल करने के लिए सिफारिशें हैं?
एक बार यह हल हो जाने के बाद, मैं आखिरकार mount -o remount,nosuid /
।
pty
(जैसा कि उन्हें चाहिए) लेकिन कार्यक्रम के लिए?