Grup üyelikleri ve setuid / setgid süreçleri


10

Süreçler de yumuşat yoluyla ayrıcalıkları setuid()ve setgid()uid / gid onlar set grup üyeliklerini devralmak için görünmüyor.

Ayrıcalıklı bir bağlantı noktasını açmak için kök olarak yürütülmesi gereken bir sunucu işlemim var; bundan sonra özel bir ayrıcalıksız uid / gid, 1 - örneğin kullanıcınınki foo(UID 73) 'e yükselir . Kullanıcı foogrubun bir üyesidir bar:

> cat /etc/group | grep bar
bar:x:54:foo

Bu nedenle foo, olarak giriş yaparsam, /test.txtbu özelliklere sahip bir dosyayı okuyabilirim :

> ls -l /test.txt
-rw-r----- 1 root bar 10 Mar  8 16:22 /test.txt

Ancak, aşağıdaki C programı (derleme std=gnu99), root çalıştırıldığında:

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

int main (void) {
    setgid(73);
    setuid(73);
    int fd = open("/test.txt", O_RDONLY);
    fprintf(stderr,"%d\n", fd);
    return 0;
}   

Daima izin verilmediğini bildirir . Bunun, giriş yapmayan bir süreç olmasıyla ilgili olduğunu düşünüyorum, ancak izinlerin çalışması gerektiği şekilde bir tür hamstrings.


1. Bu genellikle sunucular için SOP, ve apache ile yapan birinin raporunu bulduğumdan bunun etrafında bir yol olması gerektiğini düşünüyorum - apache ses grubuna eklendi ve daha sonra ses sistemini kullanabilir. Tabii ki, bu muhtemelen orijinal süreçte değil, bir çatalda gerçekleşir, ancak aslında durum benim bağlamımda aynıdır (setuid çağrısının ardından çatallanmış bir alt süreç).


setuid()/ setgid()Aramalar arasında geçiş yapın .
vonbrand

@vonbrand ROTFL Orada bir facepalm için olduğumu düşündüm - ama aynı sonuç, bu yüzden kırmızı ringa balığı ortadan kaldırmak için soruyu düzenleyeceğim.
goldilocks

1
( Olduğu gibi , grup gid 54 var) setgid(54)yerine kullanırsanız , çalışır mı? setgid(73)/etc/groupsbar
lgeorget

@lgeorget Tabii, ama bu amacı yendi. Sürecin başka nedenlerle kendi GID'sine ihtiyacı vardır ve benzer şekilde bu dosyaların sahip oldukları izinlere sahip olması gerekir. Bu nedenle çoğul gruplara üyelik gereklidir - örneğin, bunu yapmanız gereken iki kullanıcınız varsa . Eğer olamaz Not setuid()hmmm ... Ben sizinle can düşünüyorum, bunu sonra tekrar ... ama seteuid()...
goldilocks

1
Sorum başka bir yerde gizli gizli bir sorun olmadığından emin olmaktı. :-)
lgeorget

Yanıtlar:


14

Sorun şu ki setuidve setgid işleminize ihtiyaç duyduğu tüm bilgileri vermek için yeterli değil. Bir sürecin yetkileri aşağıdakilere bağlıdır:

  • UID'si
  • onun GID
  • ek grupları
  • yetenekleri.

Bkz man 7 credentialsdaha ayrıntılı özetini almak için. Yani, sizin durumunuzda, sorun UID ve GID'yi doğru bir şekilde ayarlamanızdır, ancak işlemin ek gruplarını ayarlamamanızdır. Ve grubun barGID 54, no 73 olduğu için işleminizin içinde bulunduğu bir grup olarak tanınmaz.

Yapmalısın

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <grp.h>

int main (void) {
    gid_t supplementary_groups[] = {54};

    setgroups(1, supplementary_groups);
    setgid(73);
    setuid(73);
    int fd = open("/test.txt", O_RDONLY);
    fprintf(stderr,"%d\n", fd);
    return 0;
}  

1
Bu, daha fazla oyu hak eden ilginç bir soruydu çünkü aslında birçok insan için yararlı olabilir. :-)
lgeorget

Seri portlarla benzer bir sorun yaşıyordum. Bunu dialoutgrup için uyguladım ve ilk kez çalıştı.
tl8

0

Tamam, ağ etrafında biraz trol etti. İlk başta APUE'nun tüm cevapları tutacağını düşündüm ama yanılmışım. Ve benim kopyam (eski sürüm) işte, bu yüzden ... Unix ve Linux Yönetim El Kitabı bölüm 5 ümit verici görünüyor, ama anlamadım (ilk iki baskının sadece bir kopyası, işte).

Bulduğum küçük kaynaklar ("daemon yazma unix" için google), tty'den ayrışmak gibi önemli adımlar hakkında konuşurlar. Garip bir şekilde, http://tldp.org adresindeki kapsamlı NASIL koleksiyonunun bile ayrıntıları yok gibi görünüyor. Sadece excetion Jason Short olan bölüm I - Haydi Yaz Linux Daemon . SUID / SGID ve tüm bu karışıklığın nasıl çalıştığının tüm ayrıntıları Chen, Wagner ve Dean'in SUID'in demistize edilmesidir (USENIX 2002'de yayınlanan bir makale). Ancak dikkatli olun, Linux'un fazladan bir UID'si, FSUID'si vardır (bkz. Wolter'ın Unix Uyumsuzluk Notları: Tartışma için UID Ayar İşlevleri ).

Bir sürecin cüretkarlığı kesinlikle kalbin zayıflığı için değildir. Genel güvenlik hususları D. Wheeler'ın Linux için Güvenli Programlama ve Unix NASIL - Güvenli Yazılım Oluşturma bölümünde verilmiştir . Systemd bunların çoğunu basitleştirmeyi vaat ediyor (ve böylece güvenlik sorunlarına yol açan hatalar için odayı azaltıyor), daemon kılavuzuna bakın .


1
Soru cemaatle ilgili değil. SUID bitini (bir işlemin yürütülebilir dosyasının sahibinin izinlerini vererek) karıştırarak setuid()işlemin UID'sini keyfi olarak değiştirmesine izin verdiniz. SUID genellikle izin vermek için amaçlanmıştır etkinleşmesini ise, - izinlerin (privilleged> olmayan privilleged) setuid()sadece ters yapabilir.
goldilocks
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.