ptrace(2) - wariua/manpages-ko GitHub Wiki
ptrace - ํ๋ก์ธ์ค ์ถ์
#include <sys/ptrace.h>
long ptrace(enum __ptrace_request request, pid_t pid,
void *addr, void *data);
ptrace()
์์คํ
ํธ์ถ์ ํ ํ๋ก์ธ์ค("์ถ์ ์(tracer)")๊ฐ ๋ค๋ฅธ ํ๋ก์ธ์ค("ํผ์ถ์ ์(tracee)")์ ์คํ์ ๊ด์ฐฐ ๋ฐ ์ ์ดํ๊ณ ํผ์ถ์ ์์ ๋ฉ๋ชจ๋ฆฌ์ ๋ ์ง์คํฐ๋ฅผ ๊ฒ์ฌ ๋ฐ ๋ณ๊ฒฝํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค. ์ค์ง์ (breakpoint) ๋๋ฒ๊น
๊ณผ ์์คํ
ํธ์ถ ์ถ์ ์ ๊ตฌํํ๋ ๋ฐ ์ฃผ๋ก ์ฐ์ธ๋ค.
๋จผ์ ํผ์ถ์ ์๋ฅผ ์ถ์ ์์ ๋ถ์ฌ์ผ ํ๋ค. ๋ถ์ด๊ธฐ์ ์ด์ด์ง๋ ๋ช ๋ น๋ค์ ์ค๋ ๋๋ณ์ด๋ค. ์ฆ, ๋ค์ค ์ค๋ ๋ ํ๋ก์ธ์ค์์ ๊ฐ ์ค๋ ๋๋ฅผ (๋ค๋ฅผ ์๋ ์๋) ์ถ์ ์์๊ฒ ๊ฐ๋ณ์ ์ผ๋ก ๋ถ์ด๊ฑฐ๋, ๋ถ์ด์ง ์๊ณ ๋๋ฌ์ ๋๋ฒ๊น ํ์ง ์์ ์ ์๋ค. ๋ฐ๋ผ์ "ํผ์ถ์ ์"๋ ํญ์ "(๋จ์ผ) ์ค๋ ๋"๋ฅผ ๋ปํ๋ฉฐ ์ ๋ "(๋ค์ค ์ค๋ ๋์ผ ์๋ ์๋) ํ๋ก์ธ์ค"๋ฅผ ๋ปํ๋ ๊ฒ ์๋๋ค. ptrace ๋ช ๋ น์ ํญ์ ๋ค์ ํํ์ ํธ์ถ์ ์ด์ฉํด ํน์ ํผ์ถ์ ์์๊ฒ ๋ณด๋ธ๋ค.
ptrace(PTRACE_foo, pid, ...)
์ฌ๊ธฐ์ pid
๋ ํด๋น ๋ฆฌ๋
์ค ์ค๋ ๋์ ์ค๋ ๋ ID์ด๋ค.
(์ฐธ๊ณ ๋ก ์ด ํ์ด์ง์์ "๋ค์ค ์ค๋ ๋ ํ๋ก์ธ์ค"๋ clone(2) CLONE_THREAD
ํ๋๊ทธ๋ก ์์ฑํ ์ค๋ ๋๋ค๋ก ์ด๋ค์ง ์ค๋ ๋ ๊ทธ๋ฃน์ ๋ปํ๋ค.)
ํ๋ก์ธ์ค๊ฐ fork(2)๋ฅผ ํธ์ถํ๊ณ ๊ทธ๋์ ์๊ธด ์์์ด (๋ณดํต) ์ด์ด์ง๋ execve(2) ์ ์ PTRACE_TRACEME
๋ฅผ ํ๊ฒ ํด์ ์ถ์ ์ ๊ฐ์ํ ์ ์๋ค. ๋๋ ํ ํ๋ก์ธ์ค๊ฐ PTRACE_ATTACH
๋ PTRACE_SEIZE
๋ฅผ ์ด์ฉํด ๋ค๋ฅธ ํ๋ก์ธ์ค ์ถ์ ์ ์์ํ ์๋ ์๋ค.
์ถ์ ๋๊ณ ์๋ ๋์ ํผ์ถ์ ์๋ ์๊ทธ๋์ด ์ ๋ฌ๋ ๋๋ง๋ค ๋ฉ์ถ๊ฒ ๋๋ค. ๋ฌด์ํ๊ณ ์๋ ์๊ทธ๋์ด๋ผ๋ ๊ทธ๋ ๋ค. (SIGKILL
์ ์์ธ์ด๋ฉฐ ํ์์์ ํจ๊ณผ๊ฐ ๊ฐ๋ค.) ์ถ์ ์๋ ๋ค์ ๋ฒ waitpid(2) ํธ์ถ์์ (๋๋ ์ ์ฌํ "wait" ์์คํ
ํธ์ถ๋ค ์ค ํ๋์์) ์๋ฆผ์ ๋ฐ๊ฒ ๋๋ค. ๊ทธ ํธ์ถ์ ํผ์ถ์ ์๊ฐ ๋ฉ์ถ ์ด์ ๋ฅผ ๋ํ๋ด๋ ์ ๋ณด๋ฅผ ๋ด์ status
๊ฐ์ ๋ฐํํ๊ฒ ๋๋ค. ํผ์ถ์ ์๊ฐ ๋ฉ์ถฐ ์๋ ๋์ ์ถ์ ์๊ฐ ๋ค์ํ ptrace ์์ฒญ์ ์ฌ์ฉํด ํผ์ถ์ ์๋ฅผ ์กฐ์ฌํ๊ณ ๋ณ๊ฒฝํ ์ ์๋ค. ๊ทธ๋ฌ๊ณ ์ ์ถ์ ์๋ ํผ์ถ์ ์๊ฐ ์คํ์ ๊ณ์ํ๊ฒ ํ๋๋ฐ, ์ ํ์ ์ผ๋ก ์ ๋ฌ๋๋ ์๊ทธ๋์ ๋ฌด์ํ๊ฒ ํ ์ ์๋ค. (๋๋ ๋ค๋ฅธ ์๊ทธ๋์ ๋์ ์ ๋ฌํ ์๋ ์๋ค.)
PTRACE_O_TRACEEXEC
์ต์
์ด ์ ์ฉ ์ค์ด ์๋๋ฉด ํผ์ถ์ ํ๋ก์ธ์ค๊ฐ execve(2) ์ฑ๊ณต ํธ์ถ ์ SIGTRAP
์๊ทธ๋์ ๋ฐ๊ฒ ๋๋ฉฐ, ๊ทธ๋์ ์ ํ๋ก๊ทธ๋จ์ด ์คํ์ ์์ํ๊ธฐ ์ ์ ๋ถ๋ชจ์๊ฒ ์ ์ด๊ถ์ ์ป์ ๊ธฐํ๋ฅผ ์ค๋ค.
์ถ์ ์๊ฐ ์ถ์ ์ ๋ง์ณค์ ๋๋ PTRACE_DETACH
๋ฅผ ํตํด ํผ์ถ์ ์๊ฐ ์ ์์ ์ธ ๋น์ถ์ ๋ชจ๋๋ก ์คํ์ ๊ณ์ํ๊ฒ ํ ์ ์๋ค.
request
๊ฐ์ด ์ํํ ํ๋์ ๊ฒฐ์ ํ๋ค.
PTRACE_TRACEME
-
์ด ํ๋ก์ธ์ค๊ฐ ๋ถ๋ชจ์ ์ํด ์ถ์ ๋ ๊ฒ์์ ๋ํ๋ธ๋ค. ๋ถ๋ชจ๊ฐ ์ถ์ ํ ์์ ์ด ์๋๋ผ๋ฉด ์ด ์์ฒญ์ ํ์ง ๋ง์์ผ ํ ๊ฒ์ด๋ค. (
pid
,addr
,data
๋ ๋ฌด์ํ๋ค.)PTRACE_TRACEME
์์ฒญ์ ํผ์ถ์ ์์์๋ง ์ฌ์ฉํ๋ค. ๋๋จธ์ง ์์ฒญ๋ค์ ์ถ์ ์์์๋ง ์ฌ์ฉํ๋ค. ์ด์ด์ง๋ ์์ฒญ๋ค์์pid
๋ ๋์ ๋์ ํผ์ถ์ ์์ ์ค๋ ๋ ID๋ฅผ ๋ํ๋ธ๋ค.PTRACE_ATTACH
,PTRACE_SEIZE
,PTRACE_INTERRUPT
,PTRACE_KILL
์ธ์ ์์ฒญ๋ค์์๋ ํผ์ถ์ ์๊ฐ ๋ฉ์ถฐ ์์ด์ผ ํ๋ค. -
PTRACE_PEEKTEXT
,PTRACE_PEEKDATA
-
ํผ์ถ์ ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์
addr
์์ ์๋๋ฅผ ์ฝ๊ณ ๊ทธ ์๋๋ฅผptrace()
ํธ์ถ์ ๊ฒฐ๊ณผ๋ก ๋ฐํํ๋ค. ๋ฆฌ๋ ์ค์์ ํ ์คํธ์ ๋ฐ์ดํฐ์ ์ฃผ์ ๊ณต๊ฐ์ด ๋ฐ๋ก ์์ง ์์ผ๋ฏ๋ก ์ด ๋ ์์ฒญ์ ํ์ฌ ๋๋ฑํ๋ค. (data
๋ ๋ฌด์ํ๋ค. ํ์ง๋ง NOTES ์ฐธ๊ณ .) PTRACE_PEEKUSER
-
ํผ์ถ์ ์ USER ์์ญ์ ์คํ์
addr
์์ ์๋๋ฅผ ์ฝ๋๋ค. USER ์์ญ์ ๋ ์ง์คํฐ๋ค๊ณผ ๊ธฐํ ํ๋ก์ธ์ค์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ค (<sys/user.h>
์ฐธ๊ณ ). ๊ทธ ์๋๋ฅผptrace()
ํธ์ถ์ ๊ฒฐ๊ณผ๋ก ๋ฐํํ๋ค. ๋ณดํต์ ์คํ์ ์ด ์๋์ ์ ๋ ฌ๋์ด ์์ด์ผ ํ์ง๋ง ์ํคํ ์ฒ์ ๋ฐ๋ผ ๋ค๋ฅผ ์๋ ์๋ค. NOTES ์ฐธ๊ณ . (data
๋ ๋ฌด์ํ๋ค. ํ์ง๋ง NOTES ์ฐธ๊ณ .) -
PTRACE_POKETEXT
,PTRACE_POKEDATA
-
์๋
data
๋ฅผ ํผ์ถ์ ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์addr
๋ก ๋ณต์ฌํ๋ค.PTRACE_PEEKTEXT
๋ฐPTRACE_PEEKDATA
์ฒ๋ผ ์ด ๋ ์์ฒญ์ ํ์ฌ ๋๋ฑํ๋ค. PTRACE_POKEUSER
-
์๋
data
๋ฅผ ํผ์ถ์ ์ USER ์์ญ์ ์คํ์ addr
๋ก ๋ณต์ฌํ๋ค.PTRACE_PEEKUSER
์ฒ๋ผ ์คํ์ ์ด ๋ณดํต์ ์๋์ ์ ๋ ฌ๋์ด ์์ด์ผ ํ๋ค. ์ปค๋์ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํ๊ธฐ ์ํด USER ์์ญ์ ๋ํ ์ผ๋ถ ๋ณ๊ฒฝ์ ํ์ฉํ์ง ์๋๋ค. -
PTRACE_GETREGS
,PTRACE_GETFPREGS
-
๊ฐ๊ฐ ํผ์ถ์ ์์ ๋ฒ์ฉ ๋ ์ง์คํฐ๋ค์ด๋ ๋ถ๋ ์์์ ๋ ์ง์คํฐ๋ค์ ์ถ์ ์ ๋ด์ ์ฃผ์
data
๋ก ๋ณต์ฌํ๋ค. ์ด ๋ฐ์ดํฐ์ ํ์์ ๋ํ ์ ๋ณด๋<sys/user.h>
๋ฅผ ๋ณด๋ผ. (addr
์ ๋ฌด์ํ๋ค.) ์ฐธ๊ณ ๋ก SPARC ์์คํ ์์๋data
์addr
์ ์๋ฏธ๊ฐ ๋ค์งํ ์๋ค. ์ฆ,data
๋ฅผ ๋ฌด์ํ๊ณ ์ฃผ์addr
๋ก ๋ ์ง์คํฐ๋ค์ ๋ณต์ฌํ๋ค. ๋ชจ๋ ์ํคํ ์ฒ์PTRACE_GETREGS
์PTRACE_GETFPREGS
๊ฐ ์๋ ๊ฑด ์๋๋ค. -
PTRACE_GETREGSET
(๋ฆฌ๋ ์ค 2.6.34๋ถํฐ) -
ํผ์ถ์ ์์ ๋ ์ง์คํฐ๋ค์ ์ฝ๋๋ค.
addr
์ด ์ํคํ ์ฒ๋ณ ๋ฐฉ์์ผ๋ก ์ฝ์ ๋ ์ง์คํฐ๋ค์ ์ข ๋ฅ๋ฅผ ๋ํ๋ธ๋ค.NT_PRSTATUS
(์ซ์ ๊ฐ 1)๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฒ์ฉ ๋ ์ง์คํฐ๋ค์ ์ฝ๊ฒ ๋ง๋ ๋ค. ์๋ฅผ ๋ค์ด CPU์ ๋ถ๋ ์์์ ๋ฐ/๋๋ ๋ฒกํฐ ๋ ์ง์คํฐ๊ฐ ์์ผ๋ฉดaddr
์ ๋์NT_foo
์์๋ก ์ค์ ํด์ ๊ทธ ๋ ์ง์คํฐ๋ค์ ๊ฐ์ ธ์ฌ ์ ์๋ค.data
๋ ๋ชฉ์ ์ง ๋ฒํผ์ ์์น์ ๊ธธ์ด๋ฅผ ๊ธฐ์ ํ๋struct iovec
์ ๊ฐ๋ฆฌํจ๋ค. ๋ฐํ ์ ์ค์ ๋ฐํ๋๋ ๋ฐ์ดํธ ์๋ฅผ ๋ํ๋ด๋๋ก ์ปค๋์ดiov.len
์ ๋ณ๊ฒฝํ๋ค. -
PTRACE_SETREGS
,PTRACE_SETFPREGS
-
๊ฐ๊ฐ ํผ์ถ์ ์์ ๋ฒ์ฉ ๋ ์ง์คํฐ๋ค์ด๋ ๋ถ๋ ์์์ ๋ ์ง์คํฐ๋ค์ ์ถ์ ์ ๋ด์ ์ฃผ์
data
์์ ์จ ๊ฐ์ผ๋ก ๋ณ๊ฒฝํ๋ค.PTRACE_POKEUSER
์ฒ๋ผ ์ผ๋ถ ๋ฒ์ฉ ๋ ์ง์คํฐ ๋ณ๊ฒฝ์ด ํ์ฉ๋์ง ์์ ์๋ ์๋ค. (addr
์ ๋ฌด์ํ๋ค.) ์ฐธ๊ณ ๋ก SPARCS ์์คํ ์์๋data
์addr
์ ์๋ฏธ๊ฐ ๋ค์งํ ์๋ค. ์ฆ,data
๋ฅผ ๋ฌด์ํ๊ณ ์ฃผ์addr
๋ก๋ถํฐ ๋ ์ง์คํฐ๋ค์ ๋ณต์ฌํ๋ค. ๋ชจ๋ ์ํคํ ์ฒ์PTRACE_SETREGS
์PTRACE_SETFPREGS
๊ฐ ์๋ ๊ฑด ์๋๋ค. -
PTRACE_SETREGSET
(๋ฆฌ๋ ์ค 2.6.34๋ถํฐ) -
ํผ์ถ์ ์์ ๋ ์ง์คํฐ๋ค์ ๋ณ๊ฒฝํ๋ค.
addr
๊ณผdata
์ ์๋ฏธ๋PTRACE_GETREGSET
๊ณผ ์ ์ฌํ๋ค. -
PTRACE_GETSIGINFO
(๋ฆฌ๋ ์ค 2.3.99-pre6๋ถํฐ) -
์ ์ง๋ฅผ ์ ๋ฐํ ์๊ทธ๋์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์จ๋ค. ํผ์ถ์ ์๋ก๋ถํฐ
siginfo_t
๊ตฌ์กฐ์ฒด(sigaction(2) ์ฐธ๊ณ )๋ฅผ ์ถ์ ์ ๋ด์ ์ฃผ์data
๋ก ๋ณต์ฌํ๋ค. (addr
์ ๋ฌด์ํ๋ค.) -
PTRACE_SETSIGINFO
(๋ฆฌ๋ ์ค 2.3.99-pre6๋ถํฐ) -
์๊ทธ๋ ์ ๋ณด๋ฅผ ์ค์ ํ๋ค. ์ถ์ ์ ๋ด์ ์ฃผ์
data
๋ก๋ถํฐsiginfo_t
๊ตฌ์กฐ์ฒด๋ฅผ ํผ์ถ์ ์๋ก ๋ณต์ฌํ๋ค. ํผ์ถ์ ์์๊ฒ ์ ์์ ์ผ๋ก ์ ๋ฌ๋์์ ๊ฒ์ด๋ฉด์ ์ถ์ ์์๊ฒ ์กํ ์๊ทธ๋์๋ง ์ํฅ์ ์ฃผ๊ฒ ๋๋ค. ์ ์์ ์ธ ์๊ทธ๋๊ณผptrace()
์์ฒด์์ ์์ฑํ ์ธ์กฐ ์๊ทธ๋์ ๊ตฌ๋ณํ๋ ๊ฒ์ด ์ด๋ ค์ธ ์๋ ์๋ค. (addr
์ ๋ฌด์ํ๋ค.) -
PTRACE_PEEKSIGINFO
(๋ฆฌ๋ ์ค 3.10๋ถํฐ) -
ํ์์ ์๊ทธ๋์ ์ ๊ฑฐํ์ง ์์ผ๋ฉด์
siginfo_t
๊ตฌ์กฐ์ฒด๋ฅผ ๊ฐ์ ธ์จ๋ค.addr
์ ๋ช ๋ฒ์งธ ์๊ทธ๋๋ถํฐ ๋ช ๊ฐ๋ ๋ณต์ฌํด์ผ ํ ์ง ์ง์ ํ๋ptrace_peeksiginfo_args
๊ตฌ์กฐ์ฒด ํฌ์ธํฐ์ด๋ค.data
๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฒํผ๋กsiginfo_t
๊ตฌ์กฐ์ฒด๋ค์ ๋ณต์ฌํ๋ค. ๋ฐํ ๊ฐ์ ๋ณต์ฌํ ์๊ทธ๋ ์๋ฅผ ๋ด๊ณ ์๋ค. (0์ ์ง์ ํ ์์น์ ํด๋นํ๋ ์๊ทธ๋์ด ์์์ ๋ํ๋ธ๋ค.) ๋ฐํ๋๋siginfo
๊ตฌ์กฐ์ฒด์si_code
ํ๋๊ฐ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก๋ ์ฌ์ฉ์ ๊ณต๊ฐ์ ๋ ธ์ถ๋์ง ์๋ ์ ๋ณด(__SI_CHLD
,__SI_FAULT
๋ฑ)๋ฅผ ํฌํจํ๋ค.struct ptrace_peeksiginfo_args { u64 off; /* ์๊ทธ๋ ๋ณต์ฌ๋ฅผ ์์ํ ํ์์์ ์์น */ u32 flags; /* PTRACE_PEEKSIGINFO_SHARED ๋๋ 0 */ s32 nr; /* ๋ณต์ฌํ ์๊ทธ๋ ๊ฐ์ */ };
ํ์ฌ ์ ์ผํ๊ฒ ์๋ ํ๋๊ทธ๋ ํ๋ก์ธ์ค๋ณ ์๊ทธ๋ ํ์์ ์๊ทธ๋์ ๊ฐ์ ธ์ค๊ธฐ ์ํ
PTRACE_PEEKSIGINFO_SHARED
์ด๋ค. ์ด ํ๋๊ทธ๊ฐ ์ค์ ๋ผ ์์ง ์์ผ๋ฉด ์ง์ ํ ์ค๋ ๋์ ์ค๋ ๋๋ณ ํ์์ ์๊ทธ๋์ ์ฝ๋๋ค. -
PTRACE_GETSIGMASK
(๋ฆฌ๋ ์ค 3.11๋ถํฐ) -
๋ธ๋ก ๋ ์๊ทธ๋ ๋ง์คํฌ(sigprocmask(2) ์ฐธ๊ณ ) ์ฌ๋ณธ์
data
๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฒํผ์ ์ง์ด๋ฃ๋๋ค.data
๋sigset_t
ํ์ ๋ฒํผ์ ๋ํ ํฌ์ธํฐ์ฌ์ผ ํ๋ค.addr
์ธ์๋data
๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฒํผ์ ํฌ๊ธฐ๋ฅผ (์ฆsizeof(sigset_t)
๋ฅผ) ๋ด๋๋ค. -
PTRACE_SETSIGMASK
(๋ฆฌ๋ ์ค 3.11๋ถํฐ) -
๋ธ๋ก ๋ ์๊ทธ๋ ๋ง์คํฌ(sigprocmask(2) ์ฐธ๊ณ )๋ฅผ
data
๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฒํผ์ ์ง์ ํ ๊ฐ์ผ๋ก ๋ฐ๊พผ๋ค.data
๋sigset_t
ํ์ ๋ฒํผ์ ๋ํ ํฌ์ธํฐ์ฌ์ผ ํ๋ค.addr
์ธ์๋data
๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฒํผ์ ํฌ๊ธฐ๋ฅผ (์ฆsizeof(sigset_t)
๋ฅผ) ๋ด๋๋ค. -
PTRACE_SETOPTIONS
(๋ฆฌ๋ ์ค 2.4.6๋ถํฐ. BUGS ์ ์ ๊ฒฝ๊ณ ์ฐธ๊ณ ) -
data
์์ ๊ฐ์ ธ์จ ptrace ์ต์ ๋ค์ ์ค์ ํ๋ค. (addr
์ ๋ฌด์ํ๋ค.)data
๋ ์ต์ ๋ค์ ๋นํธ ๋ง์คํฌ๋ก ํด์ํ๋ฉฐ, ๋ค์ ํ๋๊ทธ๋ค๋ก ์ต์ ์ ์ง์ ํ๋ค.-
PTRACE_O_EXITKILL
(๋ฆฌ๋ ์ค 3.8๋ถํฐ) -
์ถ์ ์๊ฐ ๋๋ ๋ ํผ์ถ์ ์์๊ฒ
SIGKILL
์๊ทธ๋์ ๋ณด๋ธ๋ค. ํผ์ถ์ ์๊ฐ ์ ๋ ์ถ์ ์์ ํต์ ๋ฅผ ๋ฒ์ด๋์ง ๋ชปํ๊ฒ ํ๊ณ ์ถ์ ptrace ๊ฐ์๋ค์๊ฒ ์ด ์ต์ ์ด ์ ์ฉํ๋ค. -
PTRACE_O_TRACECLONE
(๋ฆฌ๋ ์ค 2.5.46๋ถํฐ) -
๋ค์ ๋ฒ clone(2)์์ ํผ์ถ์ ์๋ฅผ ๋ฉ์ถ๊ณ ์๋ก clone ๋ ํ๋ก์ธ์ค ์ถ์ ์ ์๋์ผ๋ก ์์ํ๋ค. ์ ํ๋ก์ธ์ค๋
SIGSTOP
์ผ๋ก, ๋๋PTRACE_SEIZE
์ฌ์ฉ ์PTRACE_EVENT_STOP
์ผ๋ก ์์ํ๊ฒ ๋๋ค. ์ถ์ ์์ waitpid(2)๊ฐ ๋ค์๊ณผ ๊ฐ์status
๊ฐ์ ๋ฐํํ๊ฒ ๋๋ค.status>>8 == (SIGTRAP | (PTRACE_EVENT_CLONE<<8))
PTRACE_GETEVENTMSG
๋ก ์ ํ๋ก์ธ์ค์ PID๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.์ด ์ต์ ์ด ๋ชจ๋ ๊ฒฝ์ฐ์ clone(2) ํธ์ถ์ ์ก์ง๋ ๋ชปํ ์๋ ์๋ค. ํผ์ถ์ ์๊ฐ
CLONE_VFORK
ํ๋๊ทธ๋ก clone(2)์ ํธ์ถํ ๊ฒฝ์ฐPTRACE_O_TRACEVFORK
๊ฐ ์ค์ ๋ผ ์์ผ๋ฉดPTRACE_EVENT_VFORK
๊ฐ ๋์ ์ ๋ฌ๋๋ค. ๋๋ ํผ์ถ์ ์๊ฐ ์ข ๋ฃ ์๊ทธ๋์SIGCHLD
๋ก ์ค์ ํด์ clone(2)์ ํธ์ถํ๋ ๊ฒฝ์ฐPTRACE_O_TRACEFORK
๊ฐ ์ค์ ๋ผ ์์ผ๋ฉดPTRACE_EVENT_FORK
๊ฐ ์ ๋ฌ๋๋ค. -
PTRACE_O_TRACEEXEC
(๋ฆฌ๋ ์ค 2.5.46๋ถํฐ) -
๋ค์ ๋ฒ execve(2)์์ ํผ์ถ์ ์๋ฅผ ๋ฉ์ถ๋ค. ์ถ์ ์์ waitpid(2)๊ฐ ๋ค์๊ณผ ๊ฐ์
status
๊ฐ์ ๋ฐํํ๊ฒ ๋๋ค.status>>8 == (SIGTRAP | (PTRACE_EVENT_EXEC<<8))
exec ํ๋ ์ค๋ ๋๊ฐ ์ค๋ ๋ ๊ทธ๋ฃน ๋ฆฌ๋๊ฐ ์๋ ๊ฒฝ์ฐ ์ด ์ ์ง ์ ์ ๊ทธ ์ค๋ ๋์ ID๋ฅผ ์ค๋ ๋ ๊ทธ๋ฃน ๋ฆฌ๋์ ID๋ก ์ฌ์ค์ ํ๋ค. ๋ฆฌ๋ ์ค 3.0๋ถํฐ
PTRACE_GETEVENTMSG
๋ก ์ด์ ์ค๋ ๋ ID๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค. -
PTRACE_O_TRACEEXIT
(๋ฆฌ๋ ์ค 2.5.60๋ถํฐ) -
exit์์ ํผ์ถ์ ์๋ฅผ ๋ฉ์ถ๋ค. ์ถ์ ์์ waitpid(2)๊ฐ ๋ค์๊ณผ ๊ฐ์
status
๊ฐ์ ๋ฐํํ๊ฒ ๋๋ค.status>>8 == (SIGTRAP | (PTRACE_EVENT_EXIT<<8))
PTRACE_GETEVENTMSG
๋ก ํผ์ถ์ ์์ ์ข ๋ฃ ์ํ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.ํผ์ถ์ ์๊ฐ ๋ฉ์ถ๋ ๊ฒ์ ํ๋ก์ธ์ค ์ข ๋ฃ ์ด๋ฐ์ ๋ ์ง์คํฐ๋ค์ด ์์ง ์ฌ์ฉ ๊ฐ๋ฅํ ๋์ด๊ณ , ๊ทธ๋์ ์ด๋์ ์ข ๋ฃ๊ฐ ์ผ์ด๋ฌ๋์ง ์ถ์ ์๊ฐ ๋ณผ ์ ์๋ค. ๋ฐ๋ฉด ์ ์์ ์ธ ์ข ๋ฃ ์๋ฆผ์ ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋ฅผ ๋๋ธ ํ์ ์ด๋ค์ง๋ค. ๋ฌธ๋งฅ์ ์ ๊ทผ ๊ฐ๋ฅํ๊ธฐ๋ ํ์ง๋ง ์ด ์์ ์์ ์ถ์ ์๊ฐ ์ข ๋ฃ๊ฐ ์ผ์ด๋์ง ์๊ฒ ๋ง์ ์๋ ์๋ค.
-
PTRACE_O_TRACEFORK
(๋ฆฌ๋ ์ค 2.5.46๋ถํฐ) -
๋ค์ ๋ฒ fork(2)์์ ํผ์ถ์ ์๋ฅผ ๋ฉ์ถ๊ณ ์๋ก fork ๋ ํ๋ก์ธ์ค ์ถ์ ์ ์๋์ผ๋ก ์์ํ๋ค. ์ ํ๋ก์ธ์ค๋
SIGSTOP
์ผ๋ก, ๋๋PTRACE_SEIZE
์ฌ์ฉ ์PTRACE_EVENT_STOP
์ผ๋ก ์์ํ๊ฒ ๋๋ค. ์ถ์ ์์ waitpid(2)๊ฐ ๋ค์๊ณผ ๊ฐ์status
๊ฐ์ ๋ฐํํ๊ฒ ๋๋ค.status>>8 == (SIGTRAP | (PTRACE_EVENT_FORK<<8))
PTRACE_GETEVENTMSG
๋ก ์ ํ๋ก์ธ์ค์ PID๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค. -
PTRACE_O_TRACESYSGOOD
(๋ฆฌ๋ ์ค 2.4.6๋ถํฐ) -
์์คํ
ํธ์ถ ํธ๋ฉ์ ์ ๋ฌํ ๋ ์๊ทธ๋ ๋ฒํธ์ 7๋ฒ ๋นํธ๋ฅผ ์ค์ ํ๋ค. (์ฆ,
SIGTRAP|0x80
์ ์ ๋ฌํ๋ค.) ์ด๋ ๊ฒ ํ๋ฉด ์ ์์ ์ธ ํธ๋ฉ๊ณผ ์์คํ ํธ์ถ์ ์ํ ํธ๋ฉ์ ์ถ์ ์๊ฐ ์ฝ๊ฒ ๊ตฌ๋ณํ ์ ์๋ค. -
PTRACE_O_TRACEVFORK
(๋ฆฌ๋ ์ค 2.5.46๋ถํฐ) -
๋ค์ ๋ฒ vfork(2)์์ ํผ์ถ์ ์๋ฅผ ๋ฉ์ถ๊ณ ์๋ก vfork ๋ ํ๋ก์ธ์ค ์ถ์ ์ ์๋์ผ๋ก ์์ํ๋ค. ์ ํ๋ก์ธ์ค๋
SIGSTOP
์ผ๋ก, ๋๋PTRACE_SEIZE
์ฌ์ฉ ์PTRACE_EVENT_STOP
์ผ๋ก ์์ํ๊ฒ ๋๋ค. ์ถ์ ์์ waitpid(2)๊ฐ ๋ค์๊ณผ ๊ฐ์status
๊ฐ์ ๋ฐํํ๊ฒ ๋๋ค.status>>8 == (SIGTRAP | (PTRACE_EVENT_VFORK<<8))
PTRACE_GETEVENTMSG
๋ก ์ ํ๋ก์ธ์ค์ PID๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค. -
PTRACE_O_TRACEVFORKDONE
(๋ฆฌ๋ ์ค 2.5.60๋ถํฐ) -
๋ค์ ๋ฒ vfork(2) ์๋ฃ ์ ํผ์ถ์ ์๋ฅผ ๋ฉ์ถ๋ค. ์ถ์ ์์ waitpid(2)๊ฐ ๋ค์๊ณผ ๊ฐ์
status
๊ฐ์ ๋ฐํํ๊ฒ ๋๋ค.status>>8 == (SIGTRAP | (PTRACE_EVENT_VFORK_DONE<<8))
(๋ฆฌ๋ ์ค 2.6.18๋ถํฐ)
PTRACE_GETEVENTMSG
๋ก ์ ํ๋ก์ธ์ค์ PID๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค. -
PTRACE_O_TRACESECCOMP
(๋ฆฌ๋ ์ค 3.5๋ถํฐ) -
seccomp(2)
SECCOMP_RET_TRACE
๊ท์น์ด ๊ฑธ๋ ธ์ ๋ ํผ์ถ์ ์๋ฅผ ๋ฉ์ถ๋ค. ์ถ์ ์์ waitpid(2)๊ฐ ๋ค์๊ณผ ๊ฐ์status
๊ฐ์ ๋ฐํํ๊ฒ ๋๋ค.status>>8 == (SIGTRAP | (PTRACE_EVENT_SECCOMP<<8))
์ด ๋๋ฌธ์
PTRACE_EVENT
์ ์ง๊ฐ ๋ฐ์ํ๋ฉด ๊ทธ๊ฑด ์์คํ -ํธ์ถ-์ง์ -์ ์ง(syscall-enter-stop)์ ๋น์ทํ๋ค. ์์ธํ ๋ด์ฉ์ ์๋์PTRACE_EVENT_SECCOMP
์ ๋ํ ๋ด์ฉ์ ๋ณด๋ผ.PTRACE_GETEVENTMSG
๋ก seccomp ์ด๋ฒคํธ ๋ฉ์์ง ๋ฐ์ดํฐ(seccomp ํํฐ ๊ท์น์์SECCOMP_RET_DATA
๋ถ๋ถ)๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค. -
PTRACE_O_SUSPEND_SECCOMP
(๋ฆฌ๋ ์ค 4.3๋ถํฐ) -
ํผ์ถ์ ์์ seccomp ๋ณดํธ๋ฅผ ์ผ์ ์ค๋จํ๋ค. ๋ชจ๋์ ์๊ด์์ด ์ ์ฉ๋๋ฉฐ ํผ์ถ์ ์๊ฐ ์์ง seccomp ํํฐ๋ฅผ ์ค์นํ์ง ์์์ ๋ ์ฌ์ฉํ ์ ์๋ค. ์ฆ, ์ ํจํ ์ฌ์ฉ ๋ฐฉ์์ ํผ์ถ์ ์๊ฐ seccomp ํํฐ๋ฅผ ์ค์นํ๊ธฐ ์ ์ seccomp ๋ณดํธ๋ฅผ ์ผ์ ์ค๋จํ๊ณ , ํผ์ถ์ ์๊ฐ ํํฐ๋ฅผ ์ค์นํ๊ฒ ํ๊ณ , ์ดํ ํํฐ๋ฅผ ์ฌ๊ฐํด์ผ ํ ๋ ์ด ํ๋๊ทธ๋ฅผ ๋น์ฐ๋ ๊ฒ์ด๋ค. ์ด ์ต์
์ ์ํด์ ์ถ์ ์์๊ฒ
CAP_SYS_ADMIN
์ญ๋ฅ์ด ์์ด์ผ ํ๊ณ , ์ด๋ค seccomp ๋ณดํธ๋ ์ค์น๋์ด ์์ง ์์์ผ ํ๊ณ , ์์ฒด์PTRACE_O_SUSPEND_SECCOMP
๊ฐ ์ค์ ๋์ด ์์ง ์์์ผ ํ๋ค.
-
-
PTRACE_GETEVENTMSG
(๋ฆฌ๋ ์ค 2.5.46๋ถํฐ) -
๋ฐฉ๊ธ ๋ฐ์ํ ptrace ์ด๋ฒคํธ์ ๋ํ ๋ฉ์์ง๋ฅผ (
unsigned long
์ผ๋ก) ๊ฐ์ ธ์์ ์ถ์ ์ ๋ด์ ์ฃผ์data
์ ์ง์ด๋ฃ๋๋ค.PTRACE_EVENT_EXIT
์์๋ ํผ์ถ์ ์์ ์ข ๋ฃ ์ํ์ด๋ค.PTRACE_EVENT_FORK
,PTRACE_EVENT_VFORK
,PTRACE_EVENT_VFORK_DONE
,PTRACE_EVENT_CLONE
์์๋ ์ ํ๋ก์ธ์ค์ PID์ด๋ค.PTRACE_EVENT_SECCOMP
์์๋ ๊ฑธ๋ฆฐ ๊ท์น๊ณผ ์ฐ๊ณ๋ seccomp(2) ํํฐ์SECCOMP_RET_DATA
์ด๋ค. (addr
์ ๋ฌด์ํ๋ค.) PTRACE_CONT
-
์ ์ง๋ ํผ์ถ์ ํ๋ก์ธ์ค๋ฅผ ์ฌ์์ํ๋ค.
data
๊ฐ 0์ด ์๋๋ฉด ํผ์ถ์ ์์๊ฒ ๋ณด๋ผ ์๊ทธ๋ ๋ฒํธ๋ก ํด์ํ๋ค. 0์ด๋ฉด ์๊ทธ๋์ ๋ณด๋ด์ง ์๋๋ค. ๊ทธ๋์ ์๋ฅผ ๋ค์ด ํผ์ถ์ ์๋ก ๋ณด๋ธ ์๊ทธ๋์ด ์ ๋ฌ๋ ์ง ์ฌ๋ถ๋ฅผ ์ถ์ ์๊ฐ ์ ์ดํ ์ ์๋ค. (addr
์ ๋ฌด์ํ๋ค.) -
PTRACE_SYSCALL
,PTRACE_SINGLESTEP
-
PTRACE_CONT
์ฒ๋ผ ์ ์ง๋ ํผ์ถ์ ํ๋ก์ธ์ค๋ฅผ ์ฌ์์ํ๋ ๋ค์ ๋ฒ ์์คํ ํธ์ถ ์ง์ ์ด๋ ํด์ฅ์์ ๋๋ ํ ์ธ์คํธ๋ญ์ ์คํ ํ์ ํผ์ถ์ ์๊ฐ ๋ฉ์ถ๋๋ก ํด ๋๋๋ค. (ํ์์์ ๋ง์ฐฌ๊ฐ์ง๋ก ์๊ทธ๋ ์์ ์์๋ ํผ์ถ์ ์๊ฐ ๋ฉ์ถ๊ฒ ๋๋ค.) ์ถ์ ์ ๊ด์ ์์๋ ํผ์ถ์ ์๊ฐSIGTRAP
์ ์์ ํด์ ๋ฉ์ถ ๊ฒ์ผ๋ก ๋ณด์ด๊ฒ ๋๋ค. ๊ทธ๋์ ์๋ฅผ ๋ค์ดPTRACE_SYSCALL
์ ๊ฒฝ์ฐ ์ฒซ ๋ฒ์งธ ์ ์ง ๋ ์์คํ ํธ์ถ์ ์ธ์๋ฅผ ๊ฒ์ฌํ๊ณ ์ ๋ค์PTRACE_SYSCALL
์ ํด์ ๋ ๋ฒ์งธ ์ ์ง ๋ ๊ทธ ์์คํ ํธ์ถ์ ๋ฐํ ๊ฐ์ ๊ฒ์ฌํ ์ ์๋ค.data
์ธ์๋PTRACE_CONT
์์์ฒ๋ผ ์ฒ๋ฆฌํ๋ค. -
PTRACE_SYSEMU
,PTRACE_SYSEMU_SINGLESTEP
(๋ฆฌ๋ ์ค 2.6.14๋ถํฐ) -
PTRACE_SYSEMU
์ ๊ฒฝ์ฐ ์ํ ํ ๋ค์ ์์คํ ํธ์ถ ์ง์ ์์ ์ ์งํ๋ฉฐ, ๊ทธ ์์คํ ํธ์ถ์ ์คํ๋์ง ์๊ฒ ๋๋ค. ์๋์ ์์คํ -ํธ์ถ-์ ์ง(syscall-stop)์ ๋ํ ๋ด์ฉ์ ๋ณด๋ผ.PTRACE_SYSEMU_SINGLESTEP
์ ๊ฒฝ์ฐ ๋๊ฐ์ด ํ๋ ์์คํ ํธ์ถ์ด ์๋๋ฉด ๋จ๊ณ ์คํ(singlestep)์ ํ๋ค. ํผ์ถ์ ์์ ๋ชจ๋ ์์คํ ํธ์ถ์ ์๋ฎฌ๋ ์ดํธ ํ๋ ค ํ๋ ์ฌ์ฉ์ ๋ชจ๋ ๋ฆฌ๋ ์ค(User Mode Linux) ๊ฐ์ ํ๋ก๊ทธ๋จ์์ ์ด ํธ์ถ์ ์ฌ์ฉํ๋ค.data
์ธ์๋PTRACE_CONT
์์์ฒ๋ผ ์ฒ๋ฆฌํ๋ค.addr
์ ๋ฌด์ํ๋ค. ํ์ฌ x86์์๋ง ์ด ์์ฒญ๋ค์ ์ง์ํ๋ค. -
PTRACE_LISTEN
(๋ฆฌ๋ ์ค 3.4๋ถํฐ) -
์ ์ง๋ ํผ์ถ์ ์๋ฅผ ์ฌ์์ํ๋ ์คํ์ ๋ง๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ฉด ํผ์ถ์ ์์ ์ํ๋
SIGSTOP
(๋๋ ๋ค๋ฅธ ์ ์งํ ์๊ทธ๋)์ผ๋ก ์ ์ง๋ ํ๋ก์ธ์ค์ ๋น์ทํด์ง๋ค. ์ถ๊ฐ์ ์ธ ๋ด์ฉ์ "๊ทธ๋ฃน-์ ์ง(group-stop)" ๋ถ์ ์ ๋ณด๋ผ.PTRACE_LISTEN
์PTRACE_SEIZE
๋ก ๋ถ์ธ ํผ์ถ์ ์์๋ง ๋์ํ๋ค. PTRACE_KILL
-
ํผ์ถ์ ์์๊ฒ
SIGKILL
์ ๋ณด๋ด์ ์ข ๋ฃ์ํจ๋ค. (addr
๊ณผdata
๋ ๋ฌด์ํ๋ค.)์ด ๋์์ ์ ๊ฑฐ ์์ ์ด๋ฏ๋ก ์ฌ์ฉํ์ง ๋ง ๊ฒ! ๋์ kill(2)์ด๋ tgkill(2)์ ์ด์ฉํด ์ง์
SIGKILL
์ ๋ณด๋ด๋ฉด ๋๋ค.PTRACE_KILL
์ ๋ฌธ์ ๋ ํผ์ถ์ ์๊ฐ ์๊ทธ๋-์ ๋ฌ-์ ์ง(signal-delivery-stop) ์ํ์ฌ์ผ ํ๊ณ ์ ๊ทธ๋ฌ๋ฉด ๋์ํ์ง ์์ ์ ์๋ค๋ ์ ์ด๋ค. (์ฆ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃํ๊ณ ์ ํผ์ถ์ ์๋ฅผ ์ฃฝ์ด์ง ์์ ์๊ฐ ์๋ค.) ๋ฐ๋ฉด ์ง์ SIGKILL
์ ๋ณด๋ด๋ ๋ฐฉ์์๋ ๊ทธ๋ฐ ์ ํ์ด ์๋ค. -
PTRACE_INTERRUPT
(๋ฆฌ๋ ์ค 3.4๋ถํฐ) -
ํผ์ถ์ ์๋ฅผ ๋ฉ์ถ๋ค. ํผ์ถ์ ์๊ฐ ์ปค๋ ๊ณต๊ฐ์์ ์คํ ๋ด์ง ์ฌ๋ฆฝ ์ค์ด๋ฉด ์์คํ
ํธ์ถ์ ์ค๋จ์ํค๊ณ ์์คํ
-ํธ์ถ-ํด์ฅ-์ ์ง(syscall-exit-stop)๋ฅผ ๋ณด๊ณ ํ๋ค. (์ค๋จ๋ ์์คํ
ํธ์ถ์ด ํผ์ถ์ ์ ์ฌ์์ ๋ ์ฌ์์๋๋ค.) ํผ์ถ์ ์๊ฐ ์ด๋ฏธ ์๊ทธ๋๋ก ์ ์ง๋์๊ณ ๊ทธ๋ฆฌ๋ก
PTRACE_LISTEN
์ ๋ณด๋์ผ๋ฉด ํผ์ถ์ ์๊ฐPTRACE_EVENT_STOP
์ผ๋ก ๋ฉ์ถ๊ณWSTOPSIG(status)
๊ฐ ์ ์ง ์๊ทธ๋์ ๋ฐํํ๋ค. ๋ค๋ฅธ ptrace-์ ์ง๊ฐ ๋์์ ๋ฐ์ํ๋ฉด (๊ฐ๋ น ํผ์ถ์ ์๋ก ์๊ทธ๋์ด ์ ์ก๋๋ฉด) ๊ทธ ptrace-์ ์ง๊ฐ ์ผ์ด๋๋ค. ์์ ์ด๋ ๊ฒฝ์ฐ๋ ์ ์ฉ๋์ง ์์ผ๋ฉด (์๋ฅผ ๋ค์ด ํผ์ถ์ ์๊ฐ ์ฌ์ฉ์ ๊ณต๊ฐ์์ ๋๊ณ ์์ผ๋ฉด)PTRACE_EVENT_STOP
์ผ๋ก ๋ฉ์ถ๊ณWSTOPSIG(status)
๋SIGTRAP
์ด๋ค.PTRACE_INTERRUPT
๋PTRACE_SEIZE
๋ก ๋ถ์ธ ํผ์ถ์ ์์๋ง ๋์ํ๋ค. PTRACE_ATTACH
-
pid
๋ก ์ง์ ํ ํ๋ก์ธ์ค์ ๋ถ์ด์ ๊ทธ ํ๋ก์ธ์ค๋ฅผ ํธ์ถ ํ๋ก์ธ์ค์ ํผ์ถ์ ์๋ก ๋ง๋ ๋ค. ํผ์ถ์ ์์๊ฒSIGSTOP
์ด ์ ์ก๋์ง๋ง ์ด ํธ์ถ ์๋ฃ ์์ ์ ํผ์ถ์ ์๊ฐ ๋ฐ๋์ ๋ฉ์ถฐ ์์ง๋ ์์ ๊ฒ์ด๋ค. waitpid(2)๋ฅผ ์ฌ์ฉํด์ ํผ์ถ์ ์๊ฐ ๋ฉ์ถ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ฉด ๋๋ค. ์์ธํ ๋ด์ฉ์ "๋ถ๊ธฐ์ ๋จ์ด์ง๊ธฐ" ๋ถ์ ์ ๋ณด๋ผ. (addr
๊ณผdata
๋ ๋ฌด์ํ๋ค.)PTRACE_ATTACH
์ํ ๊ถํ์ ptrace ์ ๊ทผ ๋ชจ๋PTRACE_MODE_ATTACH_REALCREDS
๊ฒ์ฌ๋ก ๊ฒฐ์ ๋๋ค. ์๋ ์ฐธ๊ณ . -
PTRACE_SEIZE
(๋ฆฌ๋ ์ค 3.4๋ถํฐ) -
pid
๋ก ์ง์ ํ ํ๋ก์ธ์ค์ ๋ถ์ด์ ๊ทธ ํ๋ก์ธ์ค๋ฅผ ํธ์ถ ํ๋ก์ธ์ค์ ํผ์ถ์ ์๋ก ๋ง๋ ๋ค.PTRACE_ATTACH
์ ๋ฌ๋ฆฌPTRACE_SEIZE
๋ ํ๋ก์ธ์ค๋ฅผ ์ ์ง์ํค์ง ์๋๋ค. ๊ทธ๋ฃน-์ ์ง(group-stop)๋PTRACE_EVENT_STOP
์ผ๋ก ๋ณด๊ณ ๋๊ณWSTOPSIG(status)
๊ฐ ์ ์ง ์๊ทธ๋์ ๋ฐํํ๋ค. ์๋์ผ๋ก ๋ถ๋ ์์๋ค์PTRACE_EVENT_STOP
์ผ๋ก ๋ฉ์ถ๊ณWSTOPSIG(status)
๊ฐSIGTRAP
์ ๋ฐํํ๋ฉฐSIGSTOP
์๊ทธ๋์ ์ ๋ฌ๋์ง ์๋๋ค. execve(2)์์ ์ถ๊ฐSIGTRAP
์ด ์ ๋ฌ๋์ง ์๋๋ค.PTRACE_SEIZE
๋ก ์ก์ ํ๋ก์ธ์ค๋งPTRACE_INTERRUPT
๋ฐPTRACE_LISTEN
๋ช ๋ น์ ๋ฐ์๋ค์ผ ์ ์๋ค. ์ด๋ฐ "์ฅ์ (seize)" ๋์ ๋ฐฉ์์PTRACE_O_TRACEFORK
,PTRACE_O_TRACEVFORK
,PTRACE_O_TRACECLONE
์ผ๋ก ์๋์ผ๋ก ๋ถ๋ ์์๋ค์ด ๋ฌผ๋ ค๋ฐ๋๋ค.addr
์ด 0์ด์ด์ผ ํ๋ค.data
๋ ์ฆ์ ํ์ฑํ์ํฌ ptrace ์ต์ ๋ค์ ๋นํธ ๋ง์คํฌ๋ฅผ ๋ด๋๋ค.PTRACE_SEIZE
์ํ ๊ถํ์ ptrace ์ ๊ทผ ๋ชจ๋PTRACE_MODE_ATTACH_REALCREDS
๊ฒ์ฌ๋ก ๊ฒฐ์ ๋๋ค. ์๋ ์ฐธ๊ณ . -
PTRACE_SECCOMP_GET_FILTER
(๋ฆฌ๋ ์ค 4.4๋ถํฐ) -
์ด ๋์์ ํตํด ์ถ์ ์๊ฐ ํผ์ถ์ ์์ ์ ํต์ BPF ํํฐ๋ฅผ ์ป์ด์ฌ ์ ์๋ค.
addr
์ ์ป์ด์ฌ ํํฐ์ ์ธ๋ฑ์ค๋ฅผ ๋ํ๋ด๋ ์ ์์ด๋ค. ๊ฐ์ฅ ์ต๊ทผ ์ค์น๋ ํํฐ์ ์ธ๋ฑ์ค๊ฐ 0์ด๋ค.addr
์ด ์ค์น๋ ํํฐ ์๋ณด๋ค ํฌ๋ฉด ๋์์ดENOENT
์ค๋ฅ๋ก ์คํจํ๋ค.data
๋ BPF ํ๋ก๊ทธ๋จ์ ์ ์ฅํ๊ธฐ์ ์ถฉ๋ถํ ํฐstruct sock_filter
๋ฐฐ์ด์ ๋ํ ํฌ์ธํฐ์ด๊ฑฐ๋, ํ๋ก๊ทธ๋จ์ ์ ์ฅํ๋ ค๋ ๊ฒ์ด ์๋๋ฉด NULL์ด๋ค.์ฑ๊ณต ์ ๋ฐํ ๊ฐ์ BPF ํ๋ก๊ทธ๋จ ๋ด ์ธ์คํธ๋ญ์ ์์ด๋ค.
data
๊ฐ NULL์ด์์ผ๋ฉด ์ด ๋ฐํ ๊ฐ์ ์ด์ฉํด ์ ํํ ํฌ๊ธฐ์struct sock_filter
๋ฐฐ์ด์ ํ์ ํธ์ถ์ ์ค ์ ์๋ค.ํธ์ถ์๊ฐ
CAP_SYS_ADMIN
์ญ๋ฅ์ ๊ฐ์ง๊ณ ์์ง ์๊ฑฐ๋ ํธ์ถ์๊ฐ seccomp ์๊ฒฉ ๋ด์ง ํํฐ ๋ชจ๋์ ์์ผ๋ฉด ์ด ๋์์ดEACCES
์ค๋ฅ๋ก ์คํจํ๋ค.addr
์ด ๊ฐ๋ฆฌํค๋ ํํฐ๊ฐ ์ ํต์ BPF ํํฐ๊ฐ ์๋๋ฉด ๋์์ดEMEDIUMTYPE
์ค๋ฅ๋ก ์คํจํ๋ค.์ปค๋์
CONFIG_SECCOMP_FILTER
์CONFIG_CHECKPOINT_RESTORE
์ต์ ๋ชจ๋๋ก ๊ตฌ์ฑํ ๊ฒฝ์ฐ์๋ง ์ด ๋์์ด ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. PTRACE_DETACH
-
PTRACE_CONT
์ฒ๋ผ ์ ์ง๋ ํผ์ถ์ ์๋ฅผ ์ฌ์์ํ๋ ๋จผ์ ๊ทธ ํ๋ก์ธ์ค์์ ๋จ์ด์ง๋ค. ๋ฆฌ๋ ์ค์์๋ ์ด๋ค ๋ฐฉ๋ฒ์ผ๋ก ์ถ์ ์ ๊ฐ์ํ๋์ง ๊ฐ์ ์ด ๋ฐฉ์์ผ๋ก ํผ์ถ์ ์์์ ๋จ์ด์ง ์ ์๋ค. (addr
์ ๋ฌด์ํ๋ค.) -
PTRACE_GET_THREAD_AREA
(๋ฆฌ๋ ์ค 2.6.0๋ถํฐ) -
์ด ๋์์ get_thread_area(2)์ ๋น์ทํ ์ผ์ ์ํํ๋ค. GDT์์ ์ธ๋ฑ์ค๊ฐ
addr
์ธ TLS ํญ๋ชฉ์ ์ฝ์ด์ ๊ทธ ํญ๋ชฉ์ ์ฌ๋ณธ์data
๊ฐ ๊ฐ๋ฆฌํค๋struct user_desc
๋ก ๋ณต์ฌํ๋ค. (get_thread_area(2)์ ๋ฌ๋ฆฌstruct user_desc
์entry_number
๋ฅผ ๋ฌด์ํ๋ค.) -
PTRACE_SET_THREAD_AREA
(๋ฆฌ๋ ์ค 2.6.0๋ถํฐ) -
์ด ๋์์ set_thread_area(2)์ ๋น์ทํ ์ผ์ ์ํํ๋ค. GDT์์ ์ธ๋ฑ์ค๊ฐ
addr
์ธ TLS ํญ๋ชฉ์data
๊ฐ ๊ฐ๋ฆฌํค๋struct user_desc
์ ์ค ๋ฐ์ดํฐ๋ก ์ค์ ํ๋ค. (set_thread_area(2)์ ๋ฌ๋ฆฌstruct user_desc
์entry_number
๋ฅผ ๋ฌด์ํ๋ค. ๋ค์ ๋งํด ์ด ptrace ๋์์ ์ฌ์ฉํด ๋น TLS ํญ๋ชฉ์ ํ ๋นํ ์๋ ์๋ค.)
(๋ค์ค ์ค๋ ๋์ผ ์ ์๋) ํ๋ก์ธ์ค๊ฐ ์ฃฝ์ด๊ธฐํ(killing) ์๊ทธ๋(์ฒ๋ฆฌ ๋ฐฉ์์ด SIG_DFL
๋ก ์ค์ ๋ผ ์๊ณ ๊ธฐ๋ณธ ํ์๊ฐ ํ๋ก์ธ์ค ์ฃฝ์ด๋ ๊ฒ์ธ ์๊ทธ๋)์ ์์ ํ๋ฉด ๋ชจ๋ ์ค๋ ๋๋ค์ด ๋๋๋ค. ํผ์ถ์ ์๋ ์๊ธฐ ์ถ์ ์(๋ค)์๊ฒ ์๊ธฐ ์ฃฝ์์ ์๋ฆฐ๋ค. ์ด ์ฌ๊ฑด ์๋ฆผ์ waitpid(2)๋ฅผ ํตํด ์ ๋ฌ๋๋ค.
์ฐธ๊ณ ๋ก ์ฃฝ์ด๊ธฐํ ์๊ทธ๋์ ๋จผ์ (ํผ์ถ์ ์ ํ๋์์๋ง) ์๊ทธ๋-์ ๋ฌ-์ ์ง๋ฅผ ์ผ์ผํค๊ณ , ์ถ์ ์๊ฐ ๊ทธ ์๊ทธ๋์ ์ฃผ์ ํ๊ณ ๋์์ผ (๋๋ ์ถ์ ๋์ ์๋ ์ค๋ ๋๊ฐ ๊ฐ์ ธ๊ฐ๊ณ ๋์์ผ) ๋ค์ค ์ค๋ ๋ ํ๋ก์ธ์ค ๋ด ๋ชจ๋ ํผ์ถ์ ์๋ค์์ ์๊ทธ๋์ ์ํ ์ฃฝ์์ด ์ผ์ด๋๊ฒ ๋๋ค. ("์๊ทธ๋-์ ๋ฌ-์ ์ง"๋ผ๋ ์ฉ์ด๋ ์๋์์ ์ค๋ช ํ๋ค.)
SIGKILL
์ ์๊ทธ๋-์ ๋ฌ-์ ์ง๋ฅผ ๋ฐ์์ํค์ง ์๊ณ , ๊ทธ๋์ ์ถ์ ์๊ฐ ์ด๋ฅผ ์ต์ ํ ์ ์๋ค. ์์คํ
ํธ์ถ ๋ด์ ์์ด๋ SIGKILL
๋ก ์ฃฝ๋๋ค. (SIGKILL
์ ์ํ ์ฃฝ์์ ์์ ์์คํ
-ํธ์ถ-ํด์ฅ-์ ์ง(syscall-exit-stop)๊ฐ ๋ฐ์ํ์ง ์๋๋ค.) ๊ฒฐ๋ก ์ ํ๋ก์ธ์ค ๋ด ์ผ๋ถ ์ค๋ ๋๋ฅผ ptrace ํ๋ ๊ฒฝ์ฐ์๋ SIGKILL
์ด ํญ์ ํ๋ก์ธ์ค๋ฅผ (๋ชจ๋ ์ค๋ ๋๋ฅผ) ์ฃฝ์ธ๋ค๋ ๊ฒ์ด๋ค.
ํผ์ถ์ ์๊ฐ _exit(2)๋ฅผ ํธ์ถํ ๋ ์๊ธฐ ์ถ์ ์์๊ฒ ์๊ธฐ ์ฃฝ์์ ์๋ฆฐ๋ค. ๋ค๋ฅธ ์ค๋ ๋๋ค์ ์ํฅ ๋ฐ์ง ์๋๋ค.
์ด๋ ์ค๋ ๋๋ผ๋ exit_group(2)์ ์คํํ ๋ ๊ทธ ์ค๋ ๋ ๊ทธ๋ฃน ๋ด์ ๋ชจ๋ ํผ์ถ์ ์๊ฐ ์๊ธฐ ์ถ์ ์์๊ฒ ์๊ธฐ ์ฃฝ์์ ์๋ฆฐ๋ค.
PTRACE_O_TRACEEXIT
์ต์
์ด ์ผ์ ธ ์์ผ๋ฉด ์ค์ ์ฃฝ์ ์ ์ PTRACE_EVENT_EXIT
๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค. exit(2), exit_group(2), ์๊ทธ๋ ์ฃฝ์(SIGKILL
์ ์ ์ธ์ด๋ ์ปค๋ ๋ฒ์ ์ ๋ฐ๋ผ ๋ค๋ฆ. ์๋ BUGS ์ฐธ๊ณ )์ ํตํด ๋๋ ๋, ๊ทธ๋ฆฌ๊ณ ๋ค์ค ์ค๋ ๋ ํ๋ก์ธ์ค์์ execve(2) ๋๋ฌธ์ ์ค๋ ๋๋ค์ด ํ๊ธฐ๋ ๋ ๊ทธ๋ ๋ค.
ptrace์ ์ํด ์ ์ง๋ ํผ์ถ์ ์๊ฐ ์กด์ฌํ๋ค๊ณ ์ถ์ ์๊ฐ ๊ฐ์ ํ ์ ์๋ค. ํผ์ถ์ ์๊ฐ ์ ์ง๋ ์ํ์์ ์ฃฝ์ ์ ์๋ (SIGKILL
๊ฐ์) ์ฌ๋ฌ ๊ฒฝ์ฐ๋ค์ด ์๋ค. ๋ฐ๋ผ์ ์ถ์ ์๋ ์ด๋ ptrace ๋์์ ๋ํด์๋ ESRCH
๋ฅผ ๋ค๋ฃฐ ์ค๋น๊ฐ ๋์ด ์์ด์ผ ํ๋ค. ๋ถํํ๋ (์ ์ง๋ ํผ์ถ์ ์๋ฅผ ํ์๋ก ํ๋ ๋ช
๋ น์์) ํผ์ถ์ ์๊ฐ ์กด์ฌํ์ง๋ง ptrace์ ์ํด ์ค์ง๋์ง ์์ ๊ฒฝ์ฐ๋ ๊ทธ ptrace ํธ์ถ์ ํ ํ๋ก์ธ์ค์๊ฒ ์ถ์ ๋๊ณ ์์ง ์์ ๊ฒฝ์ฐ์๋ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐํ๋๋ค. ์ถ์ ์๋ ํผ์ถ์ ์์ ์ ์ง/๋์ ์ํ๋ฅผ ๋ฐ๋ผ๊ฐ ํ์๊ฐ ์์ผ๋ฉฐ, ํผ์ถ์ ์๊ฐ ๋ถ๋ช
ํ ptrace-์ ์ง์ ๋ค์ด๊ฐ๋ค๊ณ ์๊ณ ์๋ ๊ฒฝ์ฐ์๋ง ESRCH
๋ฅผ "ํผ์ถ์ ์๊ฐ ์์ ๋ชปํ๊ฒ ์ฃฝ์์"์ผ๋ก ํด์ํด์ผ ํ๋ค. ์ฐธ๊ณ ๋ก ptrace ๋์์ด ESRCH
๋ฅผ ๋ฐํํ ๊ฒฝ์ฐ์ waitpid(WNOHANG)
์ด ํผ์ถ์ ์์ ์ฃฝ์ ์ํ๋ฅผ ์ ๋ขฐ์ฑ ์๊ฒ ์๋ ค์ค๋ค๋ ๋ณด์ฅ์ด ์๋ค. ๋์ waitpid(WNOHANG)
์ด 0์ ๋ฐํํ ์๋ ์๋ค. ๋ค์ ๋งํด ํผ์ถ์ ์๊ฐ ์์ง "์์ ํ ์ฃฝ์ง๋" ์์์ผ๋ฉด์ ptrace ์์ฒญ์ ์ด๋ฏธ ๊ฑฐ๋ถํ๊ณ ์์ ์๋ ์๋ค.
ํผ์ถ์ ์๊ฐ ํญ์ WIFEXITED(status)
๋ WIFSIGNALED(status)
๋ฅผ ์๋ ค์ฃผ๋ฉฐ ์ธ์์ ๋๋ธ๋ค๊ณ ์ถ์ ์๊ฐ ๊ฐ์ ํ ์ ์๋ค. ๊ทธ๋ฌ์ง ์๋ ๊ฒฝ์ฐ๋ค์ด ์๋ค. ์๋ฅผ ๋ค์ด ์ค๋ ๋ ๊ทธ๋ฃน ๋ฆฌ๋๊ฐ ์๋ ์ค๋ ๋๊ฐ execve(2)๋ฅผ ํ๋ฉด ๊ทธ ์ค๋ ๋๊ฐ ์ฌ๋ผ์ง๋ค. ๊ทธ PID๊ฐ ๋ค์๋ ๋ณด์ด์ง ์๊ฒ ๋๋ฉฐ ์ดํ ๋ฐ์ํ๋ ptrace ์ ์ง๋ ์ค๋ ๋ ๊ทธ๋ฃน ๋ฆฌ๋์ PID๋ก ๋ณด๊ณ ๋๋ค.
ํผ์ถ์ ์๋ ๋์ ๋๋ ์ ์ง ์ค ํ ์ํ์ ์์ ์ ์๋ค. ptrace์ ์์ด์ (read(2)
, pause(2) ๋ฑ์) ์์คํ
ํธ์ถ ๋ด์ ๋ธ๋ก ๋ผ ์๋ ํผ์ถ์ ์๋ ์ค๋ น ๊ธด ์๊ฐ ๋์ ๋ธ๋ก ๋์ด ์๋ ๊ฒฝ์ฐ์๋ ์คํ ์ค์ธ ๊ฒ์ผ๋ก ๋ณธ๋ค. PTRACE_LISTEN
์ดํ ํผ์ถ์ ์์ ์ํ๋ ๋ค์ ์ ๋งคํ๋ค. ์ด๋ค ptrace ์ ์ง์๋ ์์ง ์์ผ๋ฉฐ (ptrace ๋ช
๋ น์ด ๋จนํ์ง ์์ผ๋ฉฐ waitpid(2) ์๋ฆผ์ ์ ๋ฌํ๊ฒ ๋๋ค.), ๊ทธ๋ฌ๋ฉด์๋ ์ธ์คํธ๋ญ์
์ ์คํํ๊ณ ์์ง ์์ผ๋ฏ๋ก (์ค์ผ์ค ๋์ง ์์ผ๋ฏ๋ก) "์ ์ง" ์ํ๋ก ๋ณผ ์๋ ์๋ค. ๊ทธ๋ฆฌ๊ณ PTRACE_LISTEN
์ ์ ๊ทธ๋ฃน ์ ์ง์ ์์์ผ๋ฉด SIGCONT
๋ฅผ ์์ ํ ๋๊น์ง๋ ์๊ทธ๋์ ์๋ตํ์ง ์๊ฒ ๋๋ค.
ํผ์ถ์ ์๊ฐ ๋ฉ์ถฐ ์์ ๋์ ์ํ๊ฐ ์ฌ๋ฌ ๊ฐ์ง ์๋๋ฐ ptrace ๋ ผ์์์ ์ด๋ฅผ ๋ญ๋ฑ๊ทธ๋ ค ๋งํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ๋ฐ๋ผ์ ์ ํํ ์ฉ์ด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์ํ๋ค.
์ด ๋งค๋ด์ผ ํ์ด์ง์์๋ ํผ์ถ์ ์๊ฐ ์ถ์ ์๋ก๋ถํฐ ptrace ๋ช
๋ น์ ๋ฐ์๋ค์ผ ์ค๋น๊ฐ ๋์ด ์๋ ๋ชจ๋ ์ ์ง ์ํ๋ฅผ ptrace-์ ์ง(ptrace-stop)๋ผ๊ณ ํ๋ค. ptrace-์ ์ง๋ฅผ ๋ค์ ์๊ทธ๋-์ ๋ฌ-์ ์ง(signal-delivery-stop), ๊ทธ๋ฃน-์ ์ง(group-stop), ์์คํ
-ํธ์ถ-์ ์ง(syscall-stop), PTRACE_EVENT
์ ์ง(PTRACE_EVENT
stop) ๋ฑ์ผ๋ก ๋๋ ์ ์๋ค. ์ด ์ ์ง ์ํ๋ค์ ์๋์์ ์์ธํ ์ค๋ช
ํ๋ค.
๋์ ์ค์ธ ํผ์ถ์ ์๊ฐ ptrace-์ ์ง์ ๋ค์ด๊ฐ๋ฉด waitpid(2)๋ฅผ (๋๋ ๋ค๋ฅธ "wait" ์์คํ ํธ์ถ๋ค ์ค ํ๋๋ฅผ) ํ๊ณ ์๋ ์ถ์ ์์๊ฒ ์๋ฆผ์ ๋ณด๋ธ๋ค. ์ด ๋งค๋ด์ผ ํ์ด์ง ๋๋ถ๋ถ์์๋ ์ถ์ ์๊ฐ ๋ค์๊ณผ ๊ฐ์ด ๊ธฐ๋ค๋ฆฐ๋ค๊ณ ๊ฐ์ ํ๋ค.
pid = waitpid(pid_or_minus_1, &status, __WALL);
0๋ณด๋ค ํฐ pid
๋ฐํ๊ณผ WIFSTOPPED(status)
์ฐธ์ด ptrace๋ก ์ ์ง๋ ํผ์ถ์ ์์์ ์๋ ค ์ค๋ค.
__WALL
ํ๋๊ทธ๋ WSTOPPED
์ WEXITED
ํ๋๊ทธ๋ฅผ ํฌํจํ์ง ์์ง๋ง ๊ทธ ๊ธฐ๋ฅ์ฑ์ ํจ์ํ๋ค.
waitpid(2) ํธ์ถ ์ WCONTINUED
ํ๋๊ทธ ์ค์ ์ ๊ถ์ฅํ์ง ์๋๋ค. "์ํ๋จ" ์ํ๋ ํ๋ก์ธ์ค๋ณ์ด๋ฉฐ ์ด๋ฅผ ์๋ชจํ๋ฉด ํผ์ถ์ ์์ ์ค์ ๋ถ๋ชจ๋ฅผ ํผ๋์ค๋ฝ๊ฒ ๋ง๋ค ์ ์๋ค.
WNOHANG
ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฆผ์ด ์์ ๊ฒ์์ ์ถ์ ์๊ฐ ์๊ณ ์๋ ๊ฒฝ์ฐ์๋ waitpid(2)๊ฐ 0("์์ง ์ฌ์ฉ ๊ฐ๋ฅํ ๋๊ธฐ ๊ฒฐ๊ณผ ์์")์ ๋ฐํํ๊ฒ ๋ ์ ์๋ค. ์:
errno = 0;
ptrace(PTRACE_CONT, pid, 0L, 0L);
if (errno == ESRCH) {
/* ํผ์ถ์ ์๊ฐ ์ฃฝ์์ */
r = waitpid(tracee, &status, __WALL | WNOHANG);
/* ์ฌ๊ธฐ์ r์ด ์์ง๋ 0์ผ ์ ์๋ค! */
}
์กด์ฌํ๋ ptrace ์ ์ง์ ์ข
๋ฅ๋ก ์๊ทธ๋-์ ๋ฌ-์ ์ง, ๊ทธ๋ฃน-์ ์ง, PTRACE_EVENT
์ ์ง, ์์คํ
-ํธ์ถ-์ ์ง๊ฐ ์๋ค. ๋ชจ๋ waitpid(2)๋ก ์ ์ ์๊ณ WIFSTOPPED(status)
๊ฐ ์ฐธ์ด๋ค. ์ข
๋ฅ๋ฅผ ๊ตฌ๋ณํ๊ณ ์ถ์ผ๋ฉด status>>8
๊ฐ์ ๊ฒ์ฌํ๊ฑฐ๋, ๊ทธ ๊ฐ์ ๋ชจํธํ ์ ์ด ์๋ ๊ฒฝ์ฐ PTRACE_GETSIGINFO
๋ฅผ ์ง์ํด ๋ณด๋ฉด ๋๋ค. (์ฐธ๊ณ : ์ด ๊ฒ์ฌ๋ฅผ ์ํํ๋ ๋ฐ WSTOPSIG(status)
๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค. (status>>8) & 0xff
๊ฐ์ ๋ฐํํ๊ธฐ ๋๋ฌธ์ด๋ค.)
(๋ค์ค ์ค๋ ๋์ผ ์ ์๋) ํ๋ก์ธ์ค๊ฐ SIGKILL
์ธ์ ์๊ทธ๋์ ์์ ํ์ ๋ ์ปค๋์์๋ ๊ทธ ์๊ทธ๋์ ์ฒ๋ฆฌํ ์ค๋ ๋๋ฅผ ์์๋ก ์ ์ ํ๋ค. (์๊ทธ๋์ tgkill(2)๋ก ์์ฑํ๋ ๊ฒฝ์ฐ์๋ ์ถ์ ์๊ฐ ๋์ ์ค๋ ๋๋ฅผ ๋ช
์์ ์ผ๋ก ์ ํํ ์ ์๋ค.) ์ ํ๋ ์ค๋ ๋๊ฐ ์ถ์ ๋๊ณ ์์ผ๋ฉด ์๊ทธ๋-์ ๋ฌ-์ ์ง๋ก ๋ค์ด๊ฐ๋ค. ์ด ์์ ์์ ์๊ทธ๋์ ์์ง ํ๋ก์ธ์ค์๊ฒ ์ ๋ฌ๋์ง ์์๊ณ ์ถ์ ์์ ์ํด ์ต์ ๋ ์ ์๋ค. ์ถ์ ์๊ฐ ์๊ทธ๋์ ์ต์ ํ์ง ์๋ ๊ฒฝ์ฐ ๋ค์ ptrace ์ฌ์์ ์์ฒญ์์ ํผ์ถ์ ์์๊ฒ ์๊ทธ๋์ ๋ณด๋ด๊ฒ ๋๋ค. ์๊ทธ๋ ์ ๋ฌ์ ์ด ๋ ๋ฒ์งธ ๋จ๊ณ๋ฅผ ์ด ๋งค๋ด์ผ์์ ์๊ทธ๋ ์ฃผ์
์ด๋ผ๊ณ ํ๋ค. ์ฐธ๊ณ ๋ก ์๊ทธ๋์ด ๋ธ๋ก ๋์ด ์์ผ๋ฉด ๋ธ๋ก์ด ํด์ ๋ ๋๊น์ง ์๊ทธ๋-์ ๋ฌ-์ ์ง๊ฐ ์ผ์ด๋์ง ์๋๋ค. ๋จ ๋ธ๋ก ํ ์ ์๋ SIGSTOP
์ ์ธ์ ๋์ฒ๋ผ ์์ธ์ด๋ค.
waitpid(2)๊ฐ WIFSTOPPED(status)
๋ฅผ ์ฐธ์ผ๋ก ๋ฐํํ๋ ๊ฒ์ผ๋ก ์ถ์ ์๊ฐ ์๊ทธ๋-์ ๋ฌ-์ ์ง๋ฅผ ๋ชฉ๊ฒฉํ๋ฉฐ, WSTOPSIG(status)
๊ฐ ์๊ทธ๋์ ๋ฐํํ๋ค. ์๊ทธ๋์ด SIGTRAP
์ด๋ฉด ๋ค๋ฅธ ์ข
๋ฅ์ ptrace ์ ์ง์ผ ์๋ ์๋ค. ์์ธํ ๋ด์ฉ์ ์๋์ "์์คํ
-ํธ์ถ-์ ์ง" ๋ฐ "execve" ์ ์ ๋ณด๋ผ. WSTOPSIG(status)
๊ฐ ์ ์งํ(stopping) ์๊ทธ๋์ ๋ฐํํ๋ ๊ฒฝ์ฐ ๊ทธ๋ฃน-์ ์ง์ผ ์๋ ์๋ค. ์๋๋ฅผ ๋ณด๋ผ.
์ถ์ ์๊ฐ ์๊ทธ๋-์ ๋ฌ-์ ์ง๋ฅผ ๋ชฉ๊ฒฉํ ํ์ ๋ค์ ํธ์ถ๋ก ํผ์ถ์ ์๋ฅผ ์ฌ์์ํด์ผ ํ๋ค.
ptrace(PTRACE_restart, pid, 0, sig)
์ฌ๊ธฐ์ PTRACE_restart
๋ ptrace ์ฌ์์ ์์ฒญ๋ค ์ค ํ๋์ด๋ค. sig
๊ฐ 0์ด๋ฉด ์๊ทธ๋์ ์ ๋ฌํ์ง ์๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์๊ทธ๋ sig
๋ฅผ ์ ๋ฌํ๋ค. ์ด ๋งค๋ด์ผ ํ์ด์ง์์๋ ์ด ๋์์ ์๊ทธ๋ ์ฃผ์
์ด๋ผ๊ณ ํด์ ์๊ทธ๋-์ ๋ฌ-์ ์ง์ ๊ตฌ๋ถํ๋ค.
sig
๊ฐ์ด WSTOPSIG(status)
๊ฐ๊ณผ ๋ค๋ฅผ ์๋ ์๋ค. ์ฆ, ์ถ์ ์๊ฐ ๋ค๋ฅธ ์๊ทธ๋์ ์ฃผ์
์ํฌ ์ ์๋ค.
์ฐธ๊ณ ๋ก ์ต์ ๋ ์๊ทธ๋ ์ญ์๋ ์์คํ
ํธ์ถ์ด ์ผ์ฐ ๋ฐํ๋๊ฒ ํ๋ค. ์ด ๊ฒฝ์ฐ ์์คํ
ํธ์ถ์ด ์ฌ์์๋๋ค. ์ถ์ ์๊ฐ PTRACE_SYSCALL
์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํผ์ถ์ ์๊ฐ ์ค๋จ๋๋ ์์คํ
ํธ์ถ์ ์ฌ์คํ ํ๋ ๊ฒ์ (๋๋ ์ฌ์์์ ๋ค๋ฅธ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ๋ ์ผ๋ถ ์์คํ
ํธ์ถ์์ restart_syscall(2) ์์คํ
ํธ์ถ์) ๋ณด๊ฒ ๋ ๊ฒ์ด๋ค. ์๊ทธ๋ ํ์ ์ฌ์์ ๊ฐ๋ฅํ์ง ์์ (poll(2) ๊ฐ์) ์์คํ
ํธ์ถ๋ค๋ ์๊ทธ๋ ์ต์ ํ์๋ ์ฌ์์๋๋ค. ํ์ง๋ง ํผ์ถ์ ์์๊ฒ ์ด๋ค ๊ด์ฐฐ ๊ฐ๋ฅํ ์๊ทธ๋๋ ์ฃผ์
ํ์ง ์๋๋ฐ๋ ์ผ๋ถ ์์คํ
ํธ์ถ์ด EINTR
๋ก ์คํจํ๊ฒ ํ๋ ์ปค๋ ๋ฒ๊ทธ๊ฐ ์กด์ฌํ๋ค.
์๊ทธ๋-์ ๋ฌ-์ ์ง ์๋ ptrace ์ ์ง์์ ๋ด๋ฆฐ ์ฌ์์ ptrace ๋ช
๋ น์์๋ sig
๊ฐ 0์ด ์๋์ด๋ ์๊ทธ๋ ์ฃผ์
์ด ๋ณด์ฅ๋์ง ์๋๋ค. ์ด๋ค ์ค๋ฅ ๋ณด๊ณ ๋ ์์ด 0 ์๋ sig
๊ฐ ๊ทธ๋ฅ ๋ฌด์๋ ์ ์๋ค. ptrace ์ฌ์ฉ์๋ ์ด ๋ฐฉ์์ผ๋ก "์๋ก์ด ์๊ทธ๋ ์์ฑ"์ ํ๋ ค๊ณ ํ์ง ์์์ผ ํ๋ค. tgkill(2)์ ์ฌ์ฉํ๋ฉด ๋๋ค.
์๊ทธ๋-์ ๋ฌ-์ ์ง ์๋ ptrace ์ ์ง ํ ํผ์ถ์ ์๋ฅผ ์ฌ์์ํ ๋ ์๊ทธ๋ ์ฃผ์ ์์ฒญ์ด ๋ฌด์๋ ์๋ ์๋ค๋ ์ ์ด ptrace ์ฌ์ฉ์๋ค์๊ฒ ํผ๋์ ์ผ์ผํฌ ์ ์๋ค. ํํ ์ฌ๋ก ํ๋๋ ์ถ์ ์๊ฐ ๊ทธ๋ฃน-์ ์ง๋ฅผ ๋ชฉ๊ฒฉํ๊ณ ์ ์๊ทธ๋-์ ๋ฌ-์ ์ง๋ก ์ฐฉ๊ฐํ๊ณ , ๋ค์์ผ๋ก ํผ์ถ์ ์๋ฅผ ์ฌ์์ํ๋ ๊ฒ์ด๋ค.
ptrace(PTRACE_restart, pid, 0, stopsig)
stopsig
๋ฅผ ์ฃผ์
ํ๋ ค๋ ์๋์ด์ง๋ง stopsig
๊ฐ ๋ฌด์๋๊ณ ํผ์ถ์ ์๊ฐ ์คํ์ ๊ณ์ํ๋ค.
SIGCONT
์๊ทธ๋์๋ ๊ทธ๋ฃน-์ ์ง์ธ ํ๋ก์ธ์ค(์ ์ค๋ ๋ ๋ชจ๋)๋ฅผ ๊นจ์ฐ๋ ๋ถ๋ ํจ๊ณผ๊ฐ ์๋ค. ์ด ๋ถ๋ ํจ๊ณผ๋ ์๊ทธ๋-์ ๋ฌ-์ ์ง ์ ์ ๋ฐ์ํ๋ค. ์ถ์ ์๊ฐ ์ด ๋ถ๋ ํจ๊ณผ๋ฅผ ์ต์ ํ ์ ์๋ค. (์๊ทธ๋ ์ฃผ์
์ ์ต์ ํ ์ ์์ ๋ฟ์ด๋ฉฐ, ๊ทธ๋์ SIGCONT
ํธ๋ค๋ฌ๊ฐ ์ค์น๋์ด ์์ ๋ ๊ทธ ํธ๋ค๋ฌ๊ฐ ์คํ๋์ง ์๊ฒ ํ ์ ์์ ๋ฟ์ด๋ค.) ๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก๋ SIGCONT
์ ๋ฌ ์์ ์ ๋๊ธฐ ์ค์ธ ์๊ทธ๋์ด ์์๋ค๋ฉด ๊ทธ๋ฃน-์ ์ง์์ ๊นจ์ด๋ ๋ค์์ SIGCONT
์๋ ์๊ทธ๋์ ๋ํ ์๊ทธ๋-์ ๋ฌ-์ ์ง๊ฐ ์ฌ ์๋ ์๋ค. ๋ค์ ๋งํด SIGCONT
์ ์ก ํ ํผ์ถ์ ์์๊ฒ ๋ณด์ด๋ ์ฒซ ๋ฒ์งธ ์๊ทธ๋์ด SIGCONT
๊ฐ ์๋ ์๋ ์๋ค.
์ ์งํ ์๊ทธ๋์ ํ๋ก์ธ์ค(์ ์ค๋ ๋ ๋ชจ๋)๊ฐ ๊ทธ๋ฃน-์ ์ง์ ๋ค์ด๊ฐ๊ฒ ํ๋ค. ์ด ๋ถ๋ ํจ๊ณผ๋ ์๊ทธ๋ ์ฃผ์ ํ์ ์ผ์ด๋๋ฉฐ, ๋ฐ๋ผ์ ์ถ์ ์๊ฐ ์ต์ ํ ์ ์๋ค.
๋ฆฌ๋
์ค 2.4์ ๊ทธ ์ ์์๋ SIGSTOP
์๊ทธ๋์ ์ฃผ์
ํ ์ ์๋ค.
PTRACE_GETSIGINFO
๋ฅผ ์ด์ฉํด ์ ๋ฌ ์๊ทธ๋์ ๋์ํ๋ siginfo_t
๊ตฌ์กฐ์ฒด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค. PTRACE_SETSIGINFO
๋ฅผ ์ด์ฉํด ๋ณ๊ฒฝํ ์๋ ์๋ค. PTRACE_SETSIGINFO
๋ฅผ ์ฌ์ฉํด siginfo_t
๋ฅผ ๋ฐ๊พธ๋ ๊ฒฝ์ฐ si_signo
ํ๋์ ์ฌ์์ ๋ช
๋ น์ sig
๋งค๊ฐ๋ณ์๊ฐ ์ผ์นํด์ผ ํ๋ฉฐ, ๊ทธ๋ ์ง ์์ ๋์ ๊ฒฐ๊ณผ๊ฐ ๊ท์ ๋์ด ์์ง ์๋ค.
(๋ค์ค ์ค๋ ๋์ผ ์ ์๋) ํ๋ก์ธ์ค๊ฐ ์ ์งํ ์๊ทธ๋์ ์์ ํ๋ฉด ๋ชจ๋ ์ค๋ ๋๊ฐ ๋ฉ์ถ๋ค. ๊ทธ ์ค ์ถ์ ๋์์ธ ์ค๋ ๋๊ฐ ์์ผ๋ฉด ๊ทธ๋ฃน-์ ์ง๋ก ๋ค์ด๊ฐ๋ค. ์ฐธ๊ณ ๋ก ์ ์งํ ์๊ทธ๋์ ๋จผ์ (ํผ์ถ์ ์ ํ๋์์๋ง) ์๊ทธ๋-์ ๋ฌ-์ ์ง๋ฅผ ์ผ์ผํค๊ณ , ์ถ์ ์๊ฐ ๊ทธ ์๊ทธ๋์ ์ฃผ์ ํ๊ณ ๋์์ผ (๋๋ ์ถ์ ๋์ ์๋ ์ค๋ ๋๊ฐ ๊ฐ์ ธ๊ฐ๊ณ ๋์์ผ) ๋ค์ค ์ค๋ ๋ ํ๋ก์ธ์ค ๋ด ๋ชจ๋ ํผ์ถ์ ์์์ ๊ทธ๋ฃน-์ ์ง๊ฐ ๊ฐ์๋๋ค. ์ธ์ ๋์ฒ๋ผ ๋ชจ๋ ํผ์ถ์ ์๊ฐ ๋์ํ๋ ์ถ์ ์์๊ฒ ๊ฐ๊ธฐ ์์ ์ ๊ทธ๋ฃน-์ ์ง๋ฅผ ์๋ฆฐ๋ค.
waitpid(2)๊ฐ WIFSTOPPED(status)
๋ฅผ ์ฐธ์ผ๋ก ๋ฐํํ๋ ๊ฒ์ผ๋ก ์ถ์ ์๊ฐ ๊ทธ๋ฃน-์ ์ง๋ฅผ ๋ชฉ๊ฒฉํ๋ฉฐ, WSTOPSIG(status)
๋ฅผ ํตํด ๊ทธ ์ ์งํ ์๊ทธ๋์ ์ป์ ์ ์๋ค. ๋ช๋ช ๋ค๋ฅธ ptrace ์ ์ง ์ ํ์์๋ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ฏ๋ก ๋ค์ ํธ์ถ์ ์ํํด ๋ณด๊ธฐ๋ฅผ ๊ถ์ฅํ๋ค.
ptrace(PTRACE_GETSIGINFO, pid, 0, &siginfo)
์๊ทธ๋์ด SIGSTOP
, SIGTSTP
, SIGTTIN
, SIGTTOU
๊ฐ ์๋๋ฉด ํธ์ถ์ ํผํ ์ ์๋ค. ์ด ๋ค ๊ฐ์ง ์๊ทธ๋๋ง ์ ์งํ ์๊ทธ๋์ด๊ธฐ ๋๋ฌธ์ด๋ค. ์ถ์ ์์๊ฒ ๋ค๋ฅธ ๋ญ๊ฐ๊ฐ ๋ณด์ธ๋ค๋ฉด ๊ทธ๋ฃน-์ ์ง์ผ ์๊ฐ ์๋ค. ๊ทธ ์ธ ๊ฒฝ์ฐ์ ์ถ์ ์๊ฐ PTRACE_GETSIGINFO
๋ฅผ ํธ์ถํ ํ์๊ฐ ์๋ค. PTRACE_GETSIGINFO
๊ฐ EINVAL
๋ก ์คํจํ๋ค๋ฉด ํ์คํ ๊ทธ๋ฃน-์ ์ง์ด๋ค. (๋ค๋ฅธ ์คํจ ์ฝ๋๋ ๊ฐ๋ฅํ๋ค. ๊ฐ๋ น SIGKILL
๋๋ฌธ์ ํผ์ถ์ ์๊ฐ ์ฃฝ์์ผ๋ฉด ESRCH
("no such process")๋ก ์คํจํ๋ค.)
PTRACE_SEIZE
๋ก ํผ์ถ์ ์์๊ฒ ๋ถ์๋ค๋ฉด PTRACE_EVENT_STOP
์ด, ์ฆ status>>16 == PTRACE_EVENT_STOP
์ด ๊ทธ๋ฃน-์ ์ง๋ฅผ ๋ํ๋ธ๋ค. ๊ทธ๋์ ์ถ๊ฐ์ ์ธ PTRACE_GETSIGINFO
ํธ์ถ์ ํ ํ์ ์์ด ๊ทธ๋ฃน-์ ์ง๋ฅผ ํ์งํ ์ ์๋ค.
๋ฆฌ๋
์ค 2.6.38 ๊ธฐ์ค์ผ๋ก, ์ถ์ ์๊ฐ ํผ์ถ์ ์์ ptrace ์ ์ง๋ฅผ ๋ณธ ๋ค์ ์ฌ์์ํ๊ฑฐ๋ ์ฃฝ์ด๊ธฐ ์ ๊น์ง๋ ํผ์ถ์ ์๊ฐ ๋์ง ์์ผ๋ฉฐ, ์ถ์ ์๊ฐ ๋ค๋ฅธ waitpid(2) ํธ์ถ๋ก ๋ค์ด๊ฐ๋ ๊ฒฝ์ฐ์๋ ์ถ์ ์์๊ฒ (SIGKILL
์ฃฝ์์ ์ ์ธํ๊ณ ) ์๋ฆผ์ ๋ณด๋ด์ง ์๊ฒ ๋๋ค.
์ ๋ฌธ๋จ์์ ๊ธฐ์ ํ ์ปค๋ ๋์ ๋ฐฉ์์ด ์ ์งํ ์๊ทธ๋์ ํฌ๋ช
ํ๊ฒ ์ฒ๋ฆฌํ๋ ๋ฐ ๋ฌธ์ ๋ฅผ ์ผ์ผํจ๋ค. ์ถ์ ์๊ฐ ๊ทธ๋ฃน-์ ์ง ํ์ ํผ์ถ์ ์๋ฅผ ์ฌ์์ํ๋ฉด ๊ทธ ์ ์งํ ์๊ทธ๋์ด ์ค์ง์ ์ผ๋ก ๋ฌด์๋๋ค. ์ฆ, ํผ์ถ์ ์๊ฐ ์ ์ง๋ผ ์์ง ์๊ณ ๋๋ค. ์ถ์ ์๊ฐ ๋ค์ waitpid(2) ์ง์
์ ์ ํผ์ถ์ ์๋ฅผ ์ฌ์์ํ์ง ์์ผ๋ฉด ์ดํ์ SIGCONT
์๊ทธ๋์ด ์ถ์ ์์๊ฒ ๋ณด๊ณ ๋์ง ์๊ฒ ๋๋ค. ๊ทธ๋ฌ๋ฉด SIGCONT
์๊ทธ๋์ด ํผ์ถ์ ์์๊ฒ ์๋ฌด ํจ๊ณผ๋ ์ฃผ์ง ๋ชปํ๊ฒ ๋ ๊ฒ์ด๋ค.
๋ฆฌ๋
์ค 3.4๋ถํฐ๋ ์ด ๋ฌธ์ ๋ฅผ ๊ทน๋ณตํ ๋ฐฉ๋ฒ์ด ์๋ค. PTRACE_CONT
๋์ PTRACE_LISTEN
๋ช
๋ น์ ์ฌ์ฉํ๋ฉด ํผ์ถ์ ์๊ฐ ์คํ์ ํ์ง ์์ง๋ง (SIGCONT
๋ก ์ฌ์์๋ ๋์ฒ๋ผ) waitpid(2)๋ฅผ ํตํด ์๋ฆด ์ ์๋ ์ ์ด๋ฒคํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ฒ ๋๋ ๋ฐฉ์์ผ๋ก ํผ์ถ์ ์๋ฅผ ์ฌ์์ํ ์ ์๋ค.
์ถ์ ์๊ฐ PTRACE_O_TRACE_*
์ต์
์ ์ค์ ํ๋ฉด ํผ์ถ์ ์๊ฐ PTRACE_EVENT
์ ์ง๋ผ๊ณ ํ๋ ptrace ์ ์ง์ ๋ค์ด๊ฐ๊ฒ ๋๋ค.
waitpid(2)๊ฐ WIFSTOPPED(status)
๋ฅผ ๋ฐํํ๋ ๊ฒ์ผ๋ก ์ถ์ ์๊ฐ ๊ทธ๋ฃน-์ ์ง๋ฅผ ๋ชฉ๊ฒฉํ๋ฉฐ, WSTOPSIG(status)
๋ SIGTRAP
์ ๋ฐํํ๋ค. ์ํ ์๋์ ์์ ๋ฐ์ดํธ์ ๋นํธ๊ฐ ์ถ๊ฐ๋ก ์ค์ ๋์ด status>>8
๊ฐ์ด ๋ค์๊ณผ ๊ฐ์ด ๋๋ค.
(SIGTRAP | PTRACE_EVENT_foo << 8)
๋ค์ ์ด๋ฒคํธ๋ค์ด ์๋ค.
PTRACE_EVENT_VFORK
-
vfork(2)๋
CLONE_VFORK
ํ๋๊ทธ ์ฌ์ฉ clone(2)์์ ๋ฐํํ๊ธฐ ์ ์ ๋ฉ์ถ๋ค. ์ด ์ ์ง ํ์ ํผ์ถ์ ์๋ฅผ ์ํ์ํค๋ฉด ์์์ด exit/exec ํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฐ ํ์ ์คํ์ ๊ณ์ํ ๊ฒ์ด๋ค. (์ฆ ์ผ๋ฐ์ ์ธ vfork(2) ๋์์ด๋ค.) PTRACE_EVENT_FORK
-
fork(2)๋ ์ข
๋ฃ ์๊ทธ๋์
SIGCHLD
๋ก ์ค์ ํ clone(2)์์ ๋ฐํํ๊ธฐ ์ ์ ๋ฉ์ถ๋ค. PTRACE_EVENT_CLONE
- clone(2)์์ ๋ฐํํ๊ธฐ ์ ์ ๋ฉ์ถ๋ค.
PTRACE_EVENT_VFORK_DONE
-
vfork(2)๋
CLONE_VFORK
ํ๋๊ทธ ์ฌ์ฉ clone(2)์์ ๋ฐํํ๊ธฐ ์ ์, ๊ทธ๋ฌ๋ฉด์ ์์์ด exit๋ exec๋ก ํผ์ถ์ ์๋ฅผ ํ์ด ์ค ํ์ ๋ฉ์ถ๋ค.
์์ ๋ค ๊ฐ์ง ์ ์ง ๋ชจ๋ ์๋ก ์์ฑ๋ ์ค๋ ๋๊ฐ ์๋๋ผ ๋ถ๋ชจ(์ฆ ํผ์ถ์ ์)์์ ์ ์ง๊ฐ ์ผ์ด๋๋ค. PTRACE_GETEVENTMSG
๋ฅผ ์ด์ฉํด ์ ์ค๋ ๋์ ID๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
PTRACE_EVENT_EXEC
-
execve(2) ๋ฐํ ์ ์ ์ ์งํ๋ค. ๋ฆฌ๋
์ค 3.0๋ถํฐ
PTRACE_GETEVENTMSG
๊ฐ ์ด์ ์ค๋ ๋ ID๋ฅผ ๋ฐํํ๋ค. PTRACE_EVENT_EXIT
- ์ข
๋ฃ(exit_group(2)์ผ๋ก ์ฃฝ๋ ๊ฒ ํฌํจ)๋ ์๊ทธ๋ ์ฃฝ์, ๋ค์ค ์ค๋ ๋ ํ๋ก์ธ์ค์์ execve(2)์ ์ํ ์ข
๋ฃ ์ ์ ์ ์งํ๋ค.
PTRACE_GETEVENTMSG
๊ฐ ์ข ๋ฃ ์ํ๋ฅผ ๋ฐํํ๋ค. ("์ง์ง" ์ข ๋ฃ๊ฐ ์ผ์ด๋ฌ์ ๋์ ๋ฌ๋ฆฌ) ๋ ์ง์คํฐ๋ฅผ ์กฐ์ฌํ ์ ์๋ค. ํผ์ถ์ ์๊ฐ ์ฌ์ ํ ์ด์ ์๋ค.PTRACE_CONT
๋PTRACE_DETACH
ํด ์ฃผ์ด์ผ ์ข ๋ฃ๊ฐ ๋ง๋ฌด๋ฆฌ๋๋ค. PTRACE_EVENT_STOP
-
PTRACE_INTERRUPT
๋ช ๋ น์ด๋ ๊ทธ๋ฃน-์ ์ง, ์ ์์์ ๋ถ์์ ๋์ (PTRACE_SEIZE
๋ก ๋ถ์ ๊ฒฝ์ฐ์๋ง) ์ต์ด ptrace ์ ์ง์ ์ํด ์ ๋ฐ๋๋ ์ ์ง. PTRACE_EVENT_SECCOMP
- ์ถ์ ์๊ฐ
PTRACE_O_TRACESECCOMP
๋ฅผ ์ค์ ํ์ ๋ ํผ์ถ์ ์ ์์คํ ํธ์ถ ์ง์ ์ seccomp(2) ๊ท์น์ ์ํ ์ ์ง. seccomp ์ด๋ฒคํธ ๋ฉ์์ง ๋ฐ์ดํฐ(seccomp ํํฐ ๊ท์น์SECCOMP_RET_DATA
๋ถ๋ถ)๋ฅผPTRACE_GETEVENTMSG
๋ก ๊ฐ์ ธ์ฌ ์ ์๋ค. ์ด ์ ์ง์ ๋์ ๋ฐฉ์์ ์๋์ ๋ณ๋ ์ ์์ ์์ธํ ์ค๋ช ํ๋ค.
PTRACE_EVENT
์ ์ง์์ PTRACE_GETSIGINFO
๋ si_signo
์ SIGTRAP
์ ๋ฐํํ๋ฉฐ si_code
๊ฐ (event<<8) | SIGTRAP
์ผ๋ก ์ค์ ๋์ด ์๋ค.
ํผ์ถ์ ์๊ฐ PTRACE_SYSCALL
์ด๋ PTRACE_SYSEMU
๋ก ์ฌ์์๋์ผ๋ฉด ํผ์ถ์ ์๊ฐ ์์คํ
ํธ์ถ์ ์ง์
ํ๊ธฐ ์ง์ ์ ์์คํ
-ํธ์ถ-์ ์ง์ ๋ค์ด๊ฐ๋ค. (PTRACE_SYSEMU
๋ก ์ฌ์์์ด ์ด๋ค์ก์ผ๋ฉด ์ด ์ง์ ์์ ๋ ์ง์คํฐ๋ฅผ ์ด๋ป๊ฒ ๋ฐ๊พธ๊ณ ์ด ์ ์ง ํ์ ํผ์ถ์ ์๋ฅผ ์ด๋ป๊ฒ ์ฌ์์ํ๋์ง์ ์๊ด์์ด ๊ทธ ์์คํ
ํธ์ถ์ ์คํ๋์ง ์๋๋ค.) ์์คํ
-ํธ์ถ-์ ์ง๋ฅผ ์ ๋ฐํ ๋ฐฉ๋ฒ์ด ๋ฌด์์ด๋ ๊ฐ์, ์ถ์ ์๊ฐ PTRACE_SYSCALL
๋ก ํผ์ถ์ ์๋ฅผ ์ฌ์์ํ๋ฉด ์์คํ
ํธ์ถ์ด ๋๋ ๋, ๋๋ ์๊ทธ๋๋ก ์ค๋จ๋ ๋ ํผ์ถ์ ์๊ฐ ์์คํ
-ํธ์ถ-ํด์ฅ-์ ์ง์ ๋ค์ด๊ฐ๋ค. (๋งํ์๋ฉด ์๊ทธ๋-์ ๋ฌ-์ ์ง๊ฐ ์ ๋๋ก ์์คํ
-ํธ์ถ-์ง์
-์ ์ง์ ์์คํ
-ํธ์ถ-ํด์ฅ-์ ์ง ์ฌ์ด์์ ์ผ์ด๋์ง ์๋๋ค. ์์คํ
-ํธ์ถ-ํด์ฅ-์ ์ง ํ์ ์ผ์ด๋๋ค.) ๋ค๋ฅธ ๋ฐฉ๋ฒ(PTRACE_SYSEMU
ํฌํจ)์ผ๋ก ํผ์ถ์ ์๋ฅผ ์ํ์ํค๋ฉด ์์คํ
-ํธ์ถ-ํด์ฅ-์ ์ง๊ฐ ์ผ์ด๋์ง ์๋๋ค. ์ฐธ๊ณ ๋ก PTRACE_SYSEMU
์ ๋ํ ์ธ๊ธ ๋ด์ฉ์ด ๋ชจ๋ PTRACE_SYSEMU_SINGLESTEP
์ ๋์ผํ๊ฒ ์ ์ฉ๋๋ค.
ํ์ง๋ง PTRACE_SYSCALL
๋ก ํผ์ถ์ ์๋ฅผ ์ํ์ํจ ๊ฒฝ์ฐ์๋ ๋ค์ ์ ์ง๊ฐ ์์คํ
-ํธ์ถ-ํด์ฅ-์ ์ง๊ฐ ๋๋ค๊ณ ๋ณด์ฅ๋์ง๋ ์๋๋ค. ๊ทธ๋ ์ง ์๊ณ ํผ์ถ์ ์๊ฐ (seccomp ์ ์ง๋ฅผ ํฌํจํ) PTRACE_EVENT
์ ์ง์์ ๋ฉ์ถ๊ฑฐ๋, (_exit(2)๋ exit_group(2)์ ๋ค์ด๊ฐ๋ ๊ฒ์ด๋ฉด) ์ข
๋ฃํ๊ฑฐ๋, SIGKILL
์ ์ํด ์ฃฝ๊ฑฐ๋, ์กฐ์ฉํ ์ฃฝ์ ์๋ (ํผ์ถ์ ์๊ฐ ์ค๋ ๋ ๊ทธ๋ฃน ๋ฆฌ๋์ด๊ณ , ๋ค๋ฅธ ์ค๋ ๋์์ execve(2)๊ฐ ์ด๋ค์ง๊ณ , ๊ทธ ์ค๋ ๋๋ฅผ ๋์ผ ์ถ์ ์๊ฐ ์ถ์ ํ๊ณ ์์ง ์์ ๋. ์ ์ ํ ์ด ๊ฒฝ์ฐ๋ฅผ ๋
ผ์ํจ.) ์๋ค.
waitpid(2)๊ฐ WIFSTOPPED(status)
๋ฅผ ์ฐธ์ผ๋ก ๋ฐํํ๋ ๊ฒ์ผ๋ก ์ถ์ ์๊ฐ ์์คํ
-ํธ์ถ-์ง์
-์ ์ง์ ์์คํ
-ํธ์ถ-ํด์ฅ-์ ์ง๋ฅผ ๋ชฉ๊ฒฉํ๋ฉฐ, WSTOPSIG(status)
๋ SIGTRAP
์ ๋ด๋๋๋ค. ์ถ์ ์๊ฐ PTRACE_O_TRACESYSGOOD
์ต์
์ ์ค์ ํ์ผ๋ฉด WSTOPSIG(status)
๊ฐ (SIGTRAP | 0x80)
๊ฐ์ ๋ด๋๊ฒ ๋๋ค.
์์คํ
-ํธ์ถ-์ ์ง๋ฅผ SIGTRAP
์๊ทธ๋-์ ๋ฌ-์ ์ง์ ๊ตฌ๋ณํ๋ ค๋ฉด PTRACE_GETSIGINFO
๋ฅผ ์ง์ํด์ ๋ค์ ๊ฒฝ์ฐ๋ฅผ ํ์ธํ๋ฉด ๋๋ค.
si_code <= 0
- ์์คํ ํธ์ถ(tgkill(2), kill(2), sigqueue(3) ๋ฑ) ๊ฐ์ ์ฌ์ฉ์ ๊ณต๊ฐ ํ๋์ด๋ POSIX ํ์ด๋จธ์ ๋ง๋ฃ, POSIX ๋ฉ์์ง ํ์์์ ์ํ ๋ณํ, ๋น๋๊ธฐ I/O ์์ฒญ์ ์๋ฃ์ ์ํด์
-
si_code == SI_KERNEL
(0x80) - ์ปค๋์ด
SIGTRAP
์ ๋ณด๋๋ค. -
si_code == SIGTRAP
๋๋si_code == (SIGTRAP|0x80)
- ์์คํ -ํธ์ถ-์ ์ง์ด๋ค.
SIGTRAP
์ด ์ ๋ฌ๋์๋ค.
ํ์ง๋ง ์์คํ
-ํธ์ถ-์ ์ง๊ฐ ๋งค์ฐ ์์ฃผ (์์คํ
ํธ์ถ๋น ๋ ๋ฒ์ฉ) ์ผ์ด๋๋ฏ๋ก ์์คํ
-ํธ์ถ-์ ์ง๋ง๋ค PTRACE_GETSIGINFO
๋ฅผ ์ํํ๋ ๊ฒ์ ๋น์ฉ์ด ์ข ๋์ ์๋ ์๋ค.
์ผ๋ถ ์ํคํ
์ฒ์์๋ ๋ ์ง์คํฐ๋ฅผ ๊ฒ์ฌํด์ ๊ทธ ๊ฒฝ์ฐ๋ค์ ๊ตฌ๋ณํ ์ ์๋ค. ์๋ฅผ ๋ค์ด x86์์๋ ์์คํ
-ํธ์ถ-์ง์
-์ ์ง์์ rax == -ENOSYS
์ด๋ค. SIGTRAP
์ด (๋ค๋ฅธ ์๊ทธ๋๋ค๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก) ์ธ์ ๋ ์์คํ
-ํธ์ถ-ํด์ฅ-์ ์ง ํ์ ๋ฐ์ํ๋ฉฐ ๊ทธ ์์ ์ rax
๊ฐ -ENOSYS
๋ฅผ ๋ด์ ๊ฐ๋ฅ์ฑ์ ๊ฑฐ์ ์์ผ๋ฏ๋ก SIGTRAP
์ "์์คํ
-ํธ์ถ-์ง์
-์ ์ง ์๋ ์์คํ
-ํธ์ถ-์ ์ง"์ฒ๋ผ ๋ณด์ธ๋ค. ๋ค์ ๋งํด "์ง ์์ ์์คํ
-ํธ์ถ-ํด์ฅ-์ ์ง"์ฒ๋ผ ๋ณด์ด๋ฏ๋ก ์ด ๋ฐฉ๋ฒ์ผ๋ก ํ์งํ ์ ์๋ค. ํ์ง๋ง ๊ทธ๋ฐ ํ์ง ๋ฐฉ๋ฒ์ ์๋ชป๋๊ธฐ ์ฌ์ฐ๋ฏ๋ก ๊ฐ๊ธ์ ํผํ๋ ๊ฒ ์ข๋ค.
์์คํ
-ํธ์ถ-์ ์ง๋ฅผ ๋ค๋ฅธ ์ข
๋ฅ์ ptrace ์ ์ง๋ค๊ณผ ๊ตฌ๋ณํ๊ธฐ ์ํ ๊ถ์ฅํ๋ ๋ฐฉ์์ PTRACE_O_TRACESYSGOOD
์ต์
์ ์ฐ๋ ๊ฒ์ด๋ค. ๋ฏฟ์ ์ ์์ผ๋ฉฐ ์ฑ๋ฅ ๋น์ฉ์ ์ ๋ฐํ์ง ์๋๋ค.
์ถ์ ์์๊ฒ ์์คํ
-ํธ์ถ-์ง์
-์ ์ง์ ์์คํ
-ํธ์ถ-ํด์ฅ-์ ์ง๋ ๊ตฌ๋ณ์ด ๋ถ๊ฐ๋ฅํ๋ค. ์์คํ
-ํธ์ถ-์ง์
-์ ์ง๋ฅผ ์์คํ
-ํธ์ถ-ํด์ฅ-์ ์ง๋ก, ๋๋ ๊ทธ ๋ฐ๋๋ก ์๋ชป ํด์ํ์ง ์์ผ๋ ค๋ฉด ์ถ์ ์์์ ptrace ์ ์ง๋ค์ ์ถ์ ํ ํ์๊ฐ ์๋ค. ์ผ๋ฐ์ ์ผ๋ก ์์คํ
-ํธ์ถ-์ง์
-์ ์ง ๋ค์์๋ ํญ์ ์์คํ
-ํธ์ถ-ํด์ฅ-์ ์ง๋ PTRACE_EVENT
์ ์ง, ๋๋ ํผ์ถ์ ์์ ์ฃฝ์์ด ๋ฐ๋ผ์จ๋ค. ๊ทธ ์ฌ์ด์์ ๋ค๋ฅธ ์ด๋ค ์ข
๋ฅ์ ptrace ์ ์ง๋ ์ผ์ด๋ ์ ์๋ค. ํ์ง๋ง seccomp ์ ์ง(์๋ ์ฐธ๊ณ )๋ ์ ํํ๋ ์์คํ
-ํธ์ถ-์ง์
-์ ์ง ์์ด ์์คํ
-ํธ์ถ-ํด์ฅ-์ ์ง๋ฅผ ์ผ์ผํฌ ์ ์๋ค. seccomp๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ทธ๋ฐ ์ ์ง๋ฅผ ์์คํ
-ํธ์ถ-์ง์
-์ ์ง๋ก ์๋ชป ํด์ํ์ง ์๋๋ก ์ฃผ์๋ฅผ ๊ธฐ์ธ์ผ ํ์๊ฐ ์๋ค.
์์คํ
-ํธ์ถ-์ง์
-์ ์ง ํ์ ์ถ์ ์๊ฐ PTRACE_SYSCALL
์ธ์ ์ฌ์์ ๋ช
๋ น์ ์ฌ์ฉํ๋ฉด ์์คํ
-ํธ์ถ-ํด์ฅ-์ ์ง๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
์์คํ
-ํธ์ถ ์ ์ง์์ PTRACE_GETSIGINFO
๋ si_signo
์ SIGTRAP
์ ๋ฐํํ๋ฉฐ si_code
๊ฐ SIGTRAP
์ด๋ (SIGTRAP|0x80)
์ผ๋ก ์ค์ ๋์ด ์๋ค.
PTRACE_EVENT_SECCOMP
์ ์ง์ ๋์๊ณผ ๋ค๋ฅธ ptrace ์ ์ง๋ค๊ณผ์ ์ํธ ์์ฉ ๋ฐฉ์์ด ์ปค๋ ๋ฒ์ ์ ๋ฐ๋ผ ๋ฐ๋์๋ค. ์ฌ๊ธฐ์๋ ๋์
๋๋ถํฐ ๋ฆฌ๋
์ค 4.7๊น์ง์ ๋์ ๋ฐฉ์์ ์ ๋๋ค. ์ดํ ์ปค๋ ๋ฒ์ ์์์ ๋์์ ๋ค์ ์ ์ ์ ๋๋ค.
SECCOMP_RET_TRACE
๊ท์น์ด ๊ฑธ๋ฆด ๋๋ง๋ค PTRACE_EVENT_SECCOMP
์ ์ง๊ฐ ์ผ์ด๋๋ค. ์ด๋ค ๋ฐฉ๋ฒ์ผ๋ก ์์คํ
ํธ์ถ์ ์ฌ์์ํ๋์ง์๋ ๋ฌด๊ดํ๋ค. ํนํ PTRACE_SYSEMU
๋ก ํผ์ถ์ ์๋ฅผ ์ฌ์์ํด์ ์ด ์์คํ
ํธ์ถ์ ๋ฌด์กฐ๊ฑด ๊ฑด๋๋ฐ๋ ๊ฒฝ์ฐ์๋ seccomp๊ฐ ๋์ํ๋ค.
์ด ์ ์ง์์ ์ฌ์์ํ๋ฉด ํด๋น ์์คํ
ํธ์ถ ๋ฐ๋ก ์ ์์ ์ ์ง๊ฐ ์ผ์ด๋ฌ๋ ๊ฒ์ฒ๋ผ ๋์ํ๊ฒ ๋๋ค. ํนํ PTRACE_SYSCALL
๊ณผ PTRACE_SYSEMU
๋ชจ๋ ์ ์์ ์ผ๋ก ์ด์ด์ง๋ ์์คํ
-ํธ์ถ-์ง์
-์ ์ง๋ฅผ ์ผ์ผํค๊ฒ ๋๋ค. ํ์ง๋ง PTRACE_EVENT_SECCOMP
ํ์ ์์คํ
ํธ์ถ ๋ฒํธ๊ฐ ์์์ด๋ฉด ์์คํ
-ํธ์ถ-์ง์
-์ ์ง์ ์์คํ
ํธ์ถ ์์ฒด๋ฅผ ๊ฑด๋๋ฐ๊ฒ ๋๋ค. ์ฆ, PTRACE_EVENT_SECCOMP
ํ์ ์์คํ
ํธ์ถ ๋ฒํธ๊ฐ ์์์ด๊ณ PTRACE_SYSCALL
๋ก ํผ์ถ์ ์๋ฅผ ์ฌ์์ํ๋ ๊ฒฝ์ฐ์ ๋ค์์ผ๋ก ๋ชฉ๊ฒฉํ๋ ์ ์ง๋ ์ด์ฉ๋ฉด ์์ํ์ ์์คํ
-ํธ์ถ-์ง์
-์ ์ง๊ฐ ์๋๋ผ ์์คํ
-ํธ์ถ-ํด์ฅ-์ ์ง๊ฐ ๋๋ค.
๋ฆฌ๋
์ค 4.8๋ถํฐ๋ PTRACE_EVENT_SECCOMP
์ ์ง๊ฐ ์์คํ
-ํธ์ถ-์ง์
-์ ์ง์ ์์คํ
-ํธ์ถ-ํด์ฅ-์ ์ง ์ฌ์ด์์ ์ผ์ด๋๋๋ก ์์๊ฐ ๋ฐ๋์๋ค. ๊ทธ๋์ PTRACE_SYSEMU
๋๋ฌธ์ ์์คํ
ํธ์ถ์ ๊ฑด๋๋ฐ๋ ๊ฒฝ์ฐ seccomp์ด ๋ ์ด์ ๋์ง ์๋๋ค. (๊ทธ๋์ PTRACE_EVENT_SECCOMP
๊ฐ ๋ณด๊ณ ๋์ง ์๋๋ค.)
๊ธฐ๋ฅ์ ์ผ๋ก PTRACE_EVENT_SECCOMP
์ ์ง๋ ์์คํ
-ํธ์ถ-์ง์
-์ ์ง์ ๋น์ทํ๊ฒ ๊ธฐ๋ฅํ๋ค. (์ฆ, PTRACE_SYSCALL
๋ก ์ํ์ํค๋ฉด ์์คํ
-ํธ์ถ-ํด์ฅ-์ ์ง๊ฐ ๋ฐ์ํ๊ณ , ์์คํ
ํธ์ถ ๋ฒํธ๋ฅผ ๋ฐ๊ฟ ์ ์์ผ๋ฉฐ, ๋ค๋ฅธ ๋ ์ง์คํฐ๋ฅผ ๋ณ๊ฒฝํ๋ฉด ๊ทธ ๋ด์ฉ ์ญ์ ์คํ๋ ์์คํ
ํธ์ถ์๊ฒ ๋ณด์ธ๋ค.) ์ฐธ๊ณ ๋ก ์ ํ ์์คํ
-ํธ์ถ-์ง์
-์ ์ง๊ฐ ์์ ์๋ ์์ง๋ง ๊ผญ ์์ด์ผ ํ๋ ๊ฒ์ ์๋๋ค.
PTRACE_EVENT_SECCOMP
์ ์ง ํ์ SECCOMP_RET_ALLOW
์ ๊ฐ์ ๊ธฐ๋ฅ์ ํ๋ SECCOMP_RET_TRACE
๊ท์น์ผ๋ก seccomp๋ฅผ ๋ค์ ๋๋ฆฌ๊ฒ ๋๋ค. ์ด๊ฒ ๋ถ๋ช
ํ๊ฒ ๋ปํ๋ ๋ฐ๋ PTRACE_EVENT_SECCOMP
์ ์ง ์ค ๋ ์ง์คํฐ๋ค์ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉด ์์คํ
ํธ์ถ์ด ํ์ฉ๋๋ค๋ ๊ฒ์ด๋ค.
[์ด ์ ์ง ์ ํ์ ๋ํ ์ธ๋ถ ๋ด์ฉ์ ์์ง ๋ฌธ์ํ๊ฐ ์ด๋ค์ง์ง ์์๋ค.]
๋๋ถ๋ถ์ (PTRACE_ATTACH
, PTRACE_SEIZE
, PTRACE_TRACEME
, PTRACE_INTERRUPT
, PTRACE_KILL
์ ์ ์ธํ ๋ชจ๋ ) ptrace ๋ช
๋ น์๋ ptrace ์ ์ง ์ํ์ ํผ์ถ์ ์๊ฐ ํ์ํ๋ฉฐ, ์์ผ๋ฉด ESRCH
๋ก ์คํจํ๋ค.
ํผ์ถ์ ์๊ฐ ptrace ์ ์ง ์ํ์ ์์ ๋ ์ถ์ ์๊ฐ ์ ๋ณดํ ๋ช ๋ น๋ค์ ์ด์ฉํด ํผ์ถ์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ธ ์ ์๋ค. ์ด ๋ช ๋ น๋ค์ ํผ์ถ์ ์๋ฅผ ptrace ์ ์ง ์ํ ๊ทธ๋๋ก ๋๋ค.
ptrace(PTRACE_PEEKTEXT/PEEKDATA/PEEKUSER, pid, addr, 0);
ptrace(PTRACE_POKETEXT/POKEDATA/POKEUSER, pid, addr, long_val);
ptrace(PTRACE_GETREGS/GETFPREGS, pid, 0, &struct);
ptrace(PTRACE_SETREGS/SETFPREGS, pid, 0, &struct);
ptrace(PTRACE_GETREGSET, pid, NT_foo, &iov);
ptrace(PTRACE_SETREGSET, pid, NT_foo, &iov);
ptrace(PTRACE_GETSIGINFO, pid, 0, &siginfo);
ptrace(PTRACE_SETSIGINFO, pid, 0, &siginfo);
ptrace(PTRACE_GETEVENTMSG, pid, 0, &long_var);
ptrace(PTRACE_SETOPTIONS, pid, 0, PTRACE_O_flags);
์ฐธ๊ณ ๋ก ์ผ๋ถ ์ค๋ฅ๋ค์ ๋ณด๊ณ ๊ฐ ๋์ง ์๋๋ค. ์๋ฅผ ๋ค์ด ์ผ๋ถ ptrace ์ ์ง๋ค์์๋ ์๊ทธ๋ ์ ๋ณด(siginfo
) ์ค์ ์ด ํจ๊ณผ๊ฐ ์์ ์๋ ์๋๋ฐ, ๊ทธ๋๋ ํธ์ถ์ด ์ฑ๊ณต์ ๋ฐํํ (0์ ๋ฐํํ๊ณ errno
๋ฅผ ์ค์ ํ์ง ์์) ์ ์๋ค. ๋ ํ์ฌ ptrace ์ ์ง์์ ์ด๋ค ์๋ฏธ ์๋ ์ด๋ฒคํธ ๋ฉ์์ง๋ฅผ ๋ฐํํ๋ค๊ณ ๋์ด ์์ง ์์๋ฐ PTRACE_GETEVENTMSG
์ง์๋ฅผ ํ๋ฉด ์ฑ๊ณตํ๋ฉด์ ์ด๋ค ์์ ๊ฐ์ ๋ฐํํ ์ ์๋ค.
๋ค์ ํธ์ถ์ ํ ํผ์ถ์ ์์ ์ํฅ์ ์ค๋ค.
ptrace(PTRACE_SETOPTIONS, pid, 0, PTRACE_O_flags);
๊ทธ ํผ์ถ์ ์์ ํ์ฌ ํ๋๊ทธ๊ฐ ๋ฐ๋๋ค. PTRACE_O_TRACEFORK
, PTRACE_O_TRACEVFORK
, PTRACE_O_TRACECLONE
์ต์
์ ํตํด ์์ฑ ๋ฐ "์๋ ๋ถ๊ธฐ" ๋ ์ ํผ์ถ์ ์๋ค์ด ๊ทธ ํ๋๊ทธ๋ฅผ ๋ฌผ๋ ค๋ฐ๋๋ค.
๋ ๋ค๋ฅธ ๋ช ๋ น๋ค์ ptrace ์ ์ง ์ํ์ธ ํผ์ถ์ ์๊ฐ ๋๊ฒ ํ๋ค. ๋ค์ ํํ์ด๋ค.
ptrace(cmd, pid, 0, sig);
์ฌ๊ธฐ์ cmd
๋ PTRACE_CONT
, PTRACE_LISTEN
, PTRACE_DETACH
, PTRACE_SYSCALL
, PTRACE_SINGLESTEP
, PTRACE_SYSEMU
, PTRACE_SYSEMU_SINGLESTEP
์ค ํ๋์ด๋ค. ํผ์ถ์ ์๊ฐ ์๊ทธ๋-์ ๋ฌ-์ ์ง์ ์๋ ๊ฒฝ์ฐ sig
๋ (0 ์๋ ๊ฒฝ์ฐ) ์ฃผ์
ํ ์๊ทธ๋์ด๋ค. ๊ทธ ์ธ์ ๊ฒฝ์ฐ sig
๋ ๋ฌด์๋ ์ ์๋ค. (์๊ทธ๋-์ ๋ฌ-์ ์ง ์๋ ptrace ์ ์ง์์ ํผ์ถ์ ์๋ฅผ ์ฌ์์ํ ๋ ๊ถ์ฅํ๋ ๋ฐฉ์์ sig
์ ํญ์ 0์ ์ฃผ๋ ๊ฒ์ด๋ค.)
๋ค์ ์ค ํ ํธ์ถ์ ์ด์ฉํด ์ค๋ ๋๋ฅผ ์ถ์ ์์๊ฒ ๋ถ์ผ ์ ์๋ค.
ptrace(PTRACE_ATTACH, pid, 0, 0);
ptrace(PTRACE_SEIZE, pid, 0, PTRACE_O_flags);
PTRACE_ATTACH
๋ ์ด ์ค๋ ๋์๊ฒ SIGSTOP
์ ๋ณด๋ธ๋ค. ์ด SIGSTOP
์ด ํจ๋ ฅ์ด ์๊ธฐ๋ฅผ ์ํ๋ฉด ์ถ์ ์๋ ์ด๋ฅผ ์ต์ ํด์ผ ํ๋ค. ์ฐธ๊ณ ๋ก ๋ถ์ด๊ธฐ ๋์ค ์ด ์ค๋ ๋์๊ฒ ๋ค๋ฅธ ์๊ทธ๋์ ๋์์ ๋ณด๋ด๋ฉด ํผ์ถ์ ์๊ฐ ๊ทธ ๋ค๋ฅธ ์๊ทธ๋๋ก ๋จผ์ ์๊ทธ๋-์ ๋ฌ-์ ์ง์ ๋ค์ด๊ฐ๋ ๊ฒ์ ์ถ์ ์๊ฐ ๋ณผ ์๋ ์๋ค! ์ผ๋ฐ์ ์ธ ๊ดํ์ SIGSTOP
์ ๋ณผ ๋๊น์ง ๊ทธ ์๊ทธ๋๋ค์ ์ฌ์ฃผ์
ํ๊ณ ์ SIGSTOP
์ฃผ์
์ ์ต์ ํ๋ ๊ฒ์ด๋ค. ์ฌ๊ธฐ์์ ์ค๊ณ ๋ฒ๊ทธ๋ ptrace ๋ถ์ด๊ธฐ์ ๊ทธ์ ๋์์ ์ ๋ฌ๋๋ SIGSTOP
์ด ๊ฒฝ์ํ ์ ์๊ณ , ๊ทธ๋์ ๊ทธ ๋์ SIGSTOP
์ด ์ ์ค๋ ์๋ ์๋ค๋ ์ ์ด๋ค.
๋ถ์ด๊ธฐ๋ฅผ ํ๋ฉด SIGSTOP
์ด ๊ฐ๋๋ฐ ์ผ๋ฐ์ ์ผ๋ก ์ถ์ ์๊ฐ ์ด๋ฅผ ์ต์ ํ๋ฏ๋ก "์๊ทธ๋ ์ฃผ์
๊ณผ ์ต์ " ์ ์์ ์์ ํ ๊ฒ์ฒ๋ผ ํ์ฌ ์คํ ์ค์ธ ์์คํ
ํธ์ถ์์ ๋๋ท์์ด EINTR
๋ฐํ์ด ์ผ์ด๋๊ฒ ํ ์๋ ์๋ค.
๋ฆฌ๋
์ค 3.4๋ถํฐ PTRACE_ATTACH
๋์ PTRACE_SEIZE
๋ฅผ ์ธ ์ ์๋ค. PTRACE_SEIZE
๋ ๋ถ์ ํ๋ก์ธ์ค๋ฅผ ๋ฉ์ถ์ง ์๋๋ค. ๋ถ์ ํ์ (๋๋ ๋ค๋ฅธ ์ด๋ ๋์๋) ์๋ฌด ์๊ทธ๋๋ ๋ณด๋ด์ง ์๊ณ ๊ทธ ํ๋ก์ธ์ค๋ฅผ ๋ฉ์ถฐ์ผ ํ๋ฉด PTRACE_INTERRUPT
๋ช
๋ น์ ์ฌ์ฉํ๋ฉด ๋๋ค.
๋ค์ ์์ฒญ์ ํธ์ถ ์ค๋ ๋๋ฅผ ํผ์ถ์ ์๋ก ๋ฐ๊พผ๋ค.
ptrace(PTRACE_TRACEME, 0, 0, 0);
์ค๋ ๋๊ฐ ์คํ์ ๊ณ์ํ๋ค. (ptrace ์ ์ง์ ๋ค์ด๊ฐ์ง ์๋๋ค.) ๊ทธ๋ฆฌ๊ณ ํํ PTRACE_TRACEME
์ ์ด์ด ๋ค์์ ํด์ (์ด์ ์ถ์ ์๊ฐ ๋) ๋ถ๋ชจ๊ฐ ์๊ทธ๋-์ ๋ฌ-์ ์ง๋ฅผ ๋ชฉ๊ฒฉํ๊ฒ ํ๋ค.
raise(SIGSTOP);
PTRACE_O_TRACEFORK
๋ PTRACE_O_TRACEVFORK
, PTRACE_O_TRACECLONE
์ต์
์ด ์ ์ฉ ์ค์ด๋ฉด ๊ฐ๊ธฐ vfork(2)๋ CLONE_VFORK
ํ๋๊ทธ ์ฌ์ฉ clone(2), fork(2)๋ ์ข
๋ฃ ์๊ทธ๋์ SIGCHLD
๋ก ์ค์ ํ clone(2), ๋ค๋ฅธ ์ข
๋ฅ์ clone(2)์ผ๋ก ์์ฑ๋ ์์์ด ๋ถ๋ชจ๋ฅผ ์ถ์ ํ๋ ๋์ผ ์ถ์ ์์ ์๋์ผ๋ก ๋ถ๋๋ค. ์์์๊ฒ SIGSTOP
์ด ์ ๋ฌ๋์ด ์์์ ์์ฑํ ์์คํ
ํธ์ถ์์ ๋น ์ ธ๋์จ ํ ์์์ด ์๊ทธ๋-์ ๋ฌ-์ ์ง์ ๋ค์ด๊ฐ๊ฒ ๋๋ค.
๋ค์ ํธ์ถ๋ก ํผ์ถ์ ์์์ ๋จ์ด์ง๋ค.
ptrace(PTRACE_DETACH, pid, 0, sig);
PTRACE_DETACH
๋ ์ฌ์์ํ ๋์์ด๋ค. ๋ฐ๋ผ์ ํผ์ถ์ ์๊ฐ ptrace ์ ์ง ์ํ์ฌ์ผ ํ๋ค. ํผ์ถ์ ์๊ฐ ์๊ทธ๋-์ ๋ฌ-์ ์ง์ ์์ผ๋ฉด ์๊ทธ๋์ ์ฃผ์
ํ ์ ์๋ค. ๊ทธ ์ธ์ ๊ฒฝ์ฐ sig
๋งค๊ฐ๋ณ์๊ฐ ์กฐ์ฉํ ๋ฌด์๋ ์ ์๋ค.
์ถ์ ์๊ฐ ๋จ์ด์ง๊ณ ์ถ์ ๋ ํผ์ถ์ ์๊ฐ ์คํ ์ค์ธ ๊ฒฝ์ฐ ์ผ๋ฐ์ ์ธ ํด๊ฒฐ์ฑ
์ SIGSTOP
์ ๋ณด๋ด๊ณ (์ฌ๋ฐ๋ฅธ ์ค๋ ๋๋ก ๊ฐ๋๋ก ํ๊ธฐ ์ํด tgkill(2) ์ฌ์ฉ), ํผ์ถ์ ์๊ฐ SIGSTOP
์ ๋ํ ์๊ทธ๋-์ ๋ฌ-์ ์ง์์ ๋ฉ์ถ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ , (SIGSTOP
์ ์ฃผ์
์ ์ต์ ํ๋ฉด์) ๋จ์ด์ง๋ ๊ฒ์ด๋ค. ์ฌ๊ธฐ์ ์ค๊ณ ๋ฒ๊ทธ๋ ๋์์ ๋ฐ์ํ SIGSTOP
๊ณผ ๊ฒฝ์ํ ์ ์๋ค๋ ์ ์ด๋ค. ๋ค๋ฅธ ๋ฌธ์ ๋ ํผ์ถ์ ์๊ฐ ๋ค๋ฅธ ptrace ์ ์ง์ ๋ค์ด๊ฐ ์๋ ์์ด์ SIGSTOP
์ ๋ณผ ๋๊น์ง ๋ค์ ์ฌ์์ํ๊ณ ๊ธฐ๋ค๋ ค์ผ ํ๋ค๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ๋ค๋ฅธ ๋ฌธ์ ๋ ํผ์ถ์ ์๊ฐ ์ด๋ฏธ ptrace ์ ์ง์ ์์ง ์์์ ํ์คํ ํ๋ ๊ฒ์ด๋ค. ๊ทธ๋๋ ์ด๋ค ์๊ทธ๋ ์ ๋ฌ๋ (SIGSTOP
๋) ์ด๋ค์ง์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ถ์ ์๊ฐ ์ฃฝ์ผ๋ฉด ๊ทธ๋ฃน-์ ์ง์ ์์๋ ๊ฒ ์๋๋ฉด ๋ชจ๋ ํผ์ถ์ ์๋ค์ด ์๋์ผ๋ก ๋จ์ด์ง๊ณ ์ฌ์์๋๋ค. ๊ทธ๋ฃน-์ ์ง์์์ ์ฌ์์ ์ฒ๋ฆฌ์๋ ํ์ฌ ๋ฒ๊ทธ๊ฐ ์์ง๋ง "๊ณํ ์" ๋์์ ํผ์ถ์ ์๊ฐ ๊ทธ๋๋ก ๋ฉ์ถฐ์ SIGCONT
๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ฒ ๋๋ ๊ฒ์ด๋ค. ํผ์ถ์ ์๊ฐ ์๊ทธ๋-์ ๋ฌ-์ ์ง์์ ์ฌ์์๋๋ ๊ฒฝ์ฐ ๋๊ธฐ ์ค์ธ ์๊ทธ๋์ด ์ฃผ์
๋๋ค.
ptrace ํ์ execve(2)
๋ค์ค ์ค๋ ๋ ํ๋ก์ธ์ค์ ํ ์ค๋ ๋๊ฐ execve(2)๋ฅผ ํธ์ถํ๋ฉด ์ปค๋์์ ๊ทธ ํ๋ก์ธ์ค์ ๋ค๋ฅธ ์ค๋ ๋๋ค์ ๋ชจ๋ ์์ ๊ณ exec ํ ์ค๋ ๋์ ์ค๋ ๋ ID๋ฅผ ์ค๋ ๋ ๊ทธ๋ฃน ID(ํ๋ก์ธ์ค ID)๋ก ์ฌ์ค์ ํ๋ค. (๋ค๋ฅธ ์์ผ๋ก ๋งํ๋ฉด, ๋ค์ค ์ค๋ ๋ ํ๋ก์ธ์ค์์ execve(2)๋ฅผ ํ๋ฉด ์ด๋ค ์ค๋ ๋๊ฐ execve(2)๋ฅผ ํ๋์ง์ ๋ฌด๊ดํ๊ฒ ํธ์ถ ์๋ฃ ์์ ์๋ ์ค๋ ๋ ๊ทธ๋ฃน ๋ฆฌ๋์์ execve(2)๊ฐ ์ผ์ด๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค.) ์ด๋ฐ ์ค๋ ๋ ID ์ฌ์ค์ ์ด ์ถ์ ์์๊ฒ๋ ํผ๋์ค๋ฌ์ ๋ณด์ธ๋ค.
-
PTRACE_O_TRACEEXIT
์ต์ ์ด ์ผ์ก์ผ๋ฉด ๋ค๋ฅธ ์ค๋ ๋ ๋ชจ๋๊ฐPTRACE_EVENT_EXIT
์ ์ง์์ ๋ฉ์ถ๋ค. ๊ทธ๋ฌ๊ณ ์ ์ค๋ ๋ ๊ทธ๋ฃน ๋ฆฌ๋๋ฅผ ์ ์ธํ ๋ค๋ฅธ ์ค๋ ๋ ๋ชจ๋๊ฐ ์ข ๋ฃ ์ฝ๋ 0์ผ๋ก _exit(2)์ ํตํด ๋๋ ๊ฒ์ฒ๋ผ ์ฃฝ์์ ๋ณด๊ณ ํ๋ค. -
exec ํ๋ ํผ์ถ์ ์๊ฐ execve(2) ๋ด์ ์๋ ๋์ ์๊ธฐ ์ค๋ ๋ ID๋ฅผ ๋ฐ๊พผ๋ค. (๊ธฐ์ตํ๊ฒ ์ง๋ง ptrace์์ waitpid(2)๊ฐ ๋ฐํํ๊ฑฐ๋ ptrace ํธ์ถ์ ๋ฃ์ด ์ฃผ๋ "pid"๋ ํผ์ถ์ ์์ ์ค๋ ๋ ID์ด๋ค.) ์ฆ ํผ์ถ์ ์์ ์ค๋ ๋ ID๊ฐ ํ๋ก์ธ์ค ID, ์ฆ ์ค๋ ๋ ๊ทธ๋ฃน ๋ฆฌ๋์ ์ค๋ ๋ ID์ ๊ฐ์์ง๊ฒ ์ฌ์ค์ ๋๋ค.
-
๊ทธ๋ฆฌ๊ณ
PTRACE_O_TRACEEXEC
์ต์ ์ด ์ผ์ก์ผ๋ฉดPTRACE_EVENT_EXEC
์ ์ง๊ฐ ์ผ์ด๋๋ค. -
์ด ์์ ์ ์ ์ค๋ ๋ ๊ทธ๋ฃน ๋ฆฌ๋๊ฐ
PTRACE_EVENT_EXIT
๋ฅผ ๋ณด๊ณ ํ๋ค๋ฉด ์ถ์ ์์๊ฒ๋ ์ฃฝ์ ์ค๋ ๋ ๋ฆฌ๋๊ฐ "๋๋ฐ์์ด ๋ค์ ๋ํ๋" ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค. (์ฐธ๊ณ : ์ ์ด๋ ํ ๊ฐ์ ๋ค๋ฅธ ์ด์ ์๋ ์ค๋ ๋๊ฐ ์๊ธฐ ์ ์๋ ์ค๋ ๋ ๊ทธ๋ฃน ๋ฆฌ๋๊ฐWIFEXITED(status)
๋ฅผ ํตํด ์ฃฝ์์ ๋ณด๊ณ ํ์ง ์๋๋ค. ์ด ๋๋ฌธ์ ์ถ์ ์์๊ฒ ์ค๋ ๋ ๊ทธ๋ฃน ๋ฆฌ๋๊ฐ ์ฃฝ์๋ค๊ฐ ๋ค์ ๋ํ๋๋ ๊ฒ์ผ๋ก ๋ณด์ผ ๊ฐ๋ฅ์ฑ์ด ์์ด์ง๋ค.) ์ค๋ ๋ ๊ทธ๋ฃน ๋ฆฌ๋๊ฐ ์์ง ์ด์ ์์๋ค๋ฉด ์ถ์ ์์๊ฒ ์ค๋ ๋ ๊ทธ๋ฃน ๋ฆฌ๋๊ฐ ๋ค์ด๊ฐ ๊ฒ๊ณผ ๋ค๋ฅธ ์์คํ ํธ์ถ์์ ๋ฐํํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฑฐ๋, ์ฌ์ง์ด "์๋ฌด ์์คํ ํธ์ถ ์์๋ ์์ง ์๋ค๊ฐ ์์คํ ํธ์ถ์์ ๋ฐํ"ํ๋ ๊ฒ์ผ๋ก ๋ณด์ผ ์๋ ์๋ค. ์ค๋ ๋ ๊ทธ๋ฃน ๋ฆฌ๋๋ฅผ ์ถ์ ํ๊ณ ์์ง ์์๋ค๋ฉด (๋๋ ๋ค๋ฅธ ์ถ์ ์๊ฐ ์ถ์ ํ๊ณ ์์๋ค๋ฉด) execve(2) ๊ณผ์ ์์ exec ํ ํผ์ถ์ ์์ ์ถ์ ์์ ํผ์ถ์ ์๊ฐ ๋ ๊ฒ์ฒ๋ผ ๋ณด์ผ ๊ฒ์ด๋ค.
์์ ํจ๊ณผ ๋ชจ๋๊ฐ ํผ์ถ์ ์ ์ค๋ ๋ ID ๋ณ๊ฒฝ์ ์ฐ๋ฌผ์ด๋ค.
PTRACE_O_TRACEEXEC
์ต์
์ด ์ด๋ฐ ์ํฉ์ ๋์ฒํ๊ธฐ ์ํ ๊ถ์ฅ ๋๊ตฌ์ด๋ค. ์ฒซ์งธ๋ก, execve(2) ๋ฐํ ์ ์ ์ผ์ด๋๋ PTRACE_EVENT_EXEC
์ ์ง๋ฅผ ์ผ ๋ค. ๊ทธ ์ ์ง์์ ์ถ์ ์๊ฐ PTRACE_GETEVENTMSG
๋ฅผ ์ฌ์ฉํด์ ํผ์ถ์ ์์ ์ด์ ์ค๋ ๋ ID๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค. (์ด ๊ธฐ๋ฅ์ ๋ฆฌ๋
์ค 3.0์์ ์ถ๊ฐ๋์๋ค.) ๋์งธ๋ก, PTRACE_O_TRACEEXEC
์ต์
์ด execve(2)์ ๋ํ ๊ตฌ์ SIGTRAP
์์ฑ์ ๋๋ค.
์ถ์ ์๊ฐ PTRACE_EVENT_EXEC
์ ์ง ์๋ฆผ์ ๋ฐ์ ๋ ๊ทธ ํผ์ถ์ ์์ ์ค๋ ๋ ๊ทธ๋ฃน ๋ฆฌ๋๋ฅผ ์ ์ธํ๊ณ ํ๋ก์ธ์ค์ ๋ค๋ฅธ ์ด๋ค ์ค๋ ๋๋ ์ด์ ์์ง ์๋ค๋ ๊ฒ์ด ๋ณด์ฅ๋๋ค.
PTRACE_EVENT_EXEC
์ ์ง ์๋ฆผ ์์ ์ ์ถ์ ์๋ ๊ทธ ํ๋ก์ธ์ค์ ์ค๋ ๋๋ค์ ๊ธฐ์ ํ๋ ๋ด๋ถ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ๋ชจ๋ ์ ๋ฆฌํ๊ณ ๋จ ํ๋, ๋ค์ ์กฐ๊ฑด์ ํด๋นํ๋ ์์ง ๋๊ณ ์๋ ํผ์ถ์ ์๋ฅผ ๊ธฐ์ ํ๋ ์๋ฃ ๊ตฌ์กฐ๋ง์ ์ ์งํด์ผ ํ ๊ฒ์ด๋ค.
์ค๋ ๋ ID == ์ค๋ ๋ ๊ทธ๋ฃน ID == ํ๋ก์ธ์ค ID
์: ๋ ์ค๋ ๋๊ฐ ๋์์ execve(2) ํธ์ถ:
*** we get syscall-enter-stop in thread 1: **
PID1 execve("/bin/foo", "foo" <unfinished ...>
*** we issue PTRACE_SYSCALL for thread 1 **
*** we get syscall-enter-stop in thread 2: **
PID2 execve("/bin/bar", "bar" <unfinished ...>
*** we issue PTRACE_SYSCALL for thread 2 **
*** we get PTRACE_EVENT_EXEC for PID0, we issue PTRACE_SYSCALL **
*** we get syscall-exec-stop for PID0: **
PID0 <... execve resumed> ) = 0
exec ํ๋ ํผ์ถ์ ์์ PTRACE_O_TRACEEXEC
๊ฐ ์ ์ฉ ์ค์ด์ง ์๊ณ PTRACE_SEIZE
๊ฐ ์๋ PTRACE_ATTACH
๋ก ํผ์ถ์ ์์ ๋ถ์๋ ๊ฒฝ์ฐ execve(2) ๋ฐํ ํ ์ปค๋์ด ํผ์ถ์ ์์๊ฒ ์ถ๊ฐ SIGTRAP
๋ฅผ ์ ๋ฌํ๋ค. ์ด๋ ํ๋ฒํ (kill -TRAP
์ผ๋ก ์์ฑํ ์ ์๋ ๊ฒ๊ณผ ๋น์ทํ) ์๊ทธ๋์ด๋ฉฐ ํน๋ณํ ์ข
๋ฅ์ ptrace ์ ์ง๊ฐ ์๋๋ค. ์ด ์๊ทธ๋์ PTRACE_GETSIGINFO
ํ๋ฉด si_code
๊ฐ 0(SI_USER
)์ผ๋ก ์ค์ ๋ผ์ ๋ฐํ๋๋ค. ์๊ทธ๋ ๋ง์คํฌ๋ก ์ด ์๊ทธ๋์ ๋ธ๋ก ํ ์ ์๊ณ , ๋ฐ๋ผ์ (ํจ์ฌ) ๋์ค์ ์ ๋ฌ๋ ์๋ ์๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ถ์ ์(๊ฐ๋ น strace(1))๋ execve ํ์ ์ด ์ถ๊ฐ SIGTRAP
์๊ทธ๋์ ์ฌ์ฉ์์๊ฒ ๋ณด์ด๊ณ ์ถ์ง ์์ ๊ฒ์ด๊ณ ํผ์ถ์ ์์๊ฒ ์ ๋ฌ๋๋ ๊ฒ์ ์ต์ ํ๋ ค ํ ๊ฒ์ด๋ค. (SIGTRAP
์ด SIG_DFL
๋ก ์ค์ ๋์ด ์์ผ๋ฉด ์ฃฝ์ด๊ธฐํ ์๊ทธ๋์ด๋ค.) ํ์ง๋ง ์ด๋ค SIGTRAP
์ ์ต์ ํ ์ง ํ๋จํ๋ ๊ฒ์ด ์ฝ์ง ์๋ค. PTRACE_O_TRACEEXEC
์ต์
์ ์ค์ ํ๊ฑฐ๋ PTRACE_SEIZE
๋ฅผ ์ฌ์ฉํด์ ์ด ์ถ๊ฐ SIGTRAP
์ ๊ธํ๋ ๊ฒ์ด ๊ถ์ฅํ๋ ๋ฐฉ์์ด๋ค.
ptrace API๋ waitpid(2)๋ฅผ ํตํ ํ์ค ์ ๋์ค ๋ถ๋ชจ/์์ ์ ํธ ์ ๋ฌ์ ์ด์ฉ(๋ด์ง ์ค์ฉ)ํ๋ค. ์ด ๋๋ฌธ์ ์ด๋ค ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ์์ ํ๋ก์ธ์ค๋ฅผ ์ถ์ ํ ๋ ์ง์ง ๋ถ๋ชจ๊ฐ ์ฌ๋ฌ ์ข ๋ฅ์ waitpid(2) ์๋ฆผ์ ๋ฐ์ง ๋ชปํ๊ฒ ๋๊ณค ํ๋ค.
์ด๋ฐ ๋ฒ๊ทธ๊ฐ ๋ง์ด ๊ณ ์ณ์ก์ง๋ง ๋ฆฌ๋ ์ค 2.6.38 ๊ธฐ์ค์ผ๋ก ์์ง ์ฌ๋ฌ ๊ฐ๊ฐ ๋จ์ ์๋ค. ์๋ BUGS ์ฐธ๊ณ .
2.6.38 ๊ธฐ์ค์ผ๋ก ๋ค์ ์ฌํญ๋ค์ด ์ฌ๋ฐ๋ก ๋์ํ๋ ๊ฒ ๊ฐ๋ค.
- ์๊ทธ๋์ ์ํ ์ข ๋ฃ/์ฃฝ์์ด ๋จผ์ ์ถ์ ์์๊ฒ ๋ณด๊ณ ๋๊ณ , ์ถ์ ์๊ฐ waitpid(2) ๊ฒฐ๊ณผ๋ฅผ ์๋ชจํ ๋ ์ง์ง ๋ถ๋ชจ์๊ฒ (๋ค์ค ์ค๋ ๋ ํ๋ก์ธ์ค ์ ์ฒด๊ฐ ๋๋ ๋๋ง ์ง์ง ๋ถ๋ชจ์๊ฒ) ๋ณด๊ณ ๋๋ค. ์ถ์ ์์ ์ง์ง ๋ถ๋ชจ๊ฐ ๊ฐ์ ํ๋ก์ธ์ค์ด๋ฉด ๋ณด๊ณ ๊ฐ ํ ๋ฒ๋ง ๊ฐ๋ค.
์ฑ๊ณต ์ PTRACE_PEEK*
์์ฒญ์ ์์ฒญํ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๊ณ (ํ์ง๋ง NOTES ์ฐธ๊ณ ), PTRACE_SECCOMP_GET_FILTER
์์ฒญ์ BPF ํ๋ก๊ทธ๋จ์ ์ธ์คํธ๋ญ์
์๋ฅผ ๋ฐํํ๋ฉฐ, ๋ค๋ฅธ ์์ฒญ์ 0์ ๋ฐํํ๋ค.
์ค๋ฅ ์ ๋ชจ๋ ์์ฒญ์ด -1์ ๋ฐํํ๋ฉฐ errno
๋ฅผ ์ ์ ํ ์ค์ ํ๋ค. PTRACE_PEEK*
์์ฒญ์ด ์ฑ๊ณต ์ ๋ฐํํ๋ ๊ฐ์ด -1์ผ ์๋ ์๊ธฐ ๋๋ฌธ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋์ง ์๋ ค๋ฉด ํธ์ถ์๊ฐ ํธ์ถ ์ ์ errno
๋ฅผ ๋น์ฐ๊ณ ์ ํธ์ถ ํ ๊ฒ์ฌํด์ผ ํ๋ค.
EBUSY
- (i386 ํ์ ) ๋๋ฒ๊ทธ ๋ ์ง์คํฐ ํ ๋น ๋ด์ง ํด์ ์ค์ ์ค๋ฅ๊ฐ ์์๋ค.
EFAULT
- ์ถ์ ์๋ ํผ์ถ์ ์์ ๋ฉ๋ชจ๋ฆฌ ๋ด์ ์ ํจํ์ง ์์ ์์ญ์ ๋ํ ์ฝ๊ธฐ๋ ์ฐ๊ธฐ ์๋๊ฐ ์์๋ค. ์๋ง ๊ทธ ์์ญ์ด ๋งคํ ๋์ด ์์ง ์๊ฑฐ๋ ์ ๊ทผ ๊ฐ๋ฅํ์ง ์์์์ผ ๊ฒ์ด๋ค. ์ ๊ฐ์ค๋ฝ๊ฒ๋ ๋ฆฌ๋
์ค์์๋ ์ด ๋ฌธ์ ์ ์ฌ๋ฌ ๋ณ์ข
๋ค์ด ๋ค์ ์์์ ์ผ๋ก
EIO
๋EFAULT
๋ฅผ ๋ฐํํ๋ค. EINVAL
- ์ ํจํ์ง ์์ ์ต์ ์ ์ค์ ํ๋ ค๊ณ ์๋ํ๋ค.
EIO
-
request
๊ฐ ์ ํจํ์ง ์๊ฑฐ๋, ์ถ์ ์๊ฐ ํผ์ถ์ ์์ ๋ฉ๋ชจ๋ฆฌ ๋ด์ ์ ํจํ์ง ์์ ์์ญ์ ๋ํ ์ฝ๊ธฐ๋ ์ฐ๊ธฐ ์๋๊ฐ ์์๊ฑฐ๋, ์๋ ์ ๋ ฌ ์๋ฐ์ด ์์๊ฑฐ๋, ์ฌ์์ ์์ฒญ ์ค์ ์ ํจํ์ง ์์ ์๊ทธ๋์ ์ง์ ํ๋ค. EPERM
- ์ง์ ํ ํ๋ก์ธ์ค๋ฅผ ์ถ์ ํ ์ ์๋ค. ์ถ์ ์๊ฐ ์ถฉ๋ถํ ํน๊ถ์ ๊ฐ์ง๊ณ ์์ง ์์์์ผ ์ ์๋ค. (ํ์ํ ์ญ๋ฅ์
CAP_SYS_PTRACE
์ด๋ค.) ๋นํน๊ถ ํ๋ก์ธ์ค๊ฐ ์๊ทธ๋์ ๋ณด๋ผ ์ ์๋ ํ๋ก์ธ์ค๋ค์ ์ถ์ ํ ์ ์๋ ๊ฒ์ด๊ณ , ๋ ๋น์ฐํ ์ด์ ๋ก set-user-ID/set-group-ID ํ๋ก๊ทธ๋จ์ ๋๋ฆฌ๋ ํ๋ก์ธ์ค๋ฅผ ์ถ์ ํ ์ ์๋ค. ๋๋, ํ๋ก์ธ์ค๊ฐ ์ด๋ฏธ ์ถ์ ๋๊ณ ์๊ฑฐ๋ (2.6.26 ์ ์ ์ปค๋์์) ํ๋ก์ธ์ค๊ฐ `init(1)` (PID 1)์ด๋ค. ESRCH
- ์ง์ ํ ํ๋ก์ธ์ค๊ฐ ์กด์ฌํ์ง ์๊ฑฐ๋, ํ์ฌ ํธ์ถ์๊ฐ ์ถ์ ์ค์ด ์๋๊ฑฐ๋, (ํผ์ถ์ ์๊ฐ ๋ฉ์ถฐ ์์ด์ผ ํ๋ ์์ฒญ๋ค์์) ๋ฉ์ถฐ์์ง ์๋ค.
SVr4, 4.3BSD.
์์ ์ ์ํ ์ํ์ ๋ฐ๋ผ ptrace()
์ธ์๋ฅผ ํด์ํ์ง๋ง ํ์ฌ glibc์์๋ ptrace()
๋ฅผ request
์ธ์๋ง ๊ณ ์ ๋ ๊ฐ๋ณ ์ธ์ ํจ์๋ก ์ ์ธํ๊ณ ์๋ค. ์์ฒญ ๋์์์ ์ฌ์ฉํ์ง ์๋๋ผ๋ ํญ์ ์ธ์ ๋ค ๊ฐ๋ฅผ ์ ๊ณตํ๊ธฐ๋ฅผ ๊ถ์ฅํ๋ค. ์ ์ฐ๊ฑฐ๋ ๋ฌด์ํ๋ ์ธ์๋ 0L
์ด๋ (void *) 0
์ผ๋ก ์ค์ ํ๋ฉด ๋๋ค.
๋ฆฌ๋
์ค ์ปค๋ 2.6.26 ์ ์์๋ PID 1 ํ๋ก์ธ์ค์ธ init(1)
๋ฅผ ์ถ์ ํ ์ ์๋ค.
ํผ์ถ์ ์์ ๋ถ๋ชจ๋ execve(2)
๋ฅผ ํธ์ถํด๋ ๊ณ์ ์ถ์ ์์ด๋ค.
๋ฉ๋ชจ๋ฆฌ ๋ฐ USER ์์ญ์ ๋ด์ฉ๋ฌผ ๋ฐฐ์น๋ ์ด์ ์ฒด์ ์ ์ํคํ
์ฒ์ ์๋นํ ์์กด์ ์ด๋ค. ์ ๊ณต๋๋ ์คํ์
๊ณผ ๋ฐํ๋ ๋ฐ์ดํฐ๊ฐ struct user
์ ์์ ์์ ํ๊ฒ ์ผ์นํ์ง๋ ์์ ์๋ ์์ ๊ฒ์ด๋ค.
"์๋"์ ํฌ๊ธฐ๋ ์ด์ ์ฒด์ ์ข ๋ฅ์ ๋ฐ๋ผ ์ ํด์ง๋ค. (๊ฐ๋ น 32๋นํธ ๋ฆฌ๋ ์ค์์๋ 32๋นํธ์ด๋ค.)
์ด ํ์ด์ง๋ ํ์ฌ ๋ฆฌ๋
์ค์์ ptrace()
๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ์ ์ ๊ฒ์ด๋ค. ๊ทธ ๋์ ๋ฐฉ์์ ๋ค๋ฅธ UNIX ๋ณ์ข
๋ค๊ณผ ์๋นํ ๋ค๋ฅด๋ค. ์ด๋ค ๊ฒฝ์ฐ์ด๋ ptrace()
์ฌ์ฉ์ ์ด์ ์ฒด์ ์ ์ํคํ
์ฒ์ ๊ณ ๋๋ก ์์กด์ ์ด๋ค.
(ptrace()
๋์๋ฟ ์๋๋ผ) ์ปค๋-์ฌ์ฉ์ ๊ณต๊ฐ API์ ์ฌ๋ฌ ๋ถ๋ถ์์ ์์ "ptrace ์ ๊ทผ ๋ชจ๋" ๊ฒ์ฌ๋ฅผ ์๊ตฌํ์ฌ ๊ทธ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ๋์์ ํ์ฉํ ์ง ์ฌ๋ถ๋ฅผ (๋๋ ์ผ๋ถ ๊ฒฝ์ฐ์ "์ฝ๊ธฐ" ๋์์ด ๊ฒ์ด๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ ์ง ์ฌ๋ถ๋ฅผ) ๊ฒฐ์ ํ๋ค. ํ ํ๋ก์ธ์ค๊ฐ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ๋ํ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ๊ฒ์ฌํ๊ฑฐ๋ ๋์ ๋ฐ๋ผ ํ๋ก์ธ์ค ์ํ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ๊ฒฝ์ฐ์ ๊ทธ๋ฐ ๊ฒ์ฌ๋ฅผ ์ํํ๋ค. ๊ฒ์ฌ๋ ๋ ํ๋ก์ธ์ค์ ํฌ๋ฆฌ๋ด์
๊ณผ ์ญ๋ฅ, "๋์" ํ๋ก์ธ์ค๊ฐ ๋คํ ๊ฐ๋ฅํ์ง ์ฌ๋ถ, ํ์ฑํ๋ (SELinux, Yama, Smack ๊ฐ์) ๋ฆฌ๋
์ค ๋ณด์ ๋ชจ๋(LSM) ๋ฐ (ํญ์ ํธ์ถ๋๋) commoncap LSM์ด ์ํํ ๊ฒ์ฌ ๊ฒฐ๊ณผ ๊ฐ์ ์ธ์๋ค์ ๋ฐ๋ผ ์ด๋ค์ง๋ค.
๋ฆฌ๋ ์ค 2.6.27 ์ ์์๋ ๋ชจ๋ ์ ๊ทผ ๊ฒ์ฌ๊ฐ ํ ์ข ๋ฅ์๋ค. ๋ฆฌ๋ ์ค 2.6.27๋ถํฐ๋ ๋ ๊ฐ์ง ์ ๊ทผ ๋ชจ๋ ๋จ๊ณ๋ฅผ ๊ตฌ๋ณํ๋ค.
PTRACE_MODE_READ
- "์ฝ๊ธฐ" ๋์์ด๋ ๋ ์ํํ ๋์๋ค: get_robust_list(2), kcmp(2),
/proc/[pid]/auxv
์ด๋/proc/[pid]/environ
,/proc/[pid]/stat
์ฝ๊ธฐ,/proc/[pid]/ns/*
ํ์ผ readlink(2) PTRACE_MODE_ATTACH
- "์ฐ๊ธฐ" ๋์์ด๋ ๋ ์ํํ ๋์๋ค: ๋ค๋ฅธ ํ๋ก์ธ์ค์ ptrace ๋ถ๊ธฐ (
PTRACE_ATTACH
)๋ process_vm_writev(2) ํธ์ถ. (๋ฆฌ๋ ์ค 2.6.27 ์ ์์๋PTRACE_MODE_ATTACH
๊ฐ ๊ธฐ๋ณธ์ธ ๊ฒ๊ณผ ๊ฐ์๋ค.)
๋ฆฌ๋ ์ค 4.5๋ถํฐ ์ ์ ๊ทผ ๋ชจ๋ ๊ฒ์ฌ๋ฅผ ๋ค์ ์์์ ์ค ํ๋์ ๊ฒฐํฉ(OR)ํ๋ค.
PTRACE_MODE_FSCREDS
- LSM ๊ฒ์ฌ์ ํธ์ถ์์ ํ์ผ ์์คํ UID/GID (credentials(7) ์ฐธ๊ณ ) ๋๋ ์คํจ ์ญ๋ฅ ์ฌ์ฉ.
PTRACE_MODE_REALCREDS
- LSM ๊ฒ์ฌ์ ํธ์ถ์์ ์ค์ UID/GID๋ ํ์ฉ ์ญ๋ฅ ์ฌ์ฉ. ๋ฆฌ๋ ์ค 4.5 ์ ์์๋ ์ด ๋ฐฉ์์ด ๊ธฐ๋ณธ์ธ ๊ฒ๊ณผ ๊ฐ์๋ค.
์ ํฌ๋ฆฌ๋ด์ ์์์์ ์์ ์ธ๊ธํ ์ ๊ทผ ๋ชจ๋๋ฅผ ๊ฒฐํฉํด์ ์ฐ๋ ๊ฒ ์ผ๋ฐ์ ์ด๋ฏ๋ก ์ปค๋ ์์ค์๋ ๊ทธ ์กฐํฉ๋ค์ ๋ํ ๋งคํฌ๋ก๊ฐ ์ ์๋์ด ์๋ค.
PTRACE_MODE_READ_FSCREDS
-
PTRACE_MODE_READ | PTRACE_MODE_FSCREDS
๋ก ์ ์. PTRACE_MODE_READ_REALCREDS
-
PTRACE_MODE_READ | PTRACE_MODE_REALCREDS
๋ก ์ ์. PTRACE_MODE_ATTACH_FSCREDS
-
PTRACE_MODE_ATTACH | PTRACE_MODE_FSCREDS
๋ก ์ ์. PTRACE_MODE_ATTACH_READLCREDS
-
PTRACE_MODE_ATTACH | PTRACE_MODE_REALCREDS
๋ก ์ ์.
์ ๊ทผ ๋ชจ๋์ ์์์ ํ๋๋ฅผ ๋ OR ํ ์ ์๋ค.
-
PTRACE_MODE_NOAUDIT
(๋ฆฌ๋ ์ค 3.3๋ถํฐ) - ์ด ์ ๊ทผ ๋ชจ๋ ๊ฒ์ฌ๋ฅผ ๊ฐ์ฌํ์ง ์๋๋ค. ์ด ์์์๋ ํธ์ถ์์๊ฒ ์ค๋ฅ๋ฅผ ๋ฐํ์ํค๊ธฐ๋ณด๋ค๋ ์ถ๋ ฅ์ด ๊ฑธ๋ฌ์ง๊ฑฐ๋ ๊ฒ์ด๋๊ฒ ํ๊ธฐ๋ง ํ๋ (
/proc/[pid]/stat
์ฝ์ ๋์ ๊ฒ์ฌ ๊ฐ์) ptrace ์ ๊ทผ ๋ชจ๋ ๊ฒ์ฌ์ ์ฐ์ธ๋ค. ๊ทธ๋ฐ ๊ฒฝ์ฐ์ ํ์ผ ์ ๊ทผ์ ๋ณด์ ์๋ฐ์ด ์๋๋ฏ๋ก ๋ณด์ ๊ฐ์ฌ ๊ธฐ๋ก์ ์์ฑํ ์ด์ ๊ฐ ์๋ค. ์ด ์์์๋ ํน์ ์ ๊ทผ ๊ฒ์ฌ์ ๋ํด ๋ณด์ ๊ธฐ๋ก ์์ฑ์ ์ต์ ํ๋ค.
์ฐธ๊ณ ๋ก ์ด ๋ถ์ ์์ ์์ ํ PTRACE_MODE_*
์์๋ค์ ๋ชจ๋ ์ปค๋ ๋ด๋ถ์ฉ์ด์ด์ ์ฌ์ฉ์ ๊ณต๊ฐ์ ๋ณด์ด์ง ์๋๋ค. ์ฌ๊ธฐ์ ์์ ์ด๋ฆ์ ์ธ๊ธํ ๊ฒ์ ์ฌ๋ฌ ์์คํ
ํธ์ถ๊ณผ ์ฌ๋ฌ (๊ฐ๋ น /proc
์๋์) ๊ฐ์ ํ์ผ ์ ๊ทผ์ ๋ํด ์ํํ๋ ๋ค์ํ ptrace ์ ๊ทผ ๋ชจ๋ ๊ฒ์ฌ๋ค์ ์ข
๋ฅ์ ์ด๋ฆ์ ๋ถ์ด๊ธฐ ์ํด์์ด๋ค. ์ด ์ด๋ฆ์ ๋ค๋ฅธ ๋งค๋ด์ผ ํ์ด์ง์์ ์ฌ์ฉํด์ ๋ค์ํ ์ปค๋ ๊ฒ์ฌ๋ฅผ ๊ฐ๋จํ ๋ฐฉ์์ผ๋ก ์ง์นญํ๋ค.
ptrace ์ ๊ทผ ๋ชจ๋ ๊ฒ์ฌ์ ์ฐ์ด๋ ์๊ณ ๋ฆฌ๋ฌ์ ํธ์ถ ํ๋ก์ธ์ค๊ฐ ๋์ ํ๋ก์ธ์ค์ ํด๋น ํ์๋ฅผ ์ํํ๋ ๊ฒ์ด ํ์ฉ๋๋์ง ํ๋จํ๋ค. (/proc/[pid]
ํ์ผ ์ด๊ธฐ์ ๊ฒฝ์ฐ "ํธ์ถ ํ๋ก์ธ์ค"๋ ํ์ผ์ ์ฌ๋ ํ๋ก์ธ์ค์ด๊ณ ํด๋น PID๋ฅผ ๊ฐ์ง ํ๋ก์ธ์ค๊ฐ "๋์ ํ๋ก์ธ์ค"์ด๋ค.) ์๊ณ ๋ฆฌ๋ฌ์ ๋ค์๊ณผ ๊ฐ๋ค.
-
ํธ์ถ ์ค๋ ๋์ ๋์ ์ค๋ ๋๊ฐ ๊ฐ์ ์ค๋ ๋ ๊ทธ๋ฃน์ ์ํ๋ฉด ์ ๊ทผ์ ํญ์ ํ์ฉํ๋ค.
-
์ ๊ทผ ๋ชจ๋์
PTRACE_MODE_FSCREDS
๊ฐ ์ง์ ๋ผ ์์ผ๋ฉด ๋ค์ ๋จ๊ณ์ ๊ฒ์ฌ์์ ํธ์ถ์์ ํ์ผ ์์คํ UID ๋ฐ GID๋ฅผ ์ฌ์ฉํ๋ค. (credentials(7)์์ ์ธ๊ธํ๋ฏ ํ์ผ ์์คํ UID์ GID๋ ๊ฑฐ์ ์ธ์ ๋ ๋์ํ๋ ์คํจ ID์ ๊ฐ์ด ๊ฐ๋ค.)๊ทธ๋ ์ง ์๊ณ ์ ๊ทผ ๋ชจ๋์
PTRACE_MODE_REALCREDS
๊ฐ ์ง์ ๋ผ ์์ผ๋ฉด ๋ค์ ๋จ๊ณ์ ๊ฒ์ฌ์ ํธ์ถ์์ ์ค์ UID ๋ฐ GID๋ฅผ ์ฌ์ฉํ๋ค. (ํธ์ถ์์ UID์ GID๋ฅผ ๊ฒ์ฌํ๋ ๋๋ถ๋ถ์ API์์๋ ์คํจ ID๋ฅผ ์ฌ์ฉํ๋ค. ์ญ์ฌ์ ์ด์ ๋๋ฌธ์PTRACE_MODE_REALCREDS
๊ฒ์ฌ์์๋ ์ค์ ID๋ฅผ ์ฌ์ฉํ๋ค.) -
๋ค์ ์ค ์ด๋ ๊ฒ๋ ์ฐธ์ด ์๋๋ฉด ์ ๊ทผ์ ๊ฑฐ๋ถํ๋ค.
-
๋์์ ์ค์ , ์คํจ, saved-set ์ฌ์ฉ์ ID๊ฐ ํธ์ถ์์ ์ฌ์ฉ์ ID์ ์ผ์นํ๊ณ ๋์์ ์ค์ , ์คํจ, saved-set ๊ทธ๋ฃน ID๊ฐ ํธ์ถ์์ ๊ทธ๋ฃน ID์ ์ผ์นํ๋ค.
-
ํธ์ถ์๊ฐ ๋์์ ์ฌ์ฉ์ ๋ค์์คํ์ด์ค์์
CAP_SYS_PTRACE
์ญ๋ฅ์ ๊ฐ์ง๊ณ ์๋ค.
-
-
๋์ ํ๋ก์ธ์ค์ "๋คํ ๊ฐ๋ฅ" ์์ฑ์ด 1 ์๋ ๊ฐ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ (
SUID_DUMP_USER
. prctl(2)์PR_SET_DUMPABLE
๋ ผ์ ์ฐธ๊ณ ) ํธ์ถ์๊ฐ ๋์ ํ๋ก์ธ์ค์ ์ฌ์ฉ์ ๋ค์์คํ์ด์ค์์CAP_SYS_PTRACE
์ญ๋ฅ์ ๊ฐ์ง๊ณ ์์ง ์์ผ๋ฉด ์ ๊ทผ์ ๊ฑฐ๋ถํ๋ค. -
์ปค๋ LSM
security_ptrace_access_check()
์ธํฐํ์ด์ค๋ฅผ ํธ์ถํด์ ptrace ์ ๊ทผ์ด ํ์ฉ๋๋์ง ์์๋ณธ๋ค. ๊ฒฐ๊ณผ๋ LSM(๋ค)์ ๋ฌ๋ ค ์๋ค. commoncap LSM์ ์ด ์ธํฐํ์ด์ค ๊ตฌํ์์๋ ๋ค์ ๋จ๊ณ๋ค์ ์ํํ๋ค.a) ์ ๊ทผ ๋ชจ๋์
PTRACE_MODE_FSCREDS
๊ฐ ํฌํจ๋ผ ์์ผ๋ฉด ๋ค์ ๊ฒ์ฌ์์ ํธ์ถ์์ ์คํจ ์ญ๋ฅ ์งํฉ์ ์ฌ์ฉํ๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด (์ ๊ทผ ๋ชจ๋์PTRACE_MODE_REALCREDS
๊ฐ ์ง์ ๋ผ ์์ผ๋ฉด) ํธ์ถ์์ ํ์ฉ ์ญ๋ฅ ์งํฉ์ ์ฌ์ฉํ๋ค.b) ๋ค์ ์ค ์ด๋ ๊ฒ๋ ์ฐธ์ด ์๋๋ฉด ์ ๊ทผ์ ๊ฑฐ๋ถํ๋ค.
-
ํธ์ถ์์ ๋์ ํ๋ก์ธ์ค๊ฐ ๊ฐ์ ์ฌ์ฉ์ ๋ค์์คํ์ด์ค ์์ ์์ผ๋ฉฐ, ํธ์ถ์์ ์ญ๋ฅ์ด ๋์ ํ๋ก์ธ์ค์ ํ์ฉ ์ญ๋ฅ์ ์์์งํฉ์ด๋ค.
-
ํธ์ถ์๊ฐ ๋์ ํ๋ก์ธ์ค์ ์ฌ์ฉ์ ๋ค์์คํ์ด์ค์์
CAP_SYS_PTRACE
์ญ๋ฅ์ ๊ฐ์ง๊ณ ์๋ค.
์ฐธ๊ณ ๋ก commoncap LSM์์๋
PTRACE_MODE_READ
์PTRACE_MODE_ATTACH
๋ฅผ ๊ตฌ๋ถํ์ง ์๋๋ค. -
-
์ด์ ๋จ๊ณ๋ค์์ ์ ๊ทผ์ด ๊ฑฐ๋ถ๋์ง ์์์ผ๋ฉด ์ ๊ทผ์ ํ์ฉํ๋ค.
Yama ๋ฆฌ๋
์ค ๋ณด์ ๋ชจ๋(LSM)์ด ์ค์น๋ (์ฆ CONFIG_SECURITY_YAMA
๋ก ์ปค๋์ ๊ตฌ์ฑํ) ์์คํ
์์๋ (๋ฆฌ๋
์ค 3.4๋ถํฐ ์ฌ์ฉ ๊ฐ๋ฅํ) /proc/sys/kernel/yama/ptrace_scope
ํ์ผ์ ์ด์ฉํด ptrace()
๋ก ํ๋ก์ธ์ค๋ฅผ ์ถ์ ํ๋ ๊ฒ์ (๊ทธ๋์ strace(1)๋ gdb(1) ๊ฐ์ ๋๊ตฌ ์ฌ์ฉ์) ์ ์ฝํ ์ ์๋ค. ํ์ทจ๋ ํ๋ก์ธ์ค๊ฐ ๊ทธ ์ฌ์ฉ์๊ฐ ์์ ํ ๋ค๋ฅธ ๋ฏผ๊ฐํ ํ๋ก์ธ์ค(๊ฐ๋ น GPG ์์ด์ ํธ๋ SSH ์ธ์
)์ ptrace๋ก ๋ถ์ด์ ๋ฉ๋ชจ๋ฆฌ ๋ด์ ์์ ์ ์๋ ์ถ๊ฐ ํฌ๋ฆฌ๋ด์
์ ์ป์ด์ ๊ณต๊ฒฉ ๋ฒ์๋ฅผ ๋ํ๋ ํ๋ ๊ณต๊ฒฉ์ ๋ง๋ ๊ฒ์ด ๊ทธ ์ ์ฝ์ ๋ชฉ์ ์ด๋ค.
๋ ์๋ฐํ๊ฒ ๋งํด Yama LSM์ ๋ค์ ๋ ์ข ๋ฅ์ ๋์์ ์ ํํ๋ค.
-
ptrace ์ ๊ทผ ๋ชจ๋
PTRACE_MODE_ATTACH
๊ฒ์ฌ๋ฅผ ์ํํ๋ ๋ชจ๋ ๋์. ์๋ฅผ ๋ค์ดptrace()
,PTRACE_ATTACH
. (์์ "ptrace ์ ๊ทผ ๋ชจ๋ ๊ฒ์ฌ" ์ฐธ๊ณ .) -
ptrace()
PTRACE_TRACEME
CAP_SYS_PTRACE
์ญ๋ฅ์ ๊ฐ์ง ํ๋ก์ธ์ค๊ฐ /proc/sys/kernel/yama/ptrace_scope
ํ์ผ์ ๋ค์ ๊ฐ๋ค ์ค ํ๋๋ก ๊ฐฑ์ ํ ์ ์๋ค.
- 0 ("์ ํต์ ptrace ๊ถํ")
-
PTRACE_MODE_ATTACH
๊ฒ์ฌ๋ฅผ ์ํํ๋ ๋์์ (commoncap๊ณผ ๋ค๋ฅธ LSM์์ ๋ถ๊ณผํ๋ ๊ฒ ์ด์์ผ๋ก) ์ถ๊ฐ๋ก ์ ์ฝ์ ๊ฐํ์ง ์๋๋ค.PTRACE_TRACEME
์ฌ์ฉ์ ๋ณํ๊ฐ ์๋ค. - 1 ("์ ์ฝ๋ ptrace") [๊ธฐ๋ณธ๊ฐ]
-
PTRACE_MODE_ATTACH
๊ฒ์ฌ๊ฐ ํ์ํ ๋์์ ์ํํ ๋ ํธ์ถ ํ๋ก์ธ์ค๊ฐ ๋์ ํ๋ก์ธ์ค์ ์ฌ์ฉ์ ๋ค์์คํ์ด์ค์์CAP_SYS_PTRACE
์ญ๋ฅ์ ๊ฐ์ง๊ณ ์๊ฑฐ๋ ๋์ ํ๋ก์ธ์ค์ ๊ธฐ์ ๊ด๊ณ๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๊ธฐ์ ๊ด๊ณ๋ ๋์ ํ๋ก์ธ์ค๊ฐ ํธ์ถ์์ ์์์ด์ด์ผ ํ๋ค๋ ๊ฒ์ด๋ค.๋์ ํ๋ก์ธ์ค์์ prctl(2)
PR_SET_PTRACER
๋์์ ์ฌ์ฉํด์ ๊ทธ ๋์์PTRACE_MODE_ATTACH
๋์์ ์ํํ ์ ์๊ฒ ํ์ฉํ ์ถ๊ฐ PID๋ฅผ ์ ์ธํ ์ ์๋ค. ์์ธํ ๋ด์ฉ์ ์ปค๋ ์์ค ํ์ผDocumentation/admin-guide/LSM/Yama.rst
๋ฅผ (๋ฆฌ๋ ์ค 4.13 ์ ์์Documentation/security/Yama.txt
๋ฅผ) ๋ณด๋ผ.PTRACE_TRACEME
์ฌ์ฉ์ ๋ณํ๊ฐ ์๋ค. - 2 ("๊ด๋ฆฌ์๋ง ๋ถ๊ธฐ")
-
๋์ ํ๋ก์ธ์ค์ ์ฌ์ฉ์ ๋ค์์คํ์ด์ค์์
CAP_SYS_PTRACE
์ญ๋ฅ์ ๊ฐ์ง ํ๋ก์ธ์ค๋งPTRACE_MODE_ATTACH
๋์ ์ํ์ด๋PTRACE_TRACEME
์ฌ์ฉ ์์ ์ถ์ ์ ํ ์ ์๋ค. - 3 ("๋ถ๊ธฐ ๋ถ๊ฐ๋ฅ")
-
์ด๋ค ํ๋ก์ธ์ค๋
PTRACE_MODE_ATTACH
๋์ ์ํ์ด๋PTRACE_TRACEME
์ฌ์ฉ ์์ ์ถ์ ์ ์ํํ ์ ์๋ค.ํ์ผ์ ์ด ๊ฐ์ ํ๋ฒ ์จ๋ฃ๊ณ ๋๋ฉด ๋ฐ๊ฟ ์ ์๋ค.
1๊ณผ 2 ๊ฐ๊ณผ ๊ด๋ จํด์, ์ ์ฌ์ฉ์ ๋ค์์คํ์ด์ค๋ฅผ ์์ฑํ๋ฉด Yama๊ฐ ์ ๊ณตํ๋ ๋ณดํธ๊ฐ ์ค์ง์ ์ผ๋ก ๋ฌด๋ ฅํ๋๋ค๋ ์ ์ ์ ์ํด์ผ ํ๋ค. ์คํจ UID๊ฐ ์์ ์ฌ์ฉ์ ๋ค์์คํ์ด์ค ์์ฑ์์ UID์ ์ผ์นํ๋ ๋ถ๋ชจ ๋ค์์คํ์ด์ค ๋ด์ ํ๋ก์ธ์ค๊ฐ ๊ทธ ์์ ์ฌ์ฉ์ ๋ค์์คํ์ด์ค (๊ทธ๋ฆฌ๊ณ ๋ ๋จผ ์์๋ค) ๋ด์์ ๋์์ ์ํํ ๋ (CAP_SYS_PTRACE
๋ฅผ ํฌํจํ) ๋ชจ๋ ์ญ๋ฅ์ ๊ฐ์ง๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋์ ํ๋ก์ธ์ค๊ฐ ์ค์ค๋ก ์๋๋ฐ์ค์ ๋ค์ด๊ฐ๋ ค๊ณ ๋ค์์คํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ค ํ ๋ Yama LSM์ด ์ ๊ณตํ๋ ๋ณดํธ๋ฅผ ์๋์น ์๊ฒ ์ฝํ์ํค๊ฒ ๋๋ค.
์์คํ
ํธ์ถ ์์ค์์ PTRACE_PEEKTEXT
, PTRACE_PEEKDATA
, PTRACE_PEEKUSER
์์ฒญ์ API๊ฐ ๋ค๋ฅด๋ค. data
๋งค๊ฐ๋ณ์๋ก ์ง์ ํ ์ฃผ์์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๋ฉฐ ๋ฐํ ๊ฐ์ ์ค๋ฅ ํ๋๊ทธ์ด๋ค. glibc ๋ํผ ํจ์๊ฐ ์ DESCRIPTION์ ์ค๋ช
์ฒ๋ผ ํจ์ ๋ฐํ ๊ฐ์ ํตํด ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ API๋ฅผ ์ ๊ณตํ๋ค.
2.6 ์ปค๋ ํค๋ ์ฌ์ฉ ํธ์คํธ์์ PTRACE_SETOPTIONS
๊ฐ 2.4์์์ ๋ค๋ฅธ ๊ฐ์ผ๋ก ์ ์ธ๋์ด ์๋ค. ์ด ๋๋ฌธ์ 2.6 ์ปค๋ ํค๋๋ก ์ปดํ์ผ ํ ์์ฉ์ 2.4 ์ปค๋์์ ๋๋ฆด ๋ ๋ฌธ์ ๊ฐ ์๊ธด๋ค. PTRACE_OLDSETOPTIONS
๊ฐ ์ ์๋์ด ์์ผ๋ฉด PTRACE_SETOPTIONS
๋ฅผ ๊ทธ ๊ฐ์ผ๋ก ์ฌ์ ์ํด์ ํผํด ๊ฐ ์ ์๋ค.
๊ทธ๋ฃน-์ ์ง ์๋ฆผ์ด ์ถ์ ์์๊ฒ๋ ๊ฐ์ง๋ง ์ง์ง ๋ถ๋ชจ์๊ฒ๋ ๊ฐ์ง ์๋๋ค. 2.6.38.6์์ ๋ง์ง๋ง์ผ๋ก ํ์ธ.
์ค๋ ๋ ๊ทธ๋ฃน ๋ฆฌ๋๊ฐ ์ถ์ ๋์์ด๋ฉด์ _exit(2) ํธ์ถ๋ก ๋๋๋ฉด (์์ฒญ ์) PTRACE_EVENT_EXIT
์ ์ง๊ฐ ์ผ์ด๋์ง๋ง ํ์ WIFEXITED
์๋ฆผ์ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ๋ชจ๋ ๋๋๊ธฐ ์ ๊น์ง ์ ๋ฌ๋์ง ์๋๋ค. ์์์ ์ค๋ช
ํ ๊ฒ์ฒ๋ผ ๋ค๋ฅธ ์ค๋ ๋๋ค ์ค ํ๋๊ฐ execve(2)๋ฅผ ํธ์ถํ๋ฉด ์ค๋ ๋ ๊ทธ๋ฃน ๋ฆฌ๋์ ์ฃฝ์์ด ์ ๋ ๋ณด๊ณ ๋์ง ์๊ฒ ๋๋ค. exec ํ ์ค๋ ๋๋ฅผ ์ถ์ ์๊ฐ ์ถ์ ํ๊ณ ์์ง ์๋ค๋ฉด ์ถ์ ์๋ execve(2)๊ฐ ์ผ์ด๋ฌ๋ค๋ ๊ฒ์ ์ ๋ ๋ชจ๋ฅผ ๊ฒ์ด๋ค. ์ด๋ฅผ ํผํ๊ธฐ ์ํ ๋ฐฉ๋ฒ ํ๋๋ ์ด๋ฐ ๊ฒฝ์ฐ์ ์ค๋ ๋ ๊ทธ๋ฃน ๋ฆฌ๋๋ฅผ ์ฌ์์ ํ์ง ๋ง๊ณ PTRACE_DETACH
ํ๋ ๊ฒ์ด๋ค. 2.6.38.6์์ ๋ง์ง๋ง์ผ๋ก ํ์ธ.
SIGKILL
์๊ทธ๋์ด ์ฌ์ ํ ์ค์ ์๊ทธ๋ ์ฃฝ์ ์ ์ PTRACE_EVENT_EXIT
์ ์ง๋ฅผ ์ ๋ฐํ ์๋ ์๋ค. ํฅํ์๋ ๋ฐ๋ ์๋ ์๋ค. SIGKILL
์ ptrace ํ์์๋ ์ธ์ ๋ ํ์คํฌ๋ฅผ ์ฆ์ ์ฃฝ์ด๋๋ก ๋์ด ์๋ค. 3.13์์ ๋ง์ง๋ง์ผ๋ก ํ์ธ.
ํผ์ถ์ ์์๊ฒ ์๊ทธ๋์ด ๊ฐ์ง๋ง ์ถ์ ์๊ฐ ์ ๋ฌ์ ์ต์ ํ ๊ฒฝ์ฐ์ ์ผ๋ถ ์์คํ
ํธ์ถ๋ค์ด EINTR
์ผ๋ก ๋ฐํํ๋ค. (๊ทธ๊ฑด ์์ฃผ ํํ ๋์์ด๋ค. ๋๋ฒ๊ฑฐ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ๋ถ๊ธฐ๋ฅผ ํ ๋๋ง๋ค ๊ทธ๋ ๊ฒ ํด์ ๊ฐ์ง SIGSTOP
์ด ์๋ก ๋ฑ์ฅํ์ง ์๊ฒ ํ๋ค.) ๋ฆฌ๋
์ค 3.2.9 ํ์ฌ, ์ํฅ์ ๋ฐ๋ ์์คํ
ํธ์ถ๋ค: epoll_wait(2), inotify(7) ํ์ผ ๋์คํฌ๋ฆฝํฐ read(2)
. (์ด ๋ชฉ๋ก์ ์๋ง ๋ถ์์ ํ ๊ฒ์ด๋ค.) ์ด ๋ฒ๊ทธ์ ์ผ๋ฐ์ ์ฆ์์ ์กฐ์ฉํ ์๋ ํ๋ก์ธ์ค์ ๋ค์ ๋ช
๋ น์ผ๋ก ๋ถ์ ๋,
strace -p <process-ID>
๋ค์๊ณผ ๊ฐ์ ์ผ๋ฐ์ ์ด๊ณ ์์ ๊ฐ๋ฅํ ํ ์ค ์ถ๋ ฅ ๋์
restart_syscall(<... resuming interrupted call ...>_
select(6, [5], NULL, [5], NULL_
('_'๋ ์ปค์ ์์น๋ฅผ ๋ํ๋ธ๋ค.) ๊ฐ๋ น ๋ค์๊ณผ ๊ฐ์ ์ฌ๋ฌ ์ค์ ๋ณด๊ฒ ๋๋ค.
clock_gettime(CLOCK_MONOTONIC, {15370, 690928118}) = 0
epoll_wait(4,_
์ฌ๊ธฐ์๋ ๋ณด์ด์ง ์์ง๋ง strace(1)๊ฐ ๋ถ๊ธฐ ์ ์ ํ๋ก์ธ์ค๋ epoll_wait(2)์์ ๋ธ๋ก ๋์ด ์์๋ค. ๋ถ๊ธฐ ๋๋ฌธ์ epoll_wait(2)์ด EINTR
์ค๋ฅ๋ก ์ฌ์ฉ์ ๊ณต๊ฐ์ผ๋ก ๋ฐํํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๊ฒฝ์ฐ์์ ํ๋ก๊ทธ๋จ์ EINTR
์ ๋ํด ํ์ฌ ์๊ฐ์ ํ์ธํ๊ณ ๋ค์ epoll_wait(2)์ ์คํํ๋ ๊ฒ์ผ๋ก ๋์ํ๋ค. (๊ทธ๋ฐ "์ด์ ์๋" EINTR
๋ฅผ ์์ํ์ง ๋ชปํ ํ๋ก๊ทธ๋จ์ strace(1) ๋ถ๊ธฐ์ ๋ํด ์๋์น ์์ ๋ฐฉ์์ผ๋ก ๋์ํ ์ ์๋ค.)
์ผ๋ฐ์ ์ธ ๊ท์น๊ณผ ๋ฌ๋ฆฌ glibc์ ptrace()
๋ํผ์์ errno
๋ฅผ 0์ผ๋ก ์ค์ ํ ์ ์๋ค.
gdb(1), ltrace(1), strace(1), clone(2), execve(2), fork(2), gettid(2), prctl(2), seccomp(2), sigaction(2), tgkill(2), vfork(2), waitpid(2), exec(3), capabilities(7), signal(7)
2018-04-30