Capsh'ı nasıl kullanırım: Minimum yeteneklerle ayrıcalıklı bir ping çalıştırmaya çalışıyorum


14

Debian Gnu / Linux ile ilgili yetenekleri deniyorum.

/ Bin / ping komutunu şu anki çalışma dizinime kopyaladım. Beklendiği gibi çalışmıyor, başlangıçta setuid kökü idi.

Daha sonra pingimi asgari yetenekleri (root değil) vererek veriyorum sudo /sbin/setcap cap_net_raw=ep ./pingve pingim beklendiği gibi çalışıyor.

Sonra sudo /sbin/setcap -r ./pingbu yeteneği iptal etmek. Şimdi beklendiği gibi çalışmıyor.

Şimdi ping'i kullanmaya çalışıyorum capsh.

capsh hiçbir ayrıcalık vardır, bu yüzden kök olarak çalıştırmak gerekir, ama sonra kök ve böylece diğer tüm ayrıcalıkları bırakın.

Ben de ihtiyacım olduğunu düşünüyorum secure-keep-caps, bu belgelenmemiştir capsh, ancak yetenek kılavuzundadır. Biraz rakam aldım /usr/include/linux/securebits.h. Doğru görünüyorlar, çünkü çıktıların --printbu bitlerin doğru olduğunu gösteriyor.

Saatlerdir uğraşıyorum, şimdiye kadar buna sahibim.

sudo /sbin/capsh --keep=1 --secbits=0x10 --caps="cap_net_raw+epi" == --secbits=0x10 --user=${USER} --print -- -c "./ping localhost"

Bununla birlikte pinghatalar ping: icmp open socket: Operation not permitted, bu özelliği olmadığında olan şeydir. Ayrıca --printşovlar Current: =p cap_net_raw+i, bu ihtiyacımız yok e.

sudo /sbin/capsh --caps="cap_net_raw+epi" --print -- -c "./ping localhost"bunu Current: = cap_net_raw+eipdoğru ayarlayacaktır , ama bizi olarak bırakır root.

Düzenleme-1

Şimdi denedim sudo /sbin/capsh --keep=1 --secbits=0x11 --caps=cap_net_raw+epi --print -- -c "touch zz; ./ping -c1 localhost;"

Bu aşağıdakileri üretir:

touch: cannot touch `zz': Permission denied
ping: icmp open socket: Operation not permitted

İlk hata şu şekilde bekleniyor: secure-noroot: yes İkincisi değilCurrent: = cap_net_raw+eip

Düzenleme-2

Daha ==önce koyarsam --print, şimdi gösterir Current: = cap_net_raw+i, böylece önceki hatayı açıklar, ancak neden kökten çıkarken kapasitemizi kaybettiğimizi değil, bunu secure-keep-capsdüzeltmeliyim.

Düzenleme-3

Görebildiğim kadarıyla exec çağrıldığında Etkili (e) ve İzin Verilen (p) değerlerini kaybediyorum. Bu beklenir, ancak güvenli tutma kapaklarının kaybolmalarını durdurması gerektiğini düşündüm. Bir şey mi kaçırıyorum?

Düzenleme-4

Daha fazla araştırma yapıyorum ve kılavuzu tekrar okuyorum. Normalde eve pyetenekler şu durumlarda kaybolur gibi görünüyor : kullanıcıdan geçiş yaptığınızda root(veya uyguladığınızda secure-noroot, kök kökünü normal bir kullanıcı yaptığınızda), bu geçersiz kılınabilir secure-keep-caps; aradığınızda exec, söyleyebildiğim kadarıyla bu bir değişmez.

Anlayabildiğim kadarıyla, bu kılavuza göre çalışıyor. Söyleyebildiğim kadarıyla yararlı bir şey yapmanın bir yolu yok capsh. Anlayabildiğim kadarıyla, yetenekleri kullanmak için: dosya yeteneklerini kullanmak veya kullanmayan yeteneklere duyarlı bir programa sahip olmak exec. Bu nedenle ayrıcalıklı bir paketleyici yok.

Şimdi sorum ne eksik olduğum, ne capshiçin.

Düzenleme-5

Ortam yeteneklerine bir cevap ekledim. Belki capshde devralınan yeteneklerle kullanılabilir, ancak yararlı olması için bunların yürütülebilir dosyada ayarlanması gerekir. Capsh'ın ortam özellikleri olmadan nasıl faydalı bir şey yapabileceğini veya miras alınan yeteneklere izin veremiyorum.


sürümleri:

  • capshpaket libcap2-binversiyonundan1:2.22-1.2
  • edit-3'ten önce en son sürümü capshaldım git://git.debian.org/collab-maint/libcap2.gitve kullanmaya başladım.
  • uname -a Linux richard-laptop 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/Linux Kullanıcı-arazi 32bit.

1
Lekensteyn'in örneğini daha sonraki bir yukarı akış sürümüyle denediniz mi? Alma capshcollab-Maint repo “son” teşekkür vermezdim capsh, Debian paketi hala ortam yetenekleri desteklemez. Memba 2.27 yapar.
Stephen Kitt

1
@StephenKitt bilmek güzel, ama asıl soru capshortamın yokluğunda (başlangıçta olduğu gibi) kullanımının ne olduğudur . Neyi kaçırıyorum. Bir faydası olmalı.
ctrl-alt-delor

Yanıtlar:


12

Yetenekler süreçlerin özellikleridir. Geleneksel olarak üç set vardır:

  • İzin verilen yetenekler ( p ): mevcut işlemde "etkinleştirilebilen" yetenekler.
  • Etkili yetenekler ( e ): mevcut süreçte kullanılabilen yetenekler.
  • Devralınabilen yetenekler ( i ): devralınabilecek dosya yetenekleri.

Kök olarak çalışan programların her zaman izin verilen ve etkili yetenekleri vardır, bu nedenle daha fazla yetenek eklemek "fark edilir" bir etkiye sahip değildir. (Devralınabilen yetenekler seti normalde boştur.) setcap cap_net_raw+ep pingBu özellikleri, bu programı çalıştıran herhangi bir kullanıcı için varsayılan olarak etkinleştirirsiniz.

Ne yazık ki bu yetenekler yürütülen dosyaya bağlıdır ve yeni bir alt işlem yürütüldükten sonra korunmaz. Linux 4.3 , yeteneklerin alt süreçler tarafından miras alınmasına izin veren Ortam yeteneklerini tanıttı . (Ayrıca bkz execve () sırasında yetenekleri Dönüşüm içinde ) yetenekleri (7 ).

Yeteneklerle oynarken şu tuzaklara dikkat edin:

  • Temizlenir, etkili olmayan köküne kökünden kullanıcıyı değişen ve yetenekleri izin zaman (bkz yetenekleri üzerinde kullanıcı kimliği değişikliklerin etkisi de yetenekleri (7) ). Setlerin temizlenmesini önlemek için --keep=1seçeneğini kullanabilirsiniz capsh.
  • Kullanıcı veya grup kimlikleri değiştirilirken ayarlanan ortam özellikleri temizlenir. Çözüm: kullanıcı kimliğini değiştirdikten sonra , ancak bir alt işlem gerçekleştirmeden önce ortam özelliklerini ekleyin .
  • Bir özellik yalnızca ayarlanan hem izin verilen hem de devralınabilen özelliklerde bulunuyorsa ayarlanan ortam özelliklerine eklenebilir.

capshLibcap 2.25 den programının henüz ortam yetenekleri değiştirme yeteneğine sahip değildir, ancak daha sonra bültenleri yeni seçenekler ekler. Seçenek sırasının önemli olduğunu unutmayın. Örnek kullanım:

sudo capsh --caps="cap_net_raw+eip cap_setpcap,cap_setuid,cap_setgid+ep" \
    --keep=1 --user=nobody --addamb=cap_net_raw -- \
    -c "./ping -c1 127.0.0.1"

İpucu: --printseçeneği capshkomut satırında herhangi bir yere ekleyebilir ve mevcut yetenek durumunu görebilirsiniz.

Not: cap_setpcapiçin gereklidir --addambiken cap_setuid,cap_setgidiçin gerekli olan --userseçeneği.


6

Lekensteyn'in cevabı doğru ve eksiksiz görünüyor, ancak ortam yeteneklerinin çözdüğü sorunu vurgulamaya çalışacak farklı bir açıdan başka bir açıklama sağlamaya çalışacağım.

Çalıştırdığınızda sudo capsh --user=<some_user> --, yeteneklerin yeniden hesaplanmasına (ve potansiyel olarak düşürülmesine) neden olan 2 sistem ilgi çağrısı vardır:

  1. setuid: Göre man capabilities:

SECBIT_KEEP_CAPS Bu bayrağın ayarlanması, bir veya daha fazla 0 UID'ye sahip bir iş parçacığının, tüm UID'lerini sıfır dışında bir değere geçirdiğinde yeteneklerini korumasına olanak tanır. Bu bayrak ayarlanmazsa, böyle bir UIDswitch iş parçacığının tüm yeteneklerini kaybetmesine neden olur.

Başka bir deyişle, capshyukarıdaki komutumuzda, setuidsistem çağrısı sırasında SECBIT_KEEP_CAPS ayarının yapıldığından emin olmamız gerekir . Aksi takdirde tüm yetenekler kaybolur. İşte böyle --keep=1yapar. Şimdi komutsudo capsh --user=<some_user> --keep=1 --

  1. execve: Kullandığımız takdirde --keep=1seçeneği, tüm yetenek setleri korunur (etkili, kalıtımsal, izin) kadarexecve ancak sistem çağrısı execveyanı (kök olmayan kullanıcılar için) yeniden hesaplanması yetenekleri neden olur ve çok açık olmayan bir şekilde. Kısacası, ayarlanan ortam özelliklerinin eklenmesinden önce, bir execvegörüşmeden sonra bir evrenin "izin verilen" bölümünde yer alma özelliğinin olması için :

    • Dosya, "izin verilen" kümesinde bu özelliğe sahip olmalıdır . Bu ile yapılabilir setcap cap_net_raw+p /bin/bash. Bunu yapmak, ipliğin yetenek kümelerinin (sınırlayıcı kümenin dışında) artık bir etkisi olmadığından tüm egzersizi işe yaramaz hale getirir.
    • Hem dosya hem de iş parçacığı "devralınabilen" kümelerinde bu özelliğe sahip olmalıdır . Bunun setcap cap_net_raw+ihile yapacağını düşünebilirsiniz, ancak execvebir iş parçacığının ayrıcalıklı olmayan kullanıcılar tarafından çağrıldığında (şu anda teşekkür ediyoruz setuid) bir iş parçacığının ayrıcalıklı izinlerinin bırakılmasına neden olduğu ortaya çıkıyor . Dolayısıyla, bu koşulu ayrıcalıklı bir kullanıcı olarak karşılamanın bir yolu yoktur.

Linux 4.3 tanıtılan Ortam yetenekleri sayesinde bir iplik bile sonra yeteneklerini korumak için yapmak setuidbir takip ayrıcalığı olmayan bir kullanıcı için execve, dosya yeteneklerine güvenmek zorunda kalmadan.


2

Çekirdekte bir hata / özellik olabilir. Bazı tartışmalar oldu:

Bir şey yapıldıysa, düzeltmek için hiçbir fikrim yok.

Beni yanlış anlamayın - mevcut davranış güvenlidir. Ancak o kadar güvenlidir ki, işe yaraması gereken şeylerin önüne geçer.

Düzenleme: http://man7.org/linux/man-pages/man7/capability.7.html göre yeni bir yetenek ortamı (Linux 4.3 beri) ayarlayın. Bu, neyin gerekli olduğuna izin verecek gibi görünüyor.

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.