{{위키데이터 속성 추적}}
{{소문자}}
'''ptrace'''는 여러 [[유닉스]]와 [[유닉스 계열]] 운영 체제에서 발견되는 [[시스템 호출]]이다. ptrace(이 이름은 "process trace"의 축약형이다)를 통해 컨트롤러가 대상의 내부 상태를 조사하고 조작하게 함으로써, 한 [[프로세스]]가 다른 프로세스를 제어할 수 있다. ptrace는 [[디버거]]와 다른 코드 분석, 특히 소프트웨어 개발을 도와주는 도구들에서 사용된다.

== 사용 ==
ptrace는 디버거([[gdb]] 같은), [[strace]]와 [[ltrace]] 같은 트레이싱 툴 그리고 [[코드 커버리지]] 툴들에서 사용된다. ptrace는 또한 고쳐지지 않은 버그를 피하거나 보안 특성들을 극복하기 위한 특별한 프로그램들에 의해 실행 중인 프로그램들을 패치하는데 사용되기도 한다. 이것은 더 나아가 [[샌드박스 (컴퓨터 보안)|샌드박스]]<ref name="sydbox">[http://freecode.com/projects/sydbox sydbox]</ref><ref name="PRoot">[http://proot.me PRoot]</ref>로서 그리고 런타임 환경 시뮬레이터(비-루트 소프트웨어를 위한 루트 접근을 에뮬레이팅하는 것 같이<ref name="fakeroot-ng">{{웹 인용 |url=http://fakeroot-ng.lingnu.com/index.php/Home_Page |제목=fakeroot-ng |확인날짜=2016-05-05 |보존url=https://web.archive.org/web/20160409221042/http://fakeroot-ng.lingnu.com/index.php/Home_Page |보존날짜=2016-04-09 |url-status=dead }}</ref><ref name="PRoot"/>)로서 사용되기도 한다.

ptrace 호출을 사용해서 다른 프로세스를 어태치함으로써, 툴은 대상의 연산에 대한 광범위한 제어를 갖는다. 이것은 [[파일 서술자]], 메모리 그리고 [[프로세서 레지스터|레지스터]]에 대한 조작을 포함한다. 또한 대상의 코드를 싱글 스텝핑하고, 시스템 호출과 그 결과를 가로채며 대상의 [[유닉스 신호|시그널]] 핸들러와 행동에 대한 주고 받는 시그널들을 조작할 수도 있다. 대상의 메모리에 쓸 수 있는 권한은 단지 대상의 데이터 저장소가 아니라 애플리케이션의 코드 세그먼트도 포함하며, 컨트롤러가 대상의 실행 중인 코드에 [[브레이크포인트]]를 설치하고 패치할 수 있게 한다.<ref name="retty"/>

다른 프로세스를 조사하고 바꾸는 능력이 매우 강력함에 따라, ptrace는 오직 소유자가 시그널을 보낼 수 있는 프로세스들만 어태치할 수 있다(일반적으로 자신의 프로세스들); [[슈퍼 유저]] 계정은 거의 대부분의 프로세스를 ptrace할 수 있다(커널 2.6.26 이전 버전에서 init을 제외하고). capabilities 기반 보안의 특징을 갖는 리눅스 시스템들에서 ptrace의 능력은 CAP_SYS_PTRACE capability<ref name="linux_manpage"/> 또는 YAMA [[리눅스 보안 모듈]]에 의해 제한된다.<ref name="YAMA">[https://www.kernel.org/doc/Documentation/security/Yama.txt Yama.txt in Linux Git]</ref> [[FreeBSD]]에서는 FreeBSD jail과 강제적 접근 통제 정책들에 의해 제한된다.

== 제한 ==
컨트롤러와 대상 사이의 통신들은, 고정된 작은 크기의 메모리 블록을 둘 사이에 전달하는 ptrace의 반복되는 호출들을 사용해서 이뤄진다(호출 마다 두 [[문맥 교환]]을 필요로하는); 이것은 오직 워드 크기의 블록들을 통해서 수행됨으로 인해 대상의 메모리의 큰 양에 접근할 때 상당한 비효율을 보인다(각 워드마다 ptrace 호출이 필요하다).<ref name="mckusick"/> 이 이유로 유닉스의 8th 에디션은 procfs를 도입하였는데, 이것은 다른 프로세스의 메모리에 대한 직접적인 접근을 허용한다 - 디버거 지원을 위한 <code>/proc</code>의 사용은 솔라리스, BSD, AIX에서도 지원되며 리눅스도 이것과 거의 비슷하게 카피하였다.<ref name="mckusick"/> 솔라리스 같은 몇몇은 시스템 호출로서의 ptrace를 완전히 제거하고, 이것의 호출을 플랫폼의 procfs로 변환하는 라이브러리 호출로 고정시켰다.<ref name="solaris_ptrace_proc"/> 이러한 시스템들은 제어받는 프로세스에 명령어를 보내기 위해 열린 /proc 파일의 파일 서술자에 [[Ioctl|ioctls]]를 사용한다.<ref name="solaris_ptrace_proc"/>

ptrace는 디버거와 그것과 비슷한 툴들을 지원하는데 필요한 단지 가장 기본적인 인터페이스를 제공한다. 이것을 사용하는 프로그램은 반드시 스택 레이아웃, [[응용 프로그램 이진 인터페이스]], [[시스템 호출]] 메커니즘, 네임 맹글링, 디버그 데이터의 포맷 그리고 [[기계어]]의 디스어셈블링에 대한 이해 같은 운영체제와 아키텍처에 대한 구체적인 지식을 알아야 한다. 더 나아가 대상 프로세스에 실행 가능한 코드를 삽입하는(gdb 같이) 또는 사용자가 대상의 문맥에 명령어를 입력할 수 있게 하는 프로그램은 [[로더 (컴퓨팅)|프로그램 로더]]의 도움 없이 반드시 자신의 코드를 스스로 생성하고 로드해야 한다.

== 지원 ==
ptrace는 리눅스를 포함한 여러 유닉스 계열들에서 지원된다.

리눅스는 또한 프로세스들에게 다른 프로세스들이 자신을 어태치하는 것을 막는 능력을 준다. 프로세스들은 <code>prctl</code> syscall을 호출할 수 있으며 자신의 <code>PR_SET_DUMPABLE</code> 플래그를 클리어할 수 있다; 최근 커널들에서 이것은 비-루트 프로세스들이 호출하는 프로세스를 ptrace하는 것을 막는다; [[오픈SSH|OpenSSH]] 인증 에이전트는 이 메커니즘을 ptrace를 통한 ssh 세션 하이재킹을 막는데 사용한다.<ref name="linux_prctl"/><ref name="kees_cook"/><ref name="ubuntu"/>

이 특징이 활성화된 시스템에서 "<code>gdb --attach</code>"와 "<code>strace -p</code>" 같은 명령어들은 통하지 않을 것이다. ptrace_scope 제한의 알려진 의도는 더 나은 보안이었지만, 이것이 단지 보안 연극(security theater)이라는 것은 쉽게 알아챌 수 있다; 사용자의 계정을 크랙한 공격자는 ptrace를 다른 의도로 사용함으로써 쉽게 의도를 달성할 수 있다.

잠긴 부트 로더를 가진 몇몇 안드로이드 폰들에서 ptrace는 '2nd 부트'를 활성화하고 시스템 파일들을 대체하기 위해 init 프로세스에 대한 통제를 얻는데 사용될 수 있다.

== 각주 ==
{{각주|30em|refs=

<ref name="linux_manpage">[http://linux.die.net/man/2/ptrace "ptrace(2) manpage"], Linux manual section 2</ref>

<ref name="solaris_ptrace_proc">[http://docs.sun.com/app/docs/doc/805-6331/6j5vgg69p?a=view "ptrace() Request Values"], ''Solaris Transition Guide'', [[썬 마이크로시스템즈]], 2000</ref>

<ref name="retty">For example [http://pasky.or.cz/~pasky/dev/retty/ retty] uses ptrace to alter another process' file descriptors, and to inject executable code into the target's text segment</ref>

<ref name="mckusick">''The Design and Implementation of the 4.4 BSD Operating System'', Marshall Kirk McKusick, Keith Bostic, Michael J. Karels, John Quarterman, Addison-Wesley, April 1996, {{ISBN|0-201-54979-4}}</ref>

<ref name="ubuntu">[https://wiki.ubuntu.com/SecurityTeam/Roadmap/KernelHardening#ptrace_Protection "KernelHardening"], Ubuntu security team roadmap</ref>

<ref name="linux_prctl">[http://linux.die.net/man/2/prctl "prctl(2)"],  Linux programmer's manual, section 2</ref>

<ref name="kees_cook">[http://www.gossamer-threads.com/lists/linux/kernel/1239943 "PATCH ptrace: allow restriction of ptrace scope"] posting by Canonical Ltd. engineer Kees Cook, Linux Kernel mailing list, June 16, 2010</ref>

}}

== 외부 링크 ==
* [https://web.archive.org/web/20100330123847/http://tldp.org/LDP/LGNET/81/sandeep.html Article from Linux Gazette about ptrace]
* [http://www.linuxjournal.com/article/6100 Article about ptrace in linux journal]

[[분류:디버깅]]
[[분류:유닉스]]