আমি একটি জেন্টু কঠোর বাক্স পরিচালনা করি যা /bin/ping
সেটআপড -রুট বাইনারিগুলির বেশিরভাগ প্রয়োজন (যেমন CAP_NET_RAW রয়েছে) মুছে ফেলার জন্য ফাইল ক্ষমতা ব্যবহার করে ।
প্রকৃতপক্ষে, আমি কেবল বাইনারিটি রেখেছি তা হ'ল:
abraxas ~ # find / -xdev -type f -perm -u=s
/usr/lib64/misc/glibc/pt_chown
abraxas ~ #
যদি আমি সেটুইড বিটটি সরিয়ে ফেলি, বা আমার মূল ফাইল সিস্টেম পুনরায় গণনা করি, এসএসডিডি এবং nosuid
জিএনইউ স্ক্রিন কাজ করা বন্ধ করে দেয় কারণ তারা grantpt(3)
তাদের মাস্টার পেসুডোটার্মিনালগুলিকে কল করে এবং গ্লিবসি স্পষ্টতই এই প্রোগ্রামটি স্লেভ সিউডোটার্মিনালটির অধীনে ছোড এবং chmod করার জন্য প্রয়োগ করে /dev/pts/
এবং জিএনইউ স্ক্রিনটি কখন এই ফাংশনটির যত্ন করে about ব্যর্থ।
সমস্যাটি হ'ল ম্যানপেজটি grantpt(3)
স্পষ্টতই বলেছে যে লিনাক্সের অধীনে devpts
ফাইল - সিস্টেম মাউন্ট করা হয়েছে, এমন কোনও সহায়ক বাইনারি প্রয়োজন নেই; কার্নেলটি স্বয়ংক্রিয়ভাবে স্লেভের ইউআইডি ও জিআইডি সেট করার পরে প্রক্রিয়াটির প্রকৃত ইউআইডি এবং জিআইডি সেট হয়ে যাবে /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
প্রোগ্রামের জন্য (তাদের যেমনটি হওয়া উচিত) তা পরীক্ষা না করে ?