ptrace is a system call found in Unix and several Unix-like operating systems.  By using ptrace (the name is an abbreviation of "process trace") one process can control another, enabling the controller to inspect and manipulate the internal state of its target. ptrace is used by debuggers and other code-analysis tools, mostly as aids to software development.

Uses
ptrace is used by debuggers (such as gdb and dbx), by tracing tools like strace and ltrace, and by code coverage tools. ptrace is also used by specialized programs to patch running programs, to avoid unfixed bugs or to overcome security features. It can further be used as a sandbox and as a run-time environment simulator (like emulating root access for non-root software).

By attaching to another process using the ptrace call, a tool has extensive control over the operation of its target. This includes manipulation of its file descriptors, memory, and registers.  It can single-step through the target's code, can observe and intercept system calls and their results, and can manipulate the target's signal handlers and both receive and send signals on its behalf. The ability to write into the target's memory allows not only its data store to be changed, but also the application's own code segment, allowing the controller to install breakpoints and patch the running code of the target.

As the ability to inspect and alter another process is very powerful, ptrace can attach only to processes that the owner can send signals to (typically only their own processes); the superuser account can ptrace almost any process (except init on kernels before 2.6.26). In Linux systems that feature capabilities-based security, the ability to ptrace is further limited by the CAP_SYS_PTRACE capability or by the YAMA Linux Security Module.  In FreeBSD, it is limited by FreeBSD jails and Mandatory Access Control policies.

Limitations
Communications between the controller and target take place using repeated calls of ptrace, passing a small fixed-size block of memory between the two (necessitating two context switches per call); this is acutely inefficient when accessing large amounts of the target's memory, as this can only be done in word sized blocks (with a ptrace call for each word). For this reason the 8th edition of Unix introduced procfs, which allows permitted processes direct access to the memory of another process - 4.4BSD followed, and the use of /proc for debugger support was inherited by Solaris, BSD, and AIX, and mostly copied by Linux. Some, such as Solaris, have removed ptrace as a system call altogether, retaining it as a library call that reinterprets calls to ptrace in terms of the platform's procfs. Such systems use ioctls on the file descriptor of the opened /proc file to issue commands to the controlled process. FreeBSD, on the other hand, extended ptrace to remove mentioned problems, and declared procfs obsolete due to its inherent design problems.

ptrace only provides the most basic interface necessary to support debuggers and similar tools. Programs using it must have intimate knowledge of the specifics of the OS and architecture, including stack layout, application binary interface, system call mechanism, name mangling, the format of any debug data, and are responsible for understanding and disassembling machine code themselves. Further, programs that inject executable code into the target process or (like gdb) allow the user to enter commands that are executed in the context of the target must generate and load that code themselves, generally without the help of the program loader.

Support

Unix and BSD 
ptrace was first implemented in Version 6 Unix, and was present in both the SVr4 and 4.3BSD branches of Unix.  ptrace is available as a system call on IRIX, IBM AIX, NetBSD, FreeBSD, OpenBSD, and Linux. ptrace is implemented as a library call on Solaris, built on the Solaris kernel's procfs filesystem; Sun notes that ptrace on Solaris is intended for compatibility, and recommends that new implementations use the richer interface that proc supplies instead.   UnixWare also features a limited ptrace but like Sun, SCO recommends implementers use the underlying procfs features instead. HP-UX supported ptrace until release 11i v3 (it was deprecated in favour of ttrace, a similar OS-specific call, in 11i v1).

macOS 
Apple's macOS also implements ptrace as a system call. Apple's version adds a special option PT_DENY_ATTACH – if a process invokes this option on itself, subsequent attempts to ptrace the process will fail. Apple uses this feature to limit the use of debuggers on programs that manipulate DRM-ed content, including iTunes.  PT_DENY_ATTACH on also disables DTrace's ability to monitor the process.  Debuggers on OS X typically use a combination of ptrace and the Mach VM and thread APIs. ptrace (again with PT_DENY_ATTACH) is available to developers for the Apple iPhone.

Linux 
Linux also gives processes the ability to prevent other processes from attaching to them. Processes can call the prctl syscall and clear their PR_SET_DUMPABLE flag; in later kernels this prevents non-root processes from ptracing the calling process; the OpenSSH authentication agent uses this mechanism to prevent ssh session hijacking via ptrace. Later Ubuntu versions ship with a Linux kernel configured to prevent ptrace attaches from processes other than the traced process' parent; this allows gdb and strace to continue to work when running a target process, but prevents them from attaching to an unrelated running process. Control of this feature is performed via the /proc/sys/kernel/yama/ptrace_scope setting. On systems where this feature is enabled, commands like "gdb --attach" and "strace -p" will not work.

Starting in Ubuntu 10.10, ptrace is only allowed to be called on child processes.

Android 
For some Android phones with a locked boot loader, ptrace is used to gain control over the init process to enable a '2nd boot' and replace the system files.

References

External links
 Article from Linux Gazette about ptrace
 Article about ptrace in linux journal

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

사용 
ptrace는 디버거(gdb 같은), strace와 ltrace 같은 트레이싱 툴 그리고 코드 커버리지 툴들에서 사용된다. ptrace는 또한 고쳐지지 않은 버그를 피하거나 보안 특성들을 극복하기 위한 특별한 프로그램들에 의해 실행 중인 프로그램들을 패치하는데 사용되기도 한다. 이것은 더 나아가 샌드박스로서 그리고 런타임 환경 시뮬레이터(비-루트 소프트웨어를 위한 루트 접근을 에뮬레이팅하는 것 같이)로서 사용되기도 한다.

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

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

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

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

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

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

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

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

각주

외부 링크 
 Article from Linux Gazette about ptrace
 Article about ptrace in linux journal

디버깅
유닉스