Üzerinde strace
okuma izni olmayan bir yürütülebilir dosya kullanırken Ubuntu 14.04 üzerinde bazı şaşırtıcı davranış buldum . Bunun bir hata olup olmadığını veya bazı standartların bu belirsiz davranışı zorunlu kıldığını merak ediyorum.
İlk olarak, arka planda sıradan bir yürütülebilir dosya başlattığımda ve ona eklediğimde ne olacağını görelim. Beklendiği gibi bu işe yarıyor:
$ /bin/sleep 100 &
[2] 8078
$ strace -p 8078
Process 8078 attached
restart_syscall(<... resuming interrupted call ...>
Sonra ben üzerinde hiçbir okuma izinleri olan bir çalıştırılabilir ile deneyin:
---x--x--x 1 root root 26280 Sep 3 09:37 sleep*
Bu çalışan işleme eklenmesine izin verilmiyor:
$ ./sleep 100 &
[1] 8089
$ strace -p 8089
strace: attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted
Bu da beklediğim şey. İşleme bir hata ayıklayıcı ekleyebilir ve etkin bir şekilde yürütülebilir dosya üzerinde bu şekilde okuma izinleri varsa, okuma izni olmadan yürütme izni vermek çok iyi olmaz.
Ancak, yürütülebilir dosyayı zaten izlenen bir işlem altında başlatırsam, bunu yapmama izin verilir:
$ strace ./sleep 100
execve("./sleep", ["./sleep", "100"], [/* 69 vars */]) = 0
brk(0) = 0x9b7a000
Bu benim için beklenmedik bir şey. Bu bir güvenlik hatası mı yoksa standart tarafından zorunlu kılan bir özellik mi?
EPERM
Den gelmek gibi get_dumpable()
çağrılabilir (böylece "dumpable" çekirdek izin damping olmadığını kontrol etmek için de kullanılabilir) __ptrace_may_access()
çağrılabilir ptrace_attach()
ile kernel/ptrace.c
.
execve
çağrılarda, işlem zaten izlenmişse, yürütülen dosyanın okuma izinlerinin tekrar denetlenmediği görülmektedir. Onun sorusu, bunun bir güvenlik hatası mı yoksa zorunlu bir özellik mi olduğu (ikincisi, hala bir güvenlik hatası olarak düşünürüm, sadece spesifikasyonun bir güvenlik hatası).