ptrace

systémové volání

ptrace (anglicky process trace) je v informatice speciální systémové volání používané unixovými operačními systémy. Systémové volání ptrace umožňuje jednomu procesu ovládat druhý proces, takže je ho možné sledovat a měnit jeho vnitřní stavy. Volání ptrace je využíváno debuggery a dalšími nástroji zabývajícími se analýzou zdrojového kódu, většinou při vývoji software.

Využití editovat

Ptrace je využíváno debuggery (jako jsou gdb a dbx), trasovacími nástroji jako strace a ltrace a nástroji code coverage (zajímají se hloubkou testování kódu). Ptrace je také využíváno jako specializovaný program pro opravu běžících programů, aby se předešlo neočekávaným chybám či překonání bezpečnostních prvků.

Připojením se k jinému procesu využívajícím ptrace volání, má nástroj značnou kontrolu nad operacemi svého cíle. To zahrnuje ovládání jeho souborových deskriptorů, paměti a registrů procesoru. Může využít krokování kódu (angl. single-step) při průchodu cílovým kódem, či sledovat systémové volání a jejich výsledky. Dále je možné ovládat signály obsluhy procesoru a jak přijímat tak odesílat signály jeho jménem. Schopnost psát do cílové paměti umožňuje nejen měnit uložená data, ale také aplikaci vlastního segmentu kódu. To umožňuje, aby kontroler vložil "zarážky" (angl. Breakpoints ) a opravil běžící kód cíle.[1]

Jelikož možnost kontrolovat a měnit nějaký proces je velice mocný nástroj, může být ptrace využíváno pouze na procesy, kterým má vlastník povoleno posílat signály (typicky jeho vlastním procesům) ; superuživatelským účtem je možné využívat ptrace téměř na všechny procesy (s výjimkou init). V systémech Linux představující další možnosti zabezpečení, je schopnost ptrace dále omezena možnostmi CAP_SYS_PTRACE.[2] V FreeBSD, je limitováno pomocí FreeBSD jail a Mandatory access control politikou.

Omezení editovat

Komunikace mezi kontrolerem a cílem je prováděna pomocí opakovaného volání ptrace, posíláním malých pevných bloků paměti mezi sebou, což vyžaduje dvě změny kontextu (přepínání řízení mezi procesy) během každého volání. To je velice neefektivní při přístupu k velkému množství paměti cíle, protože tímto způsobem lze brát pouze bloky velikosti word (pro každý word nové volání ptrace).[3] Z tohoto důvodu osmá edice Unixu představuje procfs, které umožňuje povoleným procesům přímý přístup do paměti jiného procesu. Tato funkce byla implementována do verze 4.4BSD. Následně bylo užití /proc pro debuggery převzato do systémů Solaris, BSD, AIX a z větší části zkopírováno Linuxem.[3] V systému Solaris je ptrace zcela odstraněno jako systémové volání a je uzavřeno do volání knihovny, která předá volání do ptrace podle pravidel procfs.[4] Naopak FreeBSD rozšířilo ptrace a odstranilo tak výše zmíněné problémy a označilo procf za zastaralé, kvůli jeho návrhovým problémům.

Ptrace pouze poskytuje základní rozhraní nezbytné pro podporu debuggerů nebo podobných nástrojů. Programy (programátoři) jej využívající musí mít znalosti o daném operačním systému a jeho architektuře jako je stack layout, application binary interface, name mangling, the format of any debug data a odpovídají za porozumění a rozložení si strojového kódu. Porozumění systémovému volání vyžaduje znalost kontroleru mapovací tabulky systémového volání a pochopení příkazů (parametrů) každého volání. Dále programy vkládající spustitelný kód do cílového procesu nebo (jako gdb) umožňují uživateli zadávat příkazy spouštěné v rámci cíle, musí tento kód samy generovat a nahrávat obecně bez použití programového zavaděče.

Podpora editovat

Ptrace bylo poprvé implementováno do Unixu verze 7[5] a obsahují jej i dvě odnože Unixu SVR4 a BSD.[2] Jako systémové volání je ptrace dostupné i v IRIX,[6] AIX,[7] NetBSD,[8] FreeBSD,[5] OpenBSD[9] a Linuxu.[2] Na systému Solaris je dostupné jako volání knihovny, vestavěné v kernel procfs souborovém systému. Sun k tomu poznamenává, že ptrace je na systému Solaris kvůli zpětné kompatibilitě a doporučuje, aby nové implementace využívaly bohatšího rozhraní procfs, které jej nahrazuje.[4] UnixWare představuje také ptrace[10], ale podobně jako Sun, SCO doporučuje vývojářům místo něho použít základní vlastnosti procfs.[11] HP-UX podporuje ptrace do verze 11i v3 (bylo zavrženo ve prospěch ttrace).[12]

Apple Mac OS X také realizuje ptrace jako systémové volání. Verze od Apple přidává speciální možnost PT_DENY_ATTACH. Když proces zavolá tuto volbu sám na sebe následné pokusy o ptrace procesu se nezdaří.[13] Apple touto funkcí omezuje použití debuggerů na programy, které pracují s DRM (správou digitálních práv) včetně iTunes.[14] PT_DENY_ATTACH také zamezuje možnostem DTrace monitorovat proces.[15] Debuggery v OS X typicky využívají kombinaci ptrace a Mach VM.[16] Ptrace (opět s PT_DENY_ATTACH) je pro vývojáře k dispozici u Apple iPhone.[17]

Reference editovat

V tomto článku byl použit překlad textu z článku ptrace na anglické Wikipedii.

  1. For example retty uses ptrace to alter another process' file descriptors, and to inject executable code into the target's text segment
  2. a b c "ptrace(2) manpage", Linux manual section 2
  3. a b 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
  4. a b "ptrace() Request Values", Solaris Transition Guide, Sun Microsystems, 2000
  5. a b [1][nedostupný zdroj], FreeBSD manual, section 2
  6. "ptrace(2)" Archivováno 7. 6. 2011 na Wayback Machine., IRIX 6.5 manual, section 2, SGI techpubs library
  7. "ptrace,ptracex,ptrace64 subroutine", IBM AIX Technical Reference: Base Operating System and Extensions, Volume 1
  8. ptrace(2), netbsd manual, section 2
  9. "ptrace(2)" Archivováno 26. 11. 2010 na Wayback Machine., OpenBSD manual, section 2
  10. ptrace(2), SCO UnixWare 7 manual, section 2
  11. "System call compatibility notes" Archivováno 16. 7. 2011 na Wayback Machine., UnixWare 7 Documentation
  12. "ptrace() System Call (Obsolete)", HP-UX 11i Version 3 Release Notes: HP 9000 and HP Integrity Servers, Hewlett Packard, February 2007
  13. "ptrace(2) manual page", Apple Darwin/OS-X manual
  14. "Owning the Fanboys : Hacking Mac OS X", Charlie Miller, Black Hat Briefings conference 2008
  15. "Apple 'breaks' Sun developer app", Matthew Broersma, Computerworld UK, 24 January 2008
  16. Chapter 9, Mac OS X internals: a systems approach, Amit Singh, ISBN 978-0-321-27854-8, Addison Wesley, 2006
  17. "ptrace(2)", BSD System Calls Manual, Apple iPhone OS Reference Library

Externí odkazy editovat