삐걱삐걱정하다
ptraceptrace는 Unix와 여러 Unix 유사 운영 체제에서 발견되는 시스템 호출이다.ptrace(이름은 "프로세스 트레이스"의 약칭)를 사용함으로써 한 프로세스는 다른 프로세스를 제어할 수 있어 제어자가 대상의 내부 상태를 검사하고 조작할 수 있다.ptrace는 디버거와 다른 코드 분석 도구에 의해 사용되며, 주로 소프트웨어 개발의 보조 도구로 사용된다.
사용하다
ptrace는 디버거(gdb, dbx 등), strace, ltrace 등의 추적 도구, 코드 적용 도구 등에 의해 사용된다.ptrace는 또한 실행 중인 프로그램을 패치하거나, 고정되지 않은 버그를 방지하거나, 보안 기능을 극복하기 위해 전문 프로그램에 의해 사용된다.더 나아가 샌드박스와[1][2] 런타임 환경 시뮬레이터(루트 이외의[2][3] 소프트웨어에 대한 루트 액세스 에뮬레이션 등)로 사용할 수 있다.
ptrace 호출을 사용한 다른 프로세스에 부착함으로써 툴은 대상의 작동을 광범위하게 제어한다.여기에는 파일 설명자, 메모리 및 레지스터의 조작이 포함된다.대상의 코드를 한 번에 통과하고, 시스템 호출과 그 결과를 관찰하고 가로챌 수 있으며, 대상의 신호 핸들러를 조작하고, 그 대신 신호를 수신하고 전송할 수 있다.대상의 메모리에 쓸 수 있는 능력은 데이터 저장소를 변경할 수 있을 뿐만 아니라 애플리케이션 자체의 코드 세그먼트까지 변경할 수 있게 해 컨트롤러가 중단점을 설치하고 대상의 실행 코드를 패치할 수 있게 해준다.[4]
다른 프로세스를 검사하고 변경할 수 있는 능력이 매우 강력하기 때문에 ptrace는 소유자가 신호를 보낼 수 있는 프로세스에만 부착할 수 있으며(2.6.26 이전 커널의 초기화를 제외하고) 수퍼유저 계정은 거의 모든 프로세스를 추적할 수 있다.기능 기반 보안을 특징으로 하는 Linux 시스템에서는, ptrace 기능이 CAP_에 의해 더욱 제한된다.SYS_PTRACE 기능[5] 또는 YAMA Linux Security Module에 의한 기능.[6]FreeBSD에서는 FreeB에 의해 제한된다.SD 감옥 및 필수 액세스 제어 정책.
제한 사항
제어기와 대상 사이의 통신은 반복적인 ptrace 호출을 사용하여 이루어지며, 둘 사이의 작은 고정 크기 메모리 블록(통화당 두 개의 컨텍스트 스위치가 필요함)을 통과한다. 이는 단어 크기 블록에서만 가능하기 때문에 대상 메모리의 많은 양에 접근할 때 비효율적이다(ptrace call for e에 대한 ptrace call).어의를 [7]어기다이러한 이유로 유닉스 8판은 다른 프로세스의 메모리에 허용된 프로세스가 직접 액세스할 수 있는 procfs를 도입했다 - 4.4BSD가 그 뒤를 따랐고, 그 사용은/proc디버거 지원은 Solaris, BSD 및 AIX에 의해 상속되었으며 대부분 Linux에 의해 복사되었다.[7]Solaris와 같은 일부는 시스템 호출로서 ptrace를 완전히 제거하여 플랫폼의 profs 관점에서 ptrace에 대한 호출을 재해석하는 라이브러리 호출로 보존하고 있다.[8]이러한 시스템은 열린 파일의 설명자에 ioctls를 사용한다./proc 파일: 제어된 프로세스에 명령을 실행한다.[8]반면 FreeBSD는 언급된 문제를 제거하기 위해 ptrace를 확장했고, 고유의 설계 문제 때문에 profs가 쓸모없다고 선언했다.[vague][citation needed]
ptrace는 디버거와 유사한 도구를 지원하는 데 필요한 가장 기본적인 인터페이스만 제공한다.이를 사용하는 프로그램은 스택 레이아웃, 애플리케이션 바이너리 인터페이스, 시스템 호출 메커니즘, 이름 망링, 디버그 데이터 형식 등 OS와 아키텍처의 세부 사항에 대해 숙지하고 있어야 하며, 기계 코드 자체를 이해하고 분해할 책임이 있다.또한 대상 프로세스에 실행 가능한 코드를 주입하는 프로그램이나 (gdb와 같이) 사용자가 대상의 맥락에서 실행되는 명령을 입력할 수 있도록 하는 프로그램들은 일반적으로 프로그램 로더의 도움 없이 그 코드 자체를 생성하고 로딩해야 한다.
지원
Unix 및 BSD
ptrace는 Version 6 Unix에서 처음 구현되었으며,[9] SVR4와 4.3에 모두 포함되었다.유닉스의 BSD나뭇가지로 덮었다.[5]ptrace IRIX,[10]IBMAIX,[11]NetBSD,[12]FreeBSD,[13]OpenBSD,[14] 공급품 그리고 Linux에 대한 시스템 호출을 이용할 수 있다[5]ptrace 솔라리스에 대한 도서관 전화, 솔라리스 커널의 procfs 파일 시스템에서 제작 완료된, 태양은 솔라리스에 ptrace의 호환성을 위한 것이다 갖고 새로운 구현은 부유한 인터페이스 그 것을 당부하고 있다고 지적하고 구현됩니다.대신 물자를 [8]조달하다유닉스웨어는 또한 제한된 ptrace를[15] 특징으로 하지만 Sun과 마찬가지로 Sun과 마찬가지로 구현자는 기본 profs 기능을 대신 사용할 것을 권장한다.[16]HP-UX는 11i v3 릴리스까지 ptrace를 지원했다(11i v1에서 유사한 OS별 통화인 ttrace를 위해 사용되지 않음).[17]
마코스
애플의 macOS 또한 시스템 호출로 ptrace를 구현합니다.애플의 버전은 과정 자체에 이 옵션을 호출합니다 PT_DENY_ATTACH –, 후속적인 시도는 과정 ptrace에 실패할 특별한 옵션을 추가한다.[18]애플 debuggers의 아이튠즈 등DRM-ed 콘텐츠를 조작하는 프로그램에서 사용을 제한하도록 이 기능을 사용한다.[19]PT_DENY_ATTACH에 또한 DTrace의 능력은 절차를 감시하도록 설정합니다.[20]OSX에서 Debuggers 일반적으로 ptrace의 조합과 마하 VM과 실 API를 사용한다.[21]ptrace(다시 PT_DENY_ATTACH과)개발자들에게 애플 아이 폰에 사용할 수 있다.[22]
리눅스
리눅스 또한 프로세스들에 장착에서 다른 과정을 예방할 수 있습니다.프로세스를 호출할 수 있prctlsyscall고 해소하PR_SET_DUMPABLE국기, 나중에 낟알들이 이 호출 과정 ptracing에서 팝OpenSSH 인증 요원 ssh세션 ptrace을 통해 하이재킹을 예방하는 데에 이 메커니즘을 이용하여non-root 과정을 예방한다.[23][24][25]후에 우분투판은 리눅스 커널 과정이 거슬러 올라가과정의 부모보다 다른에서 ptrace할 점을 방지하도록 구성되어, 이 gdb과 strace 대상 과정을 운영하는 작업을 계속하지만, 관계 없는 실행 프로세스에 장착으로 막을 수 수 있다.[23]이 기능 조절에 통해 이뤄진다./proc/sys/kernel/yama/ptrace_scope설정합니다.[23]이 기능의 활성화 시스템에서 "처럼, 명령을 보여 줍니다.gdb --attach"그리고"strace -p" 일하지 않을 것이다.
우분투 10.10부터 ptrace만 자식 프로세스에서 호출될 수 있다.[23]
안드로이드
잠긴 부트 로더와 함께 안드로이드 폰이 들어, ptrace은 시스템 파일로 바꾸'2nd 부팅하도록init 과정을 장악하는 데 사용됩니다.[표창 필요한]
참조
- ^ sydbox
- ^ a b PRoot
- ^ "Fakeroot NG". Retrieved 2020-05-12.
- ^ 예를 들어 retty, 그 목표 대상의 텍스트 세그먼트에 실행 코드를 주입해 다른 프로세스의 파일 설명자를 바꿀 ptrace을 사용한다.
- ^ a b c "ptrace(2)manpage는",Linux 수동 구간 2.
- ^ Yama.txt 리눅스 Git에
- ^ a b 디자인과 구현 4.4BSD운영 체제의, 마샬 커크 McKusick, 키스 보스틱, 마이클 J.Karels, 존 쿼터만 씨 Addison-Wesley, 1996년 4월, 국제 표준 도서 번호 0-201-54979-4.
- ^ a b c "ptrace() 요청 값", Solaris 전환 가이드, Sun Micro시스템s, 2000
- ^ "Ptrace page from Section 2 of the unix-6th manual".
- ^ "ptrace(2)", IRIX 6.5 설명서, 섹션 2, SGI techpubs 라이브러리
- ^ "ptrace,ptracex,ptrace64 서브루틴", IBM AIX 기술 참조: 기본 운영 체제 및 확장, 1권
- ^ ptrace(2), netbsd 매뉴얼, 섹션 2
- ^ [1], FreeBSD 매뉴얼, 섹션 2
- ^ "ptrace(2)", OpenBSD 설명서, 섹션 2
- ^ ptrace(2), SCO UnixWare 7 설명서, 섹션 2
- ^ "시스템 호출 호환성 노트" 2011-07-16년 Wayback Machine에 보관된 UnixWare 7 설명서
- ^ "ptrace() System Call (Obsolete)", HP-UX 11i 버전 3 릴리스 노트:HP 9000 및 HP Integrity Servers, Hewlett Packard, 2007년 2월
- ^ "ptrace(2) 설명서 페이지", Apple Darwin/OS-X 설명서
- ^ "팬보이 소유: 해킹 맥 OS X", 찰리 밀러, 블랙햇 브리핑 2008
- ^ "Apple 'breaks's Sun 개발자 앱, Matthew Broersma, Computerworld UK, 2008년 1월 24일
- ^ 제9장 Mac OS X 내부: 시스템 접근 방식, 아미트 싱, ISBN 978-0-321-27854-8, 애디슨 웨슬리, 2006
- ^ "ptrace(2), BSD 시스템 호출 설명서, Apple iPhone OS 참조 라이브러리
- ^ a b c d "KernelHardening", Ubuntu 보안팀 로드맵
- ^ "prctl(2)", Linux 프로그래머 설명서, 섹션 2
- ^ 캐논컬 Ltd의 "PATCH ptrace: ptrace 범위 제한 허용" 게시.엔지니어 Kees Cook, Linux Kernel 메일링 목록, 2010년 6월 16일