삐걱삐걱정하다

ptrace

ptraceUnix와 여러 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 과정을 장악하는 데 사용됩니다.[표창 필요한]

참조

  1. ^ sydbox
  2. ^ a b PRoot
  3. ^ "Fakeroot NG". Retrieved 2020-05-12.
  4. ^ 예를 들어 retty, 그 목표 대상의 텍스트 세그먼트에 실행 코드를 주입해 다른 프로세스의 파일 설명자를 바꿀 ptrace을 사용한다.
  5. ^ a b c "ptrace(2)manpage는",Linux 수동 구간 2.
  6. ^ Yama.txt 리눅스 Git에
  7. ^ a b 디자인과 구현 4.4BSD운영 체제의, 마샬 커크 McKusick, 키스 보스틱, 마이클 J.Karels, 존 쿼터만 씨 Addison-Wesley, 1996년 4월, 국제 표준 도서 번호 0-201-54979-4.
  8. ^ a b c "ptrace() 요청 값", Solaris 전환 가이드, Sun Micro시스템s, 2000
  9. ^ "Ptrace page from Section 2 of the unix-6th manual".
  10. ^ "ptrace(2)", IRIX 6.5 설명서, 섹션 2, SGI techpubs 라이브러리
  11. ^ "ptrace,ptracex,ptrace64 서브루틴", IBM AIX 기술 참조: 기본 운영 체제 및 확장, 1권
  12. ^ ptrace(2), netbsd 매뉴얼, 섹션 2
  13. ^ [1], FreeBSD 매뉴얼, 섹션 2
  14. ^ "ptrace(2)", OpenBSD 설명서, 섹션 2
  15. ^ ptrace(2), SCO UnixWare 7 설명서, 섹션 2
  16. ^ "시스템 호출 호환성 노트" 2011-07-16년 Wayback Machine에 보관된 UnixWare 7 설명서
  17. ^ "ptrace() System Call (Obsolete)", HP-UX 11i 버전 3 릴리스 노트:HP 9000 및 HP Integrity Servers, Hewlett Packard, 2007년 2월
  18. ^ "ptrace(2) 설명서 페이지", Apple Darwin/OS-X 설명서
  19. ^ "팬보이 소유: 해킹 OS X", 찰리 밀러, 블랙햇 브리핑 2008
  20. ^ "Apple 'breaks's Sun 개발자 , Matthew Broersma, Computerworld UK, 2008년 1월 24일
  21. ^ 제9장 Mac OS X 내부: 시스템 접근 방식, 아미트 싱, ISBN 978-0-321-27854-8, 애디슨 웨슬리, 2006
  22. ^ "ptrace(2), BSD 시스템 호출 설명서, Apple iPhone OS 참조 라이브러리
  23. ^ a b c d "KernelHardening", Ubuntu 보안팀 로드맵
  24. ^ "prctl(2)", Linux 프로그래머 설명서, 섹션 2
  25. ^ 캐논컬 Ltd "PATCH ptrace: ptrace 범위 제한 허용" 게시.엔지니어 Kees Cook, Linux Kernel 메일링 목록, 2010년 6월 16일

외부 링크