এটি ওপেনবিএসডি-তে কাজ করে
ইতিমধ্যে @ ইরাদম্যানের একটি মন্তব্যে যেমনটি উল্লেখ করা হয়েছে , ওপেনবিএসডি তে এটি সম্ভব।
মূল হিসাবে:
hzy# cat <<'EOT' >/tmp/foo; chmod 001 /tmp/foo
#! /bin/sh
: this is secret
echo done
EOT
নিয়মিত ব্যবহারকারী হিসাবে:
hzy$ cat /tmp/foo
cat: /tmp/foo: Permission denied
hzy$ /tmp/foo
done
যে পাসিং করে কাজ করে /dev/fd/3
ব্যাখ্যাকারী (বা যাই হোক না কেন স্ক্রিপ্ট খোলা FD যায়)। এই কৌশলটি লিনাক্সে কাজ করবে না , যেখানে /dev/fd/N
বিশেষ অক্ষরের ডিভাইস নেই dup(2)
যা খোলার সাথে সাথে এফডির কোনও ফিরিয়ে দেয় না, তবে "ম্যাজিক" মূল ফাইল / ডেন্ট্রির সাথে যুক্ত হয়, যা স্ক্র্যাচ থেকে ফাইলটি খোলে [1] এটি ফ্রি / নেটবিএসডি বা সোলারিসে প্রয়োগ করা যেতে পারে ...
তবে এটি যা ফাটল তা নয়
মূলত x
(সম্পাদন) অনুমোদনের অর্থ হ'ল r
শেবাং রয়েছে এমন কোনও ফাইলের (পড়ার) অনুমতি প্রদান [2]:
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
একমাত্র উপায় নয়; যদি দোভাষী গতিসম্পন্নভাবে এক্সিকিউটেবলের মতো সংযুক্ত থাকে perl
বা python
, একটি LD_PRELOAD
এড হ্যাক যা read(2)
ফাংশনটিকে ওভাররাইড করে তার পরিবর্তে ব্যবহার করা যেতে পারে।
এবং না, সেটআপ করে দেওয়া কোনও নিয়মিত ব্যবহারকারীকে এর সামগ্রী দেখতে বাধা দেয় না; তিনি কেবল এটির অধীনে চালাতে পারতেন ptrace(2)
, যার ফলে সেটুইড বিট উপেক্ষা করা হবে:
মূল হিসাবে:
hzyS# cat <<'EOT' >/tmp/bar; chmod 4001 /tmp/bar
#! /bin/sh
: this is secret
id
EOT
নিয়মিত ব্যবহারকারী হিসাবে:
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
"
(দুঃখিত, এটি প্রদর্শন করার জন্য এটি যদি সবচেয়ে সোজা উপায় না হয়)
[1] এটি ব্যবহার করে লিনাক্সে অনুকরণ করা যেতে পারে binfmt_misc
, তবে দোভাষীকে সংশোধন করতে হবে, বা একটি মোড়ক ব্যবহার করতে হবে; ইচ্ছাকৃতভাবে হাস্যকরভাবে সুরক্ষিত করা একটি উদাহরণের জন্য এই উত্তরের শেষ অংশটি দেখুন ।
[2] বা সাধারণভাবে, কোনও ফাইল যার ফলে execve()
ফেরত আসবে না ENOEXEC
।