ptrace.cpp 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. /*
  2. * Copyright (c) 2020, Itamar S. <itamar8910@gmail.com>
  3. * Copyright (c) 2020-2021, Andreas Kling <kling@serenityos.org>
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #include <AK/ScopeGuard.h>
  8. #include <Kernel/Process.h>
  9. #include <Kernel/VM/MemoryManager.h>
  10. #include <Kernel/VM/PrivateInodeVMObject.h>
  11. #include <Kernel/VM/ProcessPagingScope.h>
  12. #include <Kernel/VM/Region.h>
  13. #include <Kernel/VM/SharedInodeVMObject.h>
  14. namespace Kernel {
  15. static KResultOr<u32> handle_ptrace(const Kernel::Syscall::SC_ptrace_params& params, Process& caller)
  16. {
  17. ScopedSpinLock scheduler_lock(g_scheduler_lock);
  18. if (params.request == PT_TRACE_ME) {
  19. if (Process::current()->tracer())
  20. return EBUSY;
  21. caller.set_wait_for_tracer_at_next_execve(true);
  22. return KSuccess;
  23. }
  24. // FIXME: PID/TID BUG
  25. // This bug allows to request PT_ATTACH (or anything else) the same process, as
  26. // long it is not the main thread. Alternatively, if this is desired, then the
  27. // bug is that this prevents PT_ATTACH to the main thread from another thread.
  28. if (params.tid == caller.pid().value())
  29. return EINVAL;
  30. auto peer = Thread::from_tid(params.tid);
  31. if (!peer)
  32. return ESRCH;
  33. Locker ptrace_locker(peer->process().ptrace_lock());
  34. if ((peer->process().uid() != caller.euid())
  35. || (peer->process().uid() != peer->process().euid())) // Disallow tracing setuid processes
  36. return EACCES;
  37. if (!peer->process().is_dumpable())
  38. return EACCES;
  39. auto& peer_process = peer->process();
  40. if (params.request == PT_ATTACH) {
  41. if (peer_process.tracer()) {
  42. return EBUSY;
  43. }
  44. auto result = peer_process.start_tracing_from(caller.pid());
  45. if (result.is_error())
  46. return result.error();
  47. ScopedSpinLock lock(peer->get_lock());
  48. if (peer->state() != Thread::State::Stopped) {
  49. peer->send_signal(SIGSTOP, &caller);
  50. }
  51. return KSuccess;
  52. }
  53. auto* tracer = peer_process.tracer();
  54. if (!tracer)
  55. return EPERM;
  56. if (tracer->tracer_pid() != caller.pid())
  57. return EBUSY;
  58. if (peer->state() == Thread::State::Running)
  59. return EBUSY;
  60. scheduler_lock.unlock();
  61. switch (params.request) {
  62. case PT_CONTINUE:
  63. peer->send_signal(SIGCONT, &caller);
  64. break;
  65. case PT_DETACH:
  66. peer_process.stop_tracing();
  67. peer->send_signal(SIGCONT, &caller);
  68. break;
  69. case PT_SYSCALL:
  70. tracer->set_trace_syscalls(true);
  71. peer->send_signal(SIGCONT, &caller);
  72. break;
  73. case PT_GETREGS: {
  74. if (!tracer->has_regs())
  75. return EINVAL;
  76. auto* regs = reinterpret_cast<PtraceRegisters*>(params.addr);
  77. if (!copy_to_user(regs, &tracer->regs()))
  78. return EFAULT;
  79. break;
  80. }
  81. case PT_SETREGS: {
  82. if (!tracer->has_regs())
  83. return EINVAL;
  84. PtraceRegisters regs {};
  85. if (!copy_from_user(&regs, (const PtraceRegisters*)params.addr))
  86. return EFAULT;
  87. auto& peer_saved_registers = peer->get_register_dump_from_stack();
  88. // Verify that the saved registers are in usermode context
  89. if ((peer_saved_registers.cs & 0x03) != 3)
  90. return EFAULT;
  91. tracer->set_regs(regs);
  92. copy_ptrace_registers_into_kernel_registers(peer_saved_registers, regs);
  93. break;
  94. }
  95. case PT_PEEK: {
  96. Kernel::Syscall::SC_ptrace_peek_params peek_params {};
  97. if (!copy_from_user(&peek_params, reinterpret_cast<Kernel::Syscall::SC_ptrace_peek_params*>(params.addr)))
  98. return EFAULT;
  99. if (!is_user_address(VirtualAddress { peek_params.address }))
  100. return EFAULT;
  101. auto result = peer->process().peek_user_data(Userspace<const u32*> { (FlatPtr)peek_params.address });
  102. if (result.is_error())
  103. return result.error();
  104. if (!copy_to_user(peek_params.out_data, &result.value()))
  105. return EFAULT;
  106. break;
  107. }
  108. case PT_POKE:
  109. if (!is_user_address(VirtualAddress { params.addr }))
  110. return EFAULT;
  111. return peer->process().poke_user_data(Userspace<u32*> { (FlatPtr)params.addr }, params.data);
  112. case PT_PEEKDEBUG: {
  113. Kernel::Syscall::SC_ptrace_peek_params peek_params {};
  114. if (!copy_from_user(&peek_params, reinterpret_cast<Kernel::Syscall::SC_ptrace_peek_params*>(params.addr)))
  115. return EFAULT;
  116. auto result = peer->peek_debug_register(reinterpret_cast<uintptr_t>(peek_params.address));
  117. if (result.is_error())
  118. return result.error();
  119. if (!copy_to_user(peek_params.out_data, &result.value()))
  120. return EFAULT;
  121. break;
  122. }
  123. case PT_POKEDEBUG:
  124. return peer->poke_debug_register(reinterpret_cast<uintptr_t>(params.addr), params.data);
  125. default:
  126. return EINVAL;
  127. }
  128. return KSuccess;
  129. }
  130. KResultOr<FlatPtr> Process::sys$ptrace(Userspace<const Syscall::SC_ptrace_params*> user_params)
  131. {
  132. REQUIRE_PROMISE(ptrace);
  133. Syscall::SC_ptrace_params params {};
  134. if (!copy_from_user(&params, user_params))
  135. return EFAULT;
  136. auto result = handle_ptrace(params, *this);
  137. return result.is_error() ? result.error().error() : result.value();
  138. }
  139. /**
  140. * "Does this process have a thread that is currently being traced by the provided process?"
  141. */
  142. bool Process::has_tracee_thread(ProcessID tracer_pid)
  143. {
  144. if (auto tracer = this->tracer())
  145. return tracer->tracer_pid() == tracer_pid;
  146. return false;
  147. }
  148. KResultOr<u32> Process::peek_user_data(Userspace<const u32*> address)
  149. {
  150. uint32_t result;
  151. // This function can be called from the context of another
  152. // process that called PT_PEEK
  153. ProcessPagingScope scope(*this);
  154. if (!copy_from_user(&result, address)) {
  155. dbgln("Invalid address for peek_user_data: {}", address.ptr());
  156. return EFAULT;
  157. }
  158. return result;
  159. }
  160. KResult Process::poke_user_data(Userspace<u32*> address, u32 data)
  161. {
  162. Range range = { VirtualAddress(address), sizeof(u32) };
  163. auto* region = space().find_region_containing(range);
  164. if (!region)
  165. return EFAULT;
  166. ProcessPagingScope scope(*this);
  167. if (region->is_shared()) {
  168. // If the region is shared, we change its vmobject to a PrivateInodeVMObject
  169. // to prevent the write operation from changing any shared inode data
  170. VERIFY(region->vmobject().is_shared_inode());
  171. auto vmobject = PrivateInodeVMObject::create_with_inode(static_cast<SharedInodeVMObject&>(region->vmobject()).inode());
  172. if (!vmobject)
  173. return ENOMEM;
  174. region->set_vmobject(vmobject.release_nonnull());
  175. region->set_shared(false);
  176. }
  177. const bool was_writable = region->is_writable();
  178. if (!was_writable) {
  179. region->set_writable(true);
  180. region->remap();
  181. }
  182. ScopeGuard rollback([&]() {
  183. if (!was_writable) {
  184. region->set_writable(false);
  185. region->remap();
  186. }
  187. });
  188. if (!copy_to_user(address, &data)) {
  189. dbgln("poke_user_data: Bad address {:p}", address.ptr());
  190. return EFAULT;
  191. }
  192. return KSuccess;
  193. }
  194. KResultOr<u32> Thread::peek_debug_register(u32 register_index)
  195. {
  196. u32 data;
  197. switch (register_index) {
  198. case 0:
  199. data = m_debug_register_state.dr0;
  200. break;
  201. case 1:
  202. data = m_debug_register_state.dr1;
  203. break;
  204. case 2:
  205. data = m_debug_register_state.dr2;
  206. break;
  207. case 3:
  208. data = m_debug_register_state.dr3;
  209. break;
  210. case 6:
  211. data = m_debug_register_state.dr6;
  212. break;
  213. case 7:
  214. data = m_debug_register_state.dr7;
  215. break;
  216. default:
  217. return EINVAL;
  218. }
  219. return data;
  220. }
  221. KResult Thread::poke_debug_register(u32 register_index, u32 data)
  222. {
  223. switch (register_index) {
  224. case 0:
  225. m_debug_register_state.dr0 = data;
  226. break;
  227. case 1:
  228. m_debug_register_state.dr1 = data;
  229. break;
  230. case 2:
  231. m_debug_register_state.dr2 = data;
  232. break;
  233. case 3:
  234. m_debug_register_state.dr3 = data;
  235. break;
  236. case 7:
  237. m_debug_register_state.dr7 = data;
  238. break;
  239. default:
  240. return EINVAL;
  241. }
  242. return KSuccess;
  243. }
  244. }