Saya menemukan beberapa perilaku mengejutkan di Ubuntu 14.04 ketika menggunakan strace
pada executable, yang saya tidak punya izin baca. Saya ingin tahu apakah ini bug, atau jika beberapa standar mengamanatkan perilaku tidak jelas ini.
Pertama mari kita lihat apa yang terjadi ketika saya memulai executable biasa di latar belakang dan melampirkannya. Seperti yang diharapkan ini bekerja:
$ /bin/sleep 100 &
[2] 8078
$ strace -p 8078
Process 8078 attached
restart_syscall(<... resuming interrupted call ...>
Selanjutnya saya coba dengan executable, yang saya tidak punya izin baca pada:
---x--x--x 1 root root 26280 Sep 3 09:37 sleep*
Melampirkan ke proses yang berjalan ini tidak diizinkan:
$ ./sleep 100 &
[1] 8089
$ strace -p 8089
strace: attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted
Ini juga yang saya harapkan. Pemberian izin eksekusi tanpa izin baca tidak akan banyak gunanya, jika saya bisa melampirkan debugger ke proses dan secara efektif telah membaca izin pada executable seperti itu.
Tetapi jika saya memulai executable di bawah proses yang sudah dilacak, saya diizinkan untuk melakukannya:
$ strace ./sleep 100
execve("./sleep", ["./sleep", "100"], [/* 69 vars */]) = 0
brk(0) = 0x9b7a000
Ini tidak terduga bagi saya. Apakah ini bug keamanan, atau apakah itu fitur yang diamanatkan oleh standar?
EPERM
tampaknya datang dari get_dumpable()
(digunakan juga untuk memeriksa apakah inti dumping diperbolehkan, sehingga "dumpable") dipanggil dari __ptrace_may_access()
menelepon dari ptrace_attach()
atas kernel/ptrace.c
.
execve
panggilan, izin baca dari file yang dieksekusi tidak diperiksa lagi jika proses sudah dilacak. Pertanyaannya adalah apakah itu bug keamanan atau fitur yang diamanatkan (jika yang terakhir, saya masih menganggapnya bug keamanan, hanya bug keamanan dari spesifikasinya).