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/N
hangi 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 r
shebang [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
ktrace
tek yol değil; tercüman perl
veya benzeri dinamik olarak çalıştırılabilir bir çalıştırılabilir ise , işlevi geçersiz kılan python
bir LD_PRELOAD
ed-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
.