Commit Graph

97 Commits

Author SHA1 Message Date
Ariel Abreu
62a3321e98 Fix darlinghq/darling#1444 2023-10-26 07:49:00 -04:00
Ariel Abreu
db65a1b009
Add a new tool for debugging darlingserver
This new tool (`dserverdbg`) runs on the host but connects to
darlingserver and makes unmanaged calls to retrieve debugging
information.

The initial set of subcommands available in this tool are `ps`,
`lsport`, `lspset`, and `lsmsg`:
  * `ps` lists processes currently registered with the server and how
    many Mach ports they have
  * `lsport` lists the ports of a given process (via PID) and their
    rights and messages counts (for receive rights)
  * `lspset` lists the members of a given portset (via PID and port
    name) and provides the same information about each port as `lsport`
  * `lsmsg` lists the messages of a given port (via PID and port name),
    providing sender PID (if available) and size

This tool may be expanded later to allow e.g. modifying logging settings
while darlingserver is running or perhaps searching through and
filtering the logs.
2023-10-04 00:23:56 -04:00
Ariel Abreu
5a3e170bf6
Introduce supplementary group tracking
This works very much like our UID/GID tracking.
2023-09-20 21:25:39 -04:00
Ariel Abreu
7dba61bfb8
Implement task_ident functions
These are required for `secd` sessions (i.e. for Security).
2023-07-31 19:30:14 -04:00
Ariel Abreu
a88ba44119
[log] Add mode argument and check for success
Make sure to pass a file mode argument to `open` (this is required with `O_CREAT`. Also, make sure to check for success (i.e. non-negative FD) before trying to using the log file.
2023-06-29 09:33:41 -04:00
Ariel Abreu
3a1c30c03e Allow some log categories to always be logged
This commit does not enable any categories with this new behavior, but
it allows for critical categories to always be logged, regardless of
log level. The main use case for this is for `kprintf` messages.
2023-05-02 16:23:37 -07:00
Zhaofeng Li
21e3c36904 Allow overriding xdg-user-dir executable
This makes it easier to set the path as xdg-user-dir may
not be in PATH.
2023-04-26 16:07:37 -06:00
scam.net
2ce6a5c294 also fix the lack of system_error header in stack-pool.cpp 2023-04-21 17:22:24 -04:00
scam.net
2f7ae9ba81 Include the system_error.h header to fix issues with compiling on clang 15 and 16 (as well as potentially other versions) 2023-04-21 16:49:03 -04:00
Ariel Abreu
b4e67c25a0
[process] Update architecture upon exec 2023-03-14 11:19:17 -04:00
Ariel Abreu
8e57a9213a
[thread] Ingore errors saving state after user-suspend
As the comment I added says, sometimes a process is killed while
user-suspended (e.g. when LLDB sends the kill signal while debugging).
In such cases, trying to save the state back to the process will fail
(since it no longer exists). We can safely ignore such errors, but let's
also log a warning just-in-case.
2023-03-13 13:31:32 -04:00
Trung Nguyen
b01df17317
fix: Workaround for WSL1 tmpfs bug
Do not mount /dev/shm with MS_NOEXEC flag on WSL1. A bug on WSL1
(https://github.com/microsoft/WSL/issues/8777) prevents files from
being mapped using mmap if the underlying filesystem is mounted
with MS_NOEXEC.
2022-08-29 22:02:01 +07:00
Trung Nguyen
12aa182f51
fix: Workaround for systems without overlayfs
Darling now be used without overlayfs by enabling
the environment "DARLING_NOOVERLAYFS". Darling also
disables overlayfs when it detects itself running in a WSL1
environment.

Without overlayfs, Darling will have to recursively copy all files
and folders from LIBEXEC_PATH to DPREFIX.
2022-08-25 08:54:24 +07:00
Trung Nguyen
2ad420c633
feat: Initial WSL1 support
- Implemented an alternative to pidfd_open for kernels older than 5.3.
mldr should send a "lifetime pipe" to darlingserver during process start.
When the process dies, darlingserver should receive a POLLHUP event.
- Set increased_limit.rlim_cur to default_limit.rlim_max on systems without
/proc/sys/fs/nr_open. On WSL1, this greatly increases the number of open file
descriptors available.
- For systems without NSpid in /proc/self/status, implemented a way to manage
thread IDs in darlingserver during checkin. darlingserver should receive a hint
address on the thread's stack, and then compare it with a stack pointer retrieved using
PTRACE_GETREGS
- Avoided sending socket messages when msg_hdr.msg_name->sun_path is an empty string.
A null msg_name is used instead, otherwise, on some systems, this would fail with EINVAL.
2022-08-21 20:59:24 +07:00
Ariel Abreu
2101f7a5a5
Implement some processor info duct-tape code 2022-07-12 19:03:17 -04:00
Ariel Abreu
13695c79b2
Report correct thread states 2022-07-05 16:42:40 -04:00
Ariel Abreu
d3a51300ea
Significantly reduce default logging output
Debug logging produces *lots* of output *very* quickly, so that's
disabled by default now. The log level can be controlled with the new
`DSERVER_LOG_LEVEL` env var. Just set it to the minimum level
you want to see in the output. It defaults to "error" so that only
error messages are logged.
2022-07-04 18:02:53 -04:00
Ariel Abreu
a6bfe117f7
Use a stack pool to reduce memory usage 2022-06-30 22:50:02 -04:00
Ariel Abreu
26ef1e040f
Use SIGUSR1 to perform leak checking when ASAN is enabled 2022-06-30 22:49:45 -04:00
Ariel Abreu
cfd5cb9999
Add additional log info for process kqchannels 2022-06-30 22:44:35 -04:00
Ariel Abreu
4f001e2a34
Add reply-push synchronization
This is used to avoid the server reading incorrect/corrupted reply
contents for pushed replies. This was happening because clients were
sending the push-reply call with the pointer to the message contents,
but they were immediately returning after sending it. This led to a race
condition in which the server would sometimes read the data after the
client had already overwritten/discarded said data.
2022-06-24 01:39:04 -04:00
Ariel Abreu
700d89812c
Don't allowed saved replies to be overwritten 2022-06-24 01:36:56 -04:00
Ariel Abreu
89a7a10d41
Minor fixes for the Message class 2022-06-24 01:36:28 -04:00
Ariel Abreu
d49022a865
Workaround for thread resuming from syscall return 2022-06-24 01:36:06 -04:00
Ariel Abreu
2d5e25be35
Ignore calls from non-existent threads
The thread might have died after sending the message, so
it might not exist by the time the server gets the message.
In that case, just ignore/drop the message.
2022-06-24 01:35:16 -04:00
Ariel Abreu
5bd9a87821
Merge pull request #2 from rdrpenguin04/main
Add mach_vm_msync
2022-06-18 23:01:21 -04:00
Ariel Abreu
a0115601ee
Call dtape_timer_fired within a microthread
This function calls other duct-taped functions that might need to wait
for a bit, so it needs to run in a microthread so it can do so.
2022-06-18 17:22:48 -04:00
Ariel Abreu
f2ad6c2cc2
Fix duct-tape timer scheduling
We were previously always updating the timer deadline. This meant that,
when a later deadline than the current one came along, we would update
the deadline to the later one. In effect, we were scheduling a timer for
the latest deadline available rather than the earliest.

The fix involves keeping track of the current deadline and not updating
it if the new deadline is later than the current one. There is an option
to override this behavior, however, because sometimes the timer_call code
changes the deadline on us to a later time and we *do* want to update it
when it tells us to do so explicitly. For example, the deadline returned
by timer_queue_expire is definitive: that's definitely the next deadline
we want. The deadline passed to timer_queue_assign, on the other hand,
is merely is a suggestion.
2022-06-18 16:51:59 -04:00
Ray Redondo
b37026af03 add mach_vm_msync 2022-06-17 23:18:21 -05:00
Ariel Abreu
814434f139
GetExecutablePath: Write the path out to the correct process
We were writing out the path to the target process (i.e. the one we're
looking up), but we should instead write it out to the process who made
the call.
2022-05-19 15:21:32 -04:00
Ariel Abreu
2d64a44c85
Schedule interrupts after pending calls if necessary
This resolves a race condition where we receive a call and then
immediately receive an interrupt while that call is still pending.
The new behavior is to go ahead and process the pending call, but we
trigger interrupt processing as soon as the call suspends.
2022-05-19 15:20:23 -04:00
Ariel Abreu
4f05ef945b
Defer kqchannel notifications until after read replies are sent
See DarlingServer::Kqchan::MachPort::_read() for why this is necessary.

This fixes crashes in libkqueue due to out-of-order kqchannel messages,
mainly visible in aslmanager.
2022-05-14 17:06:21 -04:00
Ariel Abreu
a4afa0cd29
Increase core limits on server startup
For some reason, the core limit is always set to 0 when the server
starts up, regardless of what the parent shell/program has it set to.
2022-05-14 16:57:42 -04:00
Ariel Abreu
51f08430c9
Remove capabilities and libcap dependency
Together with the corresponding changes in mldr, darlingserver no longer
requires capabilities while running! The next step towards making
Darling completely unprivileged would be to remove SUID from the main
Darling binary, but that's a task for some other time.

I originally started doing this to see if some issues I was seeing with
LLDB were related to the capabilities in mldr, but it seems they're
unrelated.
2022-05-10 21:08:07 -04:00
Ariel Abreu
fdc3420249
Make sure processes stay alive until kqchannels die 2022-05-10 21:02:07 -04:00
Ariel Abreu
9123bad915
Handle thread and process death asynchronously
What this means is that we no longer release and destroy Thread and
Process instances when the threads and processes they manage die.
Instead, we keep them alive to perform some cleanup (like finishing
active calls).

This should fix the duct-tape panic where threads and tasks are still
referenced at death.

Best of all, there don't seem to be any leaks with this approach: for
each `process dying` or `thread dying` message in the log, there's a
`process being destroyed` or `thread being destroyed` message later
on. This means we're not leaking any processes or threads.
2022-04-08 10:38:36 -04:00
Ariel Abreu
82892d3049
Move interrupter_enter processing to Thread class
This call needs to access lots of private thread members, so it's better
to provide a single private helper that handles the call in the Thread
class rather than have it all in a Call.
2022-04-08 10:27:53 -04:00
Ariel Abreu
80ab579ca2
Implement kernel runner queue scaling
This allows kernel runner threads to be created as necessary to process
the work that comes in through `kernelAsync` and `kernelSync`.

There's currently a hardcoded max of 10 permanent kernel runners.
However, if the workload is too much, temporary runners can be spawned;
each temporary worker processes a single work item and then exits. There
is no limit on the number of temporary workers that can be spawned.
2022-04-08 10:24:45 -04:00
Trung Nguyen
226610318c
chore: Address comments 2022-04-05 12:43:27 +07:00
Trung Nguyen
c5a32023f3
feat: Manage executable path in darlingserver 2022-04-05 09:25:23 +07:00
Ariel Abreu
761a292f11
Fix (rare) deadlock with process kqchannels 2022-04-04 17:39:40 -04:00
Ariel Abreu
7e1dd74cd2
Implement memory sharing (in mach_vm_remap)
This commit allows Darling processes to convert private memory in other
Darling processes into shared memory that they can access. This is
necessary, e.g. for LLDB.
2022-04-01 02:21:32 -04:00
Ariel Abreu
be203fd569
Allow threads to perform S2C calls at any time
This is possible now because we can signal threads with a real-time
signal that libsystem_kernel handles.
2022-04-01 02:11:17 -04:00
Ariel Abreu
b4fccbd6dd
Thread: Add mapFile call 2022-04-01 02:04:55 -04:00
Ariel Abreu
fe6df7af56
Add mprotect S2C call 2022-04-01 01:56:35 -04:00
Ariel Abreu
8a28cb0dde
Fix Process::memoryRegionInfo and change how it returns info
std::stoul is base 10 by default, so we were trying to process hex
values as decimal values(producing incorrect values, as expected).

Also, memoryRegionInfo now returns a structure with the info rather than
having everything passed in as a reference, just like memoryInfo was
recently changed to do as well. This should make easier to add more info
fields later.
2022-03-28 14:16:00 -04:00
Ariel Abreu
71a247e51e
Add support for nested interrupts 2022-03-27 14:50:23 -04:00
Ariel Abreu
d5aa92fb5c
Add a thread_suspended call 2022-03-24 14:03:35 -04:00
Ariel Abreu
94c0528f72
Add a ptrace_thupdate call 2022-03-24 14:02:37 -04:00
Ariel Abreu
337935e64c
Add a ptrace_sigexc call 2022-03-24 14:02:08 -04:00