ptrace(2) - wariua/manpages-ko GitHub Wiki

NAME

ptrace - ํ”„๋กœ์„ธ์Šค ์ถ”์ 

SYNOPSIS

#include <sys/ptrace.h>

long ptrace(enum __ptrace_request request, pid_t pid,
            void *addr, void *data);

DESCRIPTION

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 ํ•ญ๋ชฉ์„ ํ• ๋‹นํ•  ์ˆ˜๋Š” ์—†๋‹ค.)

ptrace ํ•˜์˜ ์ฃฝ์Œ

(๋‹ค์ค‘ ์Šค๋ ˆ๋“œ์ผ ์ˆ˜ ์žˆ๋Š”) ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ฃฝ์ด๊ธฐํ˜•(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_EVENT ์ •์ง€

์ถ”์ ์ž๊ฐ€ 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 ์š”์ฒญ์˜ ์™„๋ฃŒ์— ์˜ํ•ด์„œ SIGTRAP์ด ์ „๋‹ฌ๋˜์—ˆ๋‹ค.
si_code == SI_KERNEL (0x80)
์ปค๋„์ด SIGTRAP์„ ๋ณด๋ƒˆ๋‹ค.
si_code == SIGTRAP ๋˜๋Š” si_code == (SIGTRAP|0x80)
์‹œ์Šคํ…œ-ํ˜ธ์ถœ-์ •์ง€์ด๋‹ค.

ํ•˜์ง€๋งŒ ์‹œ์Šคํ…œ-ํ˜ธ์ถœ-์ •์ง€๊ฐ€ ๋งค์šฐ ์ž์ฃผ (์‹œ์Šคํ…œ ํ˜ธ์ถœ๋‹น ๋‘ ๋ฒˆ์”ฉ) ์ผ์–ด๋‚˜๋ฏ€๋กœ ์‹œ์Šคํ…œ-ํ˜ธ์ถœ-์ •์ง€๋งˆ๋‹ค 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 ์ •์ง€ (๋ฆฌ๋ˆ…์Šค 3.5์—์„œ 4.7๊นŒ์ง€)

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๋กœ ํ”ผ์ถ”์ ์ž๋ฅผ ์žฌ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ์— ๋‹ค์Œ์œผ๋กœ ๋ชฉ๊ฒฉํ•˜๋Š” ์ •์ง€๋Š” ์–ด์ฉŒ๋ฉด ์˜ˆ์ƒํ–ˆ์„ ์‹œ์Šคํ…œ-ํ˜ธ์ถœ-์ง„์ž…-์ •์ง€๊ฐ€ ์•„๋‹ˆ๋ผ ์‹œ์Šคํ…œ-ํ˜ธ์ถœ-ํ‡ด์žฅ-์ •์ง€๊ฐ€ ๋œ๋‹ค.

PTRACE_EVENT_SECCOMP ์ •์ง€ (๋ฆฌ๋ˆ…์Šค 4.8๋ถ€ํ„ฐ)

๋ฆฌ๋ˆ…์Šค 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_SINGLESTEP ์ •์ง€

[์ด ์ •์ง€ ์œ ํ˜•์— ๋Œ€ํ•œ ์„ธ๋ถ€ ๋‚ด์šฉ์€ ์•„์ง ๋ฌธ์„œํ™”๊ฐ€ ์ด๋ค„์ง€์ง€ ์•Š์•˜๋‹ค.]

์ •๋ณดํ˜• ๋ฐ ์žฌ์‹œ์ž‘ํ˜• ptrace ๋ช…๋ น

๋Œ€๋ถ€๋ถ„์˜ (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) ๊ฒฐ๊ณผ๋ฅผ ์†Œ๋ชจํ•  ๋•Œ ์ง„์งœ ๋ถ€๋ชจ์—๊ฒŒ (๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ”„๋กœ์„ธ์Šค ์ „์ฒด๊ฐ€ ๋๋‚  ๋•Œ๋งŒ ์ง„์งœ ๋ถ€๋ชจ์—๊ฒŒ) ๋ณด๊ณ ๋œ๋‹ค. ์ถ”์ ์ž์™€ ์ง„์งœ ๋ถ€๋ชจ๊ฐ€ ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค์ด๋ฉด ๋ณด๊ณ ๊ฐ€ ํ•œ ๋ฒˆ๋งŒ ๊ฐ„๋‹ค.

RETURN VALUE

์„ฑ๊ณต ์‹œ PTRACE_PEEK* ์š”์ฒญ์€ ์š”์ฒญํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  (ํ•˜์ง€๋งŒ NOTES ์ฐธ๊ณ ), PTRACE_SECCOMP_GET_FILTER ์š”์ฒญ์€ BPF ํ”„๋กœ๊ทธ๋žจ์˜ ์ธ์ŠคํŠธ๋Ÿญ์…˜ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ๋‹ค๋ฅธ ์š”์ฒญ์€ 0์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์˜ค๋ฅ˜ ์‹œ ๋ชจ๋“  ์š”์ฒญ์ด -1์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ errno๋ฅผ ์ ์ ˆํžˆ ์„ค์ •ํ•œ๋‹ค. PTRACE_PEEK* ์š”์ฒญ์ด ์„ฑ๊ณต ์‹œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์ด -1์ผ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ์•Œ๋ ค๋ฉด ํ˜ธ์ถœ์ž๊ฐ€ ํ˜ธ์ถœ ์ „์— errno๋ฅผ ๋น„์šฐ๊ณ ์„œ ํ˜ธ์ถœ ํ›„ ๊ฒ€์‚ฌํ•ด์•ผ ํ•œ๋‹ค.

ERRORS

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
์ง€์ •ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๊ฑฐ๋‚˜, ํ˜„์žฌ ํ˜ธ์ถœ์ž๊ฐ€ ์ถ”์  ์ค‘์ด ์•„๋‹ˆ๊ฑฐ๋‚˜, (ํ”ผ์ถ”์ ์ž๊ฐ€ ๋ฉˆ์ถฐ ์žˆ์–ด์•ผ ํ•˜๋Š” ์š”์ฒญ๋“ค์—์„œ) ๋ฉˆ์ถฐ์žˆ์ง€ ์•Š๋‹ค.

CONFORMING TO

SVr4, 4.3BSD.

NOTES

์•ž์„œ ์ œ์‹œํ•œ ์›ํ˜•์— ๋”ฐ๋ผ 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 ์ ‘๊ทผ ๋ชจ๋“œ ๊ฒ€์‚ฌ

(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๋ฅผ ๊ฐ€์ง„ ํ”„๋กœ์„ธ์Šค๊ฐ€ "๋Œ€์ƒ ํ”„๋กœ์„ธ์Šค"์ด๋‹ค.) ์•Œ๊ณ ๋ฆฌ๋“ฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ํ˜ธ์ถœ ์Šค๋ ˆ๋“œ์™€ ๋Œ€์ƒ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฐ™์€ ์Šค๋ ˆ๋“œ ๊ทธ๋ฃน์— ์†ํ•˜๋ฉด ์ ‘๊ทผ์„ ํ•ญ์ƒ ํ—ˆ์šฉํ•œ๋‹ค.

  2. ์ ‘๊ทผ ๋ชจ๋“œ์— PTRACE_MODE_FSCREDS๊ฐ€ ์ง€์ •๋ผ ์žˆ์œผ๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„์˜ ๊ฒ€์‚ฌ์—์„œ ํ˜ธ์ถœ์ž์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ UID ๋ฐ GID๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. (credentials(7)์—์„œ ์–ธ๊ธ‰ํ•˜๋“ฏ ํŒŒ์ผ ์‹œ์Šคํ…œ UID์™€ GID๋Š” ๊ฑฐ์˜ ์–ธ์ œ๋‚˜ ๋Œ€์‘ํ•˜๋Š” ์‹คํšจ ID์™€ ๊ฐ’์ด ๊ฐ™๋‹ค.)

    ๊ทธ๋ ‡์ง€ ์•Š๊ณ  ์ ‘๊ทผ ๋ชจ๋“œ์— PTRACE_MODE_REALCREDS๊ฐ€ ์ง€์ •๋ผ ์žˆ์œผ๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„์˜ ๊ฒ€์‚ฌ์— ํ˜ธ์ถœ์ž์˜ ์‹ค์ œ UID ๋ฐ GID๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. (ํ˜ธ์ถœ์ž์˜ UID์™€ GID๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ API์—์„œ๋Š” ์‹คํšจ ID๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์—ญ์‚ฌ์  ์ด์œ  ๋•Œ๋ฌธ์— PTRACE_MODE_REALCREDS ๊ฒ€์‚ฌ์—์„œ๋Š” ์‹ค์ œ ID๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.)

  3. ๋‹ค์Œ ์ค‘ ์–ด๋А ๊ฒƒ๋„ ์ฐธ์ด ์•„๋‹ˆ๋ฉด ์ ‘๊ทผ์„ ๊ฑฐ๋ถ€ํ•œ๋‹ค.

    • ๋Œ€์ƒ์˜ ์‹ค์ œ, ์‹คํšจ, saved-set ์‚ฌ์šฉ์ž ID๊ฐ€ ํ˜ธ์ถœ์ž์˜ ์‚ฌ์šฉ์ž ID์™€ ์ผ์น˜ํ•˜๊ณ  ๋Œ€์ƒ์˜ ์‹ค์ œ, ์‹คํšจ, saved-set ๊ทธ๋ฃน ID๊ฐ€ ํ˜ธ์ถœ์ž์˜ ๊ทธ๋ฃน ID์™€ ์ผ์น˜ํ•œ๋‹ค.

    • ํ˜ธ์ถœ์ž๊ฐ€ ๋Œ€์ƒ์˜ ์‚ฌ์šฉ์ž ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ CAP_SYS_PTRACE ์—ญ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

  4. ๋Œ€์ƒ ํ”„๋กœ์„ธ์Šค์˜ "๋คํ”„ ๊ฐ€๋Šฅ" ์†์„ฑ์ด 1 ์•„๋‹Œ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ (SUID_DUMP_USER. prctl(2)์˜ PR_SET_DUMPABLE ๋…ผ์˜ ์ฐธ๊ณ ) ํ˜ธ์ถœ์ž๊ฐ€ ๋Œ€์ƒ ํ”„๋กœ์„ธ์Šค์˜ ์‚ฌ์šฉ์ž ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ CAP_SYS_PTRACE ์—ญ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์œผ๋ฉด ์ ‘๊ทผ์„ ๊ฑฐ๋ถ€ํ•œ๋‹ค.

  5. ์ปค๋„ 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๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š”๋‹ค.

  6. ์ด์ „ ๋‹จ๊ณ„๋“ค์—์„œ ์ ‘๊ทผ์ด ๊ฑฐ๋ถ€๋˜์ง€ ์•Š์•˜์œผ๋ฉด ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•œ๋‹ค.

/proc/sys/kernel/yama/ptrace_scope

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์ด ์ œ๊ณตํ•˜๋Š” ๋ณดํ˜ธ๋ฅผ ์˜๋„์น˜ ์•Š๊ฒŒ ์•ฝํ™”์‹œํ‚ค๊ฒŒ ๋œ๋‹ค.

C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ/์ปค๋„ ์ฐจ์ด

์‹œ์Šคํ…œ ํ˜ธ์ถœ ์ˆ˜์ค€์—์„œ PTRACE_PEEKTEXT, PTRACE_PEEKDATA, PTRACE_PEEKUSER ์š”์ฒญ์€ API๊ฐ€ ๋‹ค๋ฅด๋‹ค. data ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ง€์ •ํ•œ ์ฃผ์†Œ์— ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๋ฉฐ ๋ฐ˜ํ™˜ ๊ฐ’์€ ์˜ค๋ฅ˜ ํ”Œ๋ž˜๊ทธ์ด๋‹ค. glibc ๋ž˜ํผ ํ•จ์ˆ˜๊ฐ€ ์œ„ DESCRIPTION์˜ ์„ค๋ช…์ฒ˜๋Ÿผ ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ๊ฐ’์„ ํ†ตํ•ด ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” API๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

BUGS

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์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

SEE ALSO

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

โš ๏ธ **GitHub.com Fallback** โš ๏ธ