Neden eg / usr / sbin içindeki yürütülebilir dosyalar root tarafından yazılabilir?


31

İkili bir derlenmiş dosyanın (örneğin, içinde /usr/sbin) neden kullanıcı için yazma izni olduğunu açıklayabilir misiniz root?

Benim için bu derlendi. Yani doğrudan yazmanın bir faydası yoktur ve dosyayı bir şekilde bazı güvenlik sorunlarına maruz bırakabilir.

Bir komut dosyası (örneğin bir bashdosya) yazılabilir olabilir, çünkü temelde bir metin dosyasıdır, fakat bildiğim kadarıyla aslında hiçbir yazmanın gerekmediği derlenmiş bir dosya için neden aynıdır?

Geri bildiriminiz için şimdiden teşekkür ederiz.


6
Sadece netleştirmek için, kullanıcının neden rootbir ikili dosyaya yazma izni olduğunu merak ediyor musunuz? Başka bir şey değilse, bu paketi yükseltirken yardımcı olacaktır.
Eric Renouf

5
İronik olarak ikili dosyaların, normalde doğrudan diske yazdığımız / düzenlediğimiz tek dosya olduğunu unutmayın. Bunu komut dosyaları gibi metin dosyaları ile yapamayız, çünkü metin değişiklikleri dosyaya yazmayı değil, dosyanın ortasına fazla bayt eklemeyi veya dosyanın ortasındaki baytları silmeyi içerir. Bu fseek fwrite ile yapmak mümkün değildir. Yani normalde RAM'e okuduğumuz metin dosyaları için eski dosyayı silin ve RAM içeriğini diske yazın (yani üzerine yazıyoruz). Ayrıca, çalıştırılabilir dosyaları yüklediğinizde, taşıdığınızda veya değiştirdiğinizde, diske yazıyorsunuz, böylece yazma izniniz var.
Slebetman

1
@slebetman: Doğrudan metin dosyalarını düzenleyebilirsiniz. Örneğin, dosyayı açın, genişletin, hafıza haritasını çıkarın, memmove()son parçayı sonuna kadar taşımak ve bir delik açmak için kullanın, sonra deliğe yeni bir metin yerleştirin. Veya aynısını yapmak için pread()/ dizisini kullanabilirsiniz pwrite().
Zan Lynx,

6
@EricRenouf Aslında ikili dosya yazma yetkiniz olup değil bunu içeren paketi yükseltmek için gerekli. Paket yükseltme işleminde eski ikili dosyaya yazılmaz; Aslında bu ikili çalışıyorsa bu mümkün değildir (arama yapın ETXTBSY). Bunun yerine, eski ikili dosya kaldırılır ve yeni ikili dosya aynı ada sahip yeni bir dosyaya yazılır. Dosyaların silinmesi, yalnızca içerik dizininde (yani /usr/sbin/) yazma izinleri gerektirmez .
mart

1
@ marcelm: Kesinlikle, sadece fseek ve yazma kullanmıyorsunuz, geri kalanı RAM'e tamponluyorsunuz. Ayrıca kalanı başka bir dosyaya da tamponlayabilirsiniz. Veya yeni bir dosyaya yeni içerik yazabilirsiniz. Hiçbiri, bir tür büyük arabellek olmadan metin dosyalarını genişletmenize olanak sağlar.
slebetman

Yanıtlar:


50

İçindeki dosyaların /bin(veya çalıştırılabilirlerin tutulduğu başka bir standart dizinin) kök tarafından yazılabilir olması gerçekten önemli değildir. Kullandığım bir Linux sunucusunda, kök tarafından yazılabilir, ancak OpenBSD makinemde değil.

Grup tarafından veya "öteki" tarafından yazılabilir olmadıkları sürece!

Örneğin güvenlik sorunu yoktur.

-rwxr-xr-x 1 root root 126584 Feb 18  2016 /bin/ls

Biri üzerine yazmak istiyorsa, kök olmak zorunda kalacak ve eğer rootve üzerine yazmaksa, o zaman

  1. yeni bir sürüm yüklemek veya
  2. sakar
  3. Kök izinleri zaten olan bir saldırgan .

Dikkate alınması gereken bir başka şey de, root korumalı olup olmadığına bakmaksızın dosyaya yazabilmesidir, çünkü ... root.

Bir "script" in bir ikili dosya kadar çalıştırılabilir olduğuna dikkat edin. Bir komut dosyasının yazılabilir olması gerekmez "çünkü bu bir metin dosyasıdır". Bir şey varsa, muhtemelen sadece aynı dizindeki diğer çalıştırılabilirlerle aynı izne sahip olmalıdır.

Artık her şeyin izinlerini değiştirmeyin! Bu, her türlü tahribata yol açabilir ve izinlerin doğru şekilde ayarlandığını doğrulayabilecek paket yöneticilerinin potansiyel olarak kafasını karıştırabilir. Güvenlik açısından kritik bir uygulamada izinleri yanlış şekilde yanlış bir şekilde değiştirirseniz, sistemi savunmasız hale getirebilir.

Yalnızca çok tuhaf görünen bir şey bulamazsanız, çalıştırılabilir dosyalar üzerindeki izinlerin doğru ayarlandığını varsayalım; bu durumda, işleri değiştirmeye başlamak yerine muhtemelen doğrulamak için ilgili paket bakımcısına başvurmalısınız.


Yorumlar ve sohbet sırasında , bazı tarihler için bir çağrı yapıldı.

Linux'ta ikili dosyalar üzerindeki izinlerin geçmişi hakkında hiçbir şey bilmediğim bir şey değil. Dizinin izinlerini veya yalnızca umaskLinux'un varsayılan değerlerinden devraldıklarını iddia edebilirler , ancak gerçekten bilmiyorum.

Bildiğim şey, OpenBSD’nin binary’leri varsayılan olarak 555 izin moduyla ana sisteme 1 kurmasıdır ( -r-xr-xr-x). Bu Makefile fragmanı belirtilen yılında /usr/share/mk/bsd.own.mkhangi setleri BINMODEsırasıyla 555 (zaten ayarlanmış olmaması durumunda). Bu daha sonra make buildiçinde çalıştırılabilir dosyaları yüklerken kullanılır /usr/src.

Bu dosya için eklenmiş CVS günlüğüne bir göz attım ve dosyadaki bu satırın 1995'te NetBSD'den alındığından beri değişmediğini gördüm .

NetBSD'de, dosya ilk olarak 1993'te 555'eBINMODE ayarlanmış CVS'ye yerleştirildi.

FreeBSD projesi NetBSD ile aynı dosyayı en az 1994'ten beri kullanmış gibi görünüyor ve daha sonraki bir taahhütte eski dosyaların Berkeley Yazılım Dağıtımı'nın 4.4BSD sürümünden alındığına dair bir ipucu ekliyor.

Bunun ötesinde , Berkeley'deki CSRG , kaynakları SCCS'de tuttu, ancak depoları GitHub 2'deki Git formunda mevcut . Buradaki adli tedaviyi verdiğimiz dosya, 1990'da Keith Bostic (veya ona yakın olan biri) tarafından yapılmış gibi görünüyor .

Demek bu hikaye. Sebebini istiyorsan, sanırım Keith'a sormamız gerekecek. " Bunun 555 olması gerektiği için ... " diyen bir değişikliğe bağlılık mesajı görmeyi umuyordum , ama hayır.

1 BSD sistemleri, Linux'tan daha "temel sistem" ve "3. parti paketler" (portlar / paketler) olarak daha katı bir bölüme sahiptir. Temel sistem, işletim sistemi çalıştırmak için komple bir tesis seti sağlarken, portlar veya paketler "yerel yazılım" olarak görülür ve altına kurulur /usr/local.

2 70'lerden sonraki Unix sürümlerinin daha kapsamlı bir GitHub deposu da mevcuttur .


1
Cevabınız için teşekkür ederim. Yazma izni normaldir, çünkü root kullanıcısı olmanın bir önemi yoktur (her şeyi yapabilir). Ancak, gerçekten önemli olmadığı için, baştan beri aynı olması durumunda neden yazma izni vermiyoruz? Keyfi karar mı?
t1m0th33

1
@ t1m0th33 Birinin vermiş olduğu keyfi bir karar olduğuna inanıyorum, evet. Dediğim gibi, OpenBSD sistemimde bu konumlardaki dosyalar tarafından yazılabilir değil root.
Kusalananda

1
Kimsenin bilinçli bir karar olduğunu sanmıyorum. Paket yöneticisi, dosyayı derleme işlemi sırasında sona erdirdikleri izin bitleriyle yüklemeyi varsayılan yapar; o Eğer 777 den izin maskesini çıkarmak ne olsun, ve (OS satıcısının inşa makinelerde) Umask kökü nedeniyle bağlayıcı bina izinleri 755 ile dosya oluşturdu iken 022 için varsayılan umask çünkü bina 022 iken vardı herkes ve yapımı Kök anlamsız ek iş için 222 olurdu.
Henning Makholm

8
+1 "Artık her şeyin izinlerini değiştirmeyin!" Ben kullanıcı yaptım Ubuntu Ask o gibi pek çok soru bkz chmod -R üzerinde /usrveya /varonların - ve sürpriz sudoçalışmıyor veya başka bir şey çalışmıyor.
Sergiy Kolodyazhnyy

4
Tarihsel olarak, kök için yazma izninin yokluğunun bir etkisi olmazdı (kök hiçbir şeyi chmod edebilir ve hatta gerekmeyebilir, çünkü kök hiçbir zaman açık veya yazarken bir EPERM almaz). Bu 555 işinin aslında kök sınırlandırılmasının mümkün olduğu için başladığını merak ettim (güvenlik sınıfları ilk ne zaman ortaya çıktı? 4.4BSD veya erken 386BSD / NetBSD ile aynı saatlerde?)
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.