kernel/system_profiler: Do not allow non-root users access.

The single-team profiler can still be used without root access.
Part of #14961.
This commit is contained in:
Augustin Cavalier
2019-07-04 16:41:36 -04:00
parent ebb0db62d1
commit 6f6cba7c16
@@ -1543,6 +1543,9 @@ stop_system_profiler()
status_t status_t
_user_system_profiler_start(struct system_profiler_parameters* userParameters) _user_system_profiler_start(struct system_profiler_parameters* userParameters)
{ {
if (geteuid() != 0)
return B_PERMISSION_DENIED;
// copy params to the kernel // copy params to the kernel
struct system_profiler_parameters parameters; struct system_profiler_parameters parameters;
if (userParameters == NULL || !IS_USER_ADDRESS(userParameters) if (userParameters == NULL || !IS_USER_ADDRESS(userParameters)
@@ -1606,6 +1609,9 @@ _user_system_profiler_start(struct system_profiler_parameters* userParameters)
status_t status_t
_user_system_profiler_next_buffer(size_t bytesRead, uint64* _droppedEvents) _user_system_profiler_next_buffer(size_t bytesRead, uint64* _droppedEvents)
{ {
if (geteuid() != 0)
return B_PERMISSION_DENIED;
if (_droppedEvents != NULL && !IS_USER_ADDRESS(_droppedEvents)) if (_droppedEvents != NULL && !IS_USER_ADDRESS(_droppedEvents))
return B_BAD_ADDRESS; return B_BAD_ADDRESS;
@@ -1633,6 +1639,9 @@ _user_system_profiler_next_buffer(size_t bytesRead, uint64* _droppedEvents)
status_t status_t
_user_system_profiler_stop() _user_system_profiler_stop()
{ {
if (geteuid() != 0)
return B_PERMISSION_DENIED;
team_id team = thread_get_current_thread()->team->id; team_id team = thread_get_current_thread()->team->id;
InterruptsSpinLocker locker(sProfilerLock); InterruptsSpinLocker locker(sProfilerLock);
@@ -1652,6 +1661,9 @@ _user_system_profiler_stop()
status_t status_t
_user_system_profiler_recorded(system_profiler_parameters* userParameters) _user_system_profiler_recorded(system_profiler_parameters* userParameters)
{ {
if (geteuid() != 0)
return B_PERMISSION_DENIED;
if (userParameters == NULL || !IS_USER_ADDRESS(userParameters)) if (userParameters == NULL || !IS_USER_ADDRESS(userParameters))
return B_BAD_ADDRESS; return B_BAD_ADDRESS;
if (sRecordedParameters == NULL) if (sRecordedParameters == NULL)