Bir komut dosyası çalıştırılabilir olabilir ancak okunabilir değil mi?


65

Okumak için izin yoksa bir betiği çalıştırmak mümkün mü? Kök modunda, bir komut dosyası yaptım ve diğer kullanıcının bu komut dosyasını çalıştırmasını ancak okumasını istemiyorum. Yaptığım chmodreddedildi: ancak kullanıcı modunda, ben diyor mesajı gördüm, okuma yazma ama yürütmek izin korusun için.


Yanıtlar:


68

Sorun komut yorumlayıcı (çalıştıran ne değildir, ama olmasıdır bash, perl, pythonvs.). Ve tercümanın senaryoyu okuması gerekiyor. Bu, programın lstercümanın yapacağı gibi doğrudan çekirdeğe yüklenmesi gibi bir "normal" programdan farklıdır . Çekirdeğin kendisi program dosyasını okuduğundan, okuma erişimi konusunda endişelenmenize gerek yoktur. Tercümanın komut dosyasını okuması gerekir, çünkü normal bir dosyanın okunması gerekir.


2
Evet ama onun durumunda bir çözüm var mı?
Olivier Pons

13
Bir olasılık, betiği yerleştiren ve tercümanı açıkça çağıran basit bir C programına sahip olmak olabilir. AC programının yürütmek için okuma iznine sahip olması gerekmez.
Arcege

1
Açıkçası, çekirdek bu durumda ayrım yapmaz ve bu edecektir (çalıştırılabilir dosya bir ikili olsaydı aynı şekilde) aslında kabuk çalıştırın. Ancak, giriş dosyasını (komut dosyası içeriği) okuyamadığından kabuğun kendisi hemen çökecektir .
Jozef

34

Bu sadece ikili dosyalar için mümkündür.

$ chown foo:foo bar
$ chmod 701 bar

Ayrıcalıklı kullanıcı olarak:

$ ls -lha bar
-rwx-----x 1 foo foo 7.0K 2012-03-15 03:06 bar

$ cat bar
cat: bar: Permission denied

$ ./bar
baz

Şimdi, işte vuruş! Dosya geleneksel yollarla okunamıyor olsa da, dosyayı okumayı gerçekten engelleyemezsiniz. Bu aslında http://smashthestack.org/ (seviye 13) için bir meydan okumadır . hktraceKullanarak dosyayı okumanıza izin veren iyi bilinen bir yardımcı program vardır ptrace.


Çok ilginç (hktrace).
fthinker

1
Kabuk komut dosyasını ikili biçime dönüştürmek mümkün mü?
ashim

4
Aslında, bunu önleyebilirsin sanırım. Şu anki linux çekirdeği sürümleri işlemi çöpe atılamaz olarak ayarladı; yani, kullanıcının ikili bilgiyi okumasına izin verilmiyorsa, normal kullanıcının artık kullanamayacağı anlamına gelir.
14:49

6

Bu mümkün değil, en azından Linux'ta (diğer Unices buna izin verebilir); düşünün, senaryoyu çalıştırdığınızda, kabuğun ne yapacağını bilmek için onu okuması gerekir.


3
Bu kesinlikle mümkün; OpenBSD, herhangi bir komut dosyasının okuma izni olmadan yürütülmesine izin verir. Başlık altında, tercümanın kullanması için kopya bir dosya tanımlayıcısı oluşturarak bunu yapar.
eradman

@eradman Bir içine (bir örnek, açıklama ve benim bazı açıklamalar ile birlikte) o koyduk cevap .
mosvy

3

Sanırım bunu birlikte yapabilirsin setuid.

Bunun dışında çoğu kişi (görünüşe göre) setuiddevre dışı bıraktığı için yapamazsınız çünkü bu büyük bir güvenlik açığıdır. Benim için devre dışı bırakıldı, bu yüzden aslında bu cevabın işe yarayacağını bilmiyorum, yine de gönderiyorum çünkü olması gerektiğini düşünüyorum .

Neyse, ne yapmak istediğinizi yapmak isteseydim - ve setuidsenaryolar için etkin olan bir sorunum olsaydı - şöyle bir şey yapardım:

$ chmod 700 myscript
$ cat > myscript-nonroot
#!/bin/sh
bash myscript
^D
$ sudo chown root:root myscript-nonroot
$ sudo chmod 4755 myscript-nonroot # make SURE this isn't world-writable!

Söylemek istediğim, tek amacı root salt okunur betiği çağırmak, root'un sahipliğini değiştirmek ve setuid izni vermek olan tek bir komut dosyası yazacağım. (Görevli olan herkesin yazamayacağı durumla birlikte.)

MyScript-nonroot işlevi herkes tarafından okunabildiğinden okunabilir ve çalıştırılabilir ve iki kez komut dosyası çalıştırdığınız satırın ( bash myscript) çalıştırıldığı zaman, root (ya da istediğiniz kişi, tam kullanıcı) olarak çalıştırılır. sarmalayıcı dosyası aynı kullanıcıya ait olduğu sürece farketmez.)


4755 ne anlama geliyor? Bu konuda yeniyim, bu yüzden ne anlama geldiğini bilmek istiyorum. 755 bölümünü anlıyorum. Teşekkürler
Kevdog777

2
4setleri setuid bit. Manpagez'deki chmod man sayfasındaki Modes bölümüne bakın .
quodlibetor

Tamam, hala tam olarak anlamıyorum, ama 755biraz anlamak biraz zaman aldı.
Kevdog777,

evet, aslında chmod 7550775 sekizlikten aynıdır. Bu konuda çok fazla kafa karışıklığı var .. Bu sayfa ( manpagez.com/man/1/chmod ) anlayamadığım korkunç ve açılmamış bir yatay kaydırma var ...
erm3nda

2

Önceki ifadelerin yarısı gerçeği var. Bir komut dosyasını kullanıcı tarafından okunabilecek şekilde değil, yine de çalıştırılabilir şekilde ayarlayabilirsiniz. İşlem biraz çizildi, ancak / etc / sudoer içinde bir istisna yaparak kullanıcının bir şifre sormadan geçici olarak betiğini kendiniz çalıştırabilmesi mümkün. Bu yöntem: - diğer dağıtımlar için setuid yamanın etrafından dolaşır. - Kullanıcıya herşeyin sudo haklarını vermeden belirli bir komut dosyası için geçici olarak yüksek izinler vermenizi sağlar.

Bu gönderideki talimatı izleyin: Yalnızca dosya izni yürütme


1

Bu durumda bir NOPASSWD seçeneğiyle sudo kullandım, böylece kullanıcılar betiği okuyamadan çalıştırabiliyorlardı.


0

OpenBSD üzerinde çalışıyor

Zaten belirtildiği gibi açıklama @eradman tarafından bu OpenBSD'deki mümkündür.

Kök olarak:

hzy# cat <<'EOT' >/tmp/foo; chmod 001 /tmp/foo
#! /bin/sh
: this is secret
echo done
EOT

Düzenli bir kullanıcı olarak:

hzy$ cat /tmp/foo
cat: /tmp/foo: Permission denied
hzy$ /tmp/foo
done

Bu /dev/fd/3, tercümana (veya senaryodaki açık kod ne olursa olsun) geçerek çalışır . Bu hile olur değil Linux üzerinde çalışmak /dev/fd/Nhangi bir dönüş özel karakter cihaz değildir dup(2)açıldı fd, ancak sıfırdan dosyayı açmak özgün dosya / dentry için "sihirli" sembolik bağ, [1]. Bu olabilir Serbest / NetBSD veya Solaris uygulanacak ...

Ama olması gereken bu değil

Temel olarak x(yürütme) izin vermek, aynı zamanda rshebang [2] olan herhangi bir dosyada (okuma) izin vermek anlamına gelir :

hzy$ cat /tmp/foo
cat: /tmp/foo: Permission denied
hzy$ ktrace -ti /tmp/foo
done
hzy$ kdump | tail -n8
 70154 sh       GIO   fd 10 read 38 bytes
       "#! /bin/sh
        : this is secret
        echo done
       "
 70154 sh       GIO   fd 1 wrote 5 bytes
       "done

ktracetek yol değil; tercüman perlveya benzeri dinamik olarak çalıştırılabilir bir çalıştırılabilir ise , işlevi geçersiz kılan pythonbir LD_PRELOADed-hack bunun read(2)yerine kullanılabilir.

Ve hayır, setuid yapmak, düzenli bir kullanıcının içeriğini görmesini engellemez; basitçe altından geçebilir ptrace(2), bu da setuid bitlerinin göz ardı edilmesine neden olur:

Kök olarak:

hzyS# cat <<'EOT' >/tmp/bar; chmod 4001 /tmp/bar
#! /bin/sh
: this is secret
id
EOT

Düzenli bir kullanıcı olarak:

hzyS$ ktrace -ti /tmp/bar
uid=1001(duns) euid=0(root) gid=1001(duns) groups=1001(duns)
hzyS$ kdump
    ... nothing, the kernel disabled the ktrace ...
hzyS$ cc -Wall -xc - -o pt <<'EOT'
#include <unistd.h>
#include <sys/types.h>
#include <sys/ptrace.h>
#include <sys/wait.h>
#include <signal.h>

int main(int ac, char **av){
        int s; pid_t pid;
        if((pid = fork()) == 0){
                ptrace(PT_TRACE_ME, 0, 0, 0);
                execvp(av[1], av + 1);
        }
        while(wait(&s) > 0 && WIFSTOPPED(s)){
                s = WSTOPSIG(s);
                ptrace(PT_CONTINUE, pid, (caddr_t)1, s == SIGTRAP ? 0 : s);
        }
}
EOT
hzyS$ ./pt ktrace -ti /tmp/bar
uid=1001(duns) gid=1001(duns) groups=1001(duns)
hzyS$ kdump | tail -5
 29543 sh       GIO   fd 10 read 31 bytes
       "#! /bin/sh
        : this is secret
        id
       "

(üzgünüm, bunu göstermek için en basit yöntem değilse)

[1] bu Linux kullanarak öykünebilir binfmt_misc, ancak tercüman değiştirilmeli veya bir sarıcı kullanılmalıdır; Kasten gülünç güvensiz yapılan bir örnek için bu cevabın son bölümünü görün .

[2] veya genel olarak, execve()geri dönüşü olmayacak herhangi bir dosya ENOEXEC.


-2

Evet, root kullanıcısıysanız, dosyayı okuma izni olmadan çalıştırabilirsiniz.

# echo "echo hello" > test
# chmod 100 test
# ll test
---x------ 1 root root 10 Nov 29 12:13 test
# ./test
hello

Ancak başka bir kullanıcıyla giriş yaparsanız, bu dosyayı çalıştıramazsınız

$ ./test
-bash: ./test: Permission denied

3
Bu gerçekten soruyu cevaplamıyor, çünkü root hala izinsiz bile dosyayı okuyabilir.
wjandrea

-5

Komut dosyalarınızı okunamaz durumda ancak yürütülebilir duruma getirmek için 3 ana seçeneğiniz vardır:

İlk seçenek

Elle şifrelemek için openssl komutunu kullanın. Gelecekte, senaryoyu çalıştırmak istediğinizde, openssl komutunu tekrar elle çalıştırmanız ve şifresini çözmek için şifreyi sağlamanız gerekir.

Openssl ile şifreleme:

yourscript.sh Instagram Hesabındaki Resim ve Videoları yourscript.sh openssl aes-128-cbc -a -salt -k parolanız> yourscript.enc

Openssl ile şifre çözme:

yourscript.enc Instagram Hesabındaki Resim ve Videoları yourscript.enc openssl aes-128-cbc -a -d -salt -k parolanız> yourscript.dec

yourscript.dec, asıl betiğinizle aynı olacaktır.

İkinci seçenek

Komut dosyanızı otomatik olarak şifrelemek ve komut dosyasının şifreli sürümünü çalıştırılabilir yapmak için www.Enscryption.com gibi bir site kullanın . Bu site, davetsiz misafirlerin betiğinize göz atmasını veya gizlemek istediğiniz sırları açığa çıkarmayı oldukça zorlaştırmak için openssl şifreleme yeteneklerini ve diğer bazı gizleme yöntemlerini kullanır. Bu site ile kabuk komut dosyalarını ve komut satırı perl, python, ruby ​​komut dosyalarını şifreleyebilirsiniz. Ben de php düşünüyorum.

Üçüncü seçenek

Shc gibi bir araç kullanın . 2012'den beri güncellenmemiş gibi görünüyor. Ama geçmişte kullandım. Komut dosyanızı kullanmak istediğiniz her işletim sistemi için, işletim sistemi derlerken kullandığınızdan farklıysa derlemeniz gerekir.

Özet:

Kodunuzu gizlemeniz sizin için çok önemliyse, yalnızca izinlere ve sahipliğe güvenmek size yardımcı olacaktır, çünkü root olan herkesin kullanabileceği şekilde. Bu sadece bir gerçek. Yapabilecekleriniz, gerçekten yapmak istiyorsanız, kodunuzun herhangi biri tarafından yetkisiz görünmesini engellemek istiyorsanız openssl komutunun çevresine bir komut dosyası yazmaktır. Böylece, komut dosyası çalıştırılmadan önce, bir şifre ister ve şifre verildikten sonra, dosyayı geçici bir dosyaya yazmadan çalıştırır. Bu çok fazla iş gibi geliyorsa, seçenek 2 ve 3'ün amaçlarınız için yeterli olması gerekir.


"Shc" bağlantısı ayrıca öncekinden bir sayfaya işaret eder. Bu sayfa / hizmete bağlı herhangi bir şansınız var mı?
phk

3
Komut dosyanızı şifrelerseniz, anahtar olmadan çalıştırılamaz. Anahtarı çalıştırmak için kullanıcıya gönderirseniz, içeriğini görebilir. Bu kuleler çok aptal ...
erm3nda
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.