Linux bayrağında yürütme bayrağını geri gönderme Bu neden mümkün?


23

Okuma iken bu , ben şu istismar bulundu:

% cp /usr/bin/id ~
% chmod -x ~/id
% ls -al ~/id
-rw-r--r-- 1 edd edd 22020 2012-08-01 15:06 /home/edd/id
% ~/id
zsh: permission denied: /home/edd/id
% /lib/ld-linux.so.2 ~/id
uid=1001(edd) gid=1001(edd) groups=1001(edd),1002(wheel)

Bu kod parçası, dosya sisteminin yürütme izinlerini normal bir ayrıcalıklı kullanıcı olarak önemsiz bir şekilde kaldırabileceğimizi gösterir. Bunu bir Ubuntu 12.04'te koştum.

Linux yükleyici, dosyaya (1) göre paylaşılan bir nesne iken, aynı zamanda doğrudan çalıştırılmasını sağlayan bir giriş noktasına sahiptir. Bu şekilde çalıştırıldığında, Linux yükleyici ELF ikili dosyaları için tercüman olarak hareket eder.

Ancak OpenBSD makinemde bu istismar etkili değil çünkü yükleyiciyi bir program olarak çalıştıramayabilirsiniz. OpenBSD kılavuz sayfası şöyle der: "ld.so, başlangıçta çekirdek tarafından yüklenen paylaşılan bir nesnedir."

Bunu Solaris 9'da deneyin; bir segfault alacaksınız. Başka bir yerde ne olduğundan emin değilim.

Bu yüzden benim sorularım:

  • Neden Linux yükleyici (doğrudan yürütüldüğünde) bir ELF ikili kodunu yorumlamadan önce dosya sistemi özelliklerini kontrol etmiyor ?
  • Neden bu kadar önemsiz şekilde kaldırılmıyorsa, dosyaların yürütülmesine izin vermeyen bir mekanizma uygulayın? Bir şey mi kaçırdım?

1
Sebep yok, ancak sisteminizi silmeyi başardıysanız libc(bir kez yaptım, bir Arch kutusunu yükselttim), bu küçük tuhaflığa minnettar olacaksınız.
yeni123456,

1
@ new123456 oh tanrım, bu yükseltme sonrasında IRC kanalı içinde olmak acı vericiydi.
Rob

Bu var yükleyici , değil bağlayıcı.
Monica'ya Zarar Vermeyi Durdurun

Yanıtlar:


33

Hedefi executeizni olan değil yürütülmesini önlemek için genel olarak . (1) progamlara hangi dosyaların çalıştırılması gerektiğini söylemek ve (2) setuid biti (vb.) Belirtildiğinde, ayrıcalıklı bir kullanıcı olarak çalıştırmayı önlemek .

Linker hack göründüğünden daha az bir istismardır. Daha kolay okumak için izniniz olan çalıştırılabilir olmayan dosyaları çalıştırabilirsiniz:

$ cp unexecutable_file ~/runme
$ chmod +x ~/runme
$ ~/runme

Arch Linux forumunda bu tartışmaya bakın .

Özetle:

Yürütülmesi gereken dosyaları işaretleme

Bir kabuk betiği yazdığınızda, onu yürütülebilir olarak işaretleyebilirsiniz chmod +x. Bu, kabuğunuzun çalıştırılabilir olmasını düşündüğünüze işaret eder (aksi halde tüm kabuğun bildiği gibi, sadece başka bir düz metin dosyasıdır). Sonra kabuk yazdığınızda sekme tamamlanmasında gösterebilir ./Tab.

Benzer şekilde: something.ddizinler (örn. init.d), Genellikle daemons tarafından otomatik olarak yürütülen başlatma veya kontrol kabuğu komut dosyalarını içerir. Dizine düz metin dosyası olarak bir yorum veya README dosyası koymak isteyebilirsiniz. Veya komut dosyalarından birini geçici olarak devre dışı bırakmak isteyebilirsiniz. Bunu, belirli bir dosya için yürütme bitini temizleyerek yapabilirsiniz. Bu, servise bunun üstünden atlamasını söyler.

Ayrıcalıklı yürütmeyi önleme

setuidBit araçlarının Dosyayı çalıştırmak zaman, o belirli bir kullanıcı (örneğin root) olarak yürütülür.

Forum yazısı onu iyi açıklıyor:

Bir çalıştırılabilir dosyanın bazı kullanıcılar için setuid olmasını istersiniz, ancak yalnızca belirli bir gruptaki kişilerin setuid olarak çalıştırmasını istiyorsunuz. Kopyalayarak hala yürütebilirler, ancak setuid bayrağı kaybolur, böylece orijinal dosyaya sahip olan kullanıcı yerine, kendileri gibi yürütürler.


2
Teşekkürler - Kullanıcının okuyabileceği herhangi bir dosyayı kopyalayabildiğini ve bu nedenle isteğe bağlı izinleri seçebileceğini göz ardı ettim.
Edd Barrett,

yürütme iznine sahip ancak okuma iznine sahip olmayan dosyalar?
Lie Ryan,

@LieRyan Peki ya onlar?
Monica

@BrendanLong: Belli ki bunları kopyalayamazsınız, bu yüzden izinlerini değiştiremezsiniz. (Ama neden istemesin ki, söyleyemem - yine de kopya ile yapabileceğin tek şey yürütme iznini bırakmaktır)
MSalters

9

Bir dosyaya okuma erişiminiz varsa, bir kopyasını her zaman yapabilirsiniz.

Kişisel bir kopya çıkarabiliyorsanız, bu kopyayı her zaman çalıştırılabilir olarak işaretleyebilirsiniz.

Bu, Ld-linux'un davranışını açıklamıyor, ancak bunun çok yararlı bir güvenlik boşluğu olamayacağını gösteriyor.

Daha sıkı güvenlik istiyorsanız, SELinux'u düşünün.


Bu çok doğrudur.
Edd Barrett,

Bu sadece kavramsal bir soruydu. Sanırım execec'i dosya sistemlerine de ayarlayabilirdiniz.
Edd Barrett,

2

Soruya biraz farklı bakıldığında: Mechanical Snail’in dediği gibi, bir dosyadaki yürütme izninin yürütmeyi engellemesi amaçlanmamıştır. Bununla birlikte, "noexec" dosya sistemi seçeneği, yürütmeyi engeller ve çok kolay bir şekilde atılmaz (tüm dosya sistemleri tarafından desteklenmez, ancak kesinlikle en popüler linux'lar tarafından desteklenir). Yönetici, kullanıcıların kendi programlarını çalıştırmalarını engellemek istiyorsa, home ve tmp dizinlerinde ve kullanıcıların dosya oluşturabilecekleri diğerlerinde noexec seçeneğini belirleyebilirler.

$ mount -o noexec /dev/sdd1 /test
$ cd /test
$ cp /usr/bin/id .
$ ./id
-bash: ./id: Permission denied

Anlaşılan, noexec seçeneğini, soruda bahsedilen yükleyici numarası kullanılarak atlamak mümkündü, ancak çekirdeğe birkaç versiyon geri getirildi.

itibaren http://linux.die.net/man/8/mount :

noexec

Bağlı dosya sisteminde herhangi bir ikili dosya çalıştırılmasına izin vermeyin. (Yakın zamana kadar /lib/ld*.so / mnt / binary gibi bir komut kullanarak ikili dosyaları çalıştırmak mümkün oldu. Bu numara Linux 2.4.25 / 2.6.0'dan bu yana başarısız oluyor.)

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.