Setuid root ikili dosyalarına duyulan ihtiyacın çoğunu ortadan kaldırmak için dosya özelliklerini kullanan bir Gentoo Sertleştirilmiş kutusunu /bin/ping
yönetiyorum (örn . CAP_NET_RAW, vb. Var).
Infact, kalan tek ikili budur:
abraxas ~ # find / -xdev -type f -perm -u=s
/usr/lib64/misc/glibc/pt_chown
abraxas ~ #
Setuid bitini kaldırırsam veya kök dosya sistemimi yeniden bağlarsam nosuid
, sshd ve GNU Screen çalışmamaya başlar çünkü grantpt(3)
ana pesudoterminallerini çağırırlar ve glibc görünüşte bu programı çalıştırır ve altında çalışan köle psödoterminalini chmod eder /dev/pts/
ve GNU Screen bu fonksiyonun ne zaman umurunda olduğunu önemser. başarısız olur.
Sorun şu ki, manpage grantpt(3)
açıkça Linux altında, devpts
dosya sistemi monte edildiğinde böyle bir yardımcı ikili kodunun gerekli olmadığını belirtir ; çekirdek otomatik olarak kölenin UID'sini ve GID'sini otomatik olarak açılan sürecin gerçek UID'sini /dev/ptmx
(arayarak getpt(3)
) ayarlayacaktır .
Bunu göstermek için küçük bir örnek program yazdım:
#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;
}
Yukarıda belirtilen programdaki setuid biti kaldırılarak çalışırken gözlemleyin:
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
Bu soruna geçici bir çözüm bulmak için birkaç fikrim var:
1) Programı, 0 döndüren bir iskeletle değiştirin.
2) Hiçbir şey yapmamak için libc'mde grantpt () eklentisini kullanın.
Bunların her ikisini de otomatikleştirebilirim, ancak bir başkası için bir öneri ya da bunun nasıl çözüleceği konusunda tavsiyeler var mı?
Bu çözüldüğünde, sonunda yapabilirim mount -o remount,nosuid /
.
pty
(gerektiği gibi), ancak program için?