in vboxguest/vboxguest_core.c [1259:1348]
static int vbg_req_allowed(struct vbg_dev *gdev, struct vbg_session *session,
const struct vmmdev_request_header *req)
{
const struct vmmdev_guest_status *guest_status;
bool trusted_apps_only;
switch (req->request_type) {
/* Trusted users apps only. */
case VMMDEVREQ_QUERY_CREDENTIALS:
case VMMDEVREQ_REPORT_CREDENTIALS_JUDGEMENT:
case VMMDEVREQ_REGISTER_SHARED_MODULE:
case VMMDEVREQ_UNREGISTER_SHARED_MODULE:
case VMMDEVREQ_WRITE_COREDUMP:
case VMMDEVREQ_GET_CPU_HOTPLUG_REQ:
case VMMDEVREQ_SET_CPU_HOTPLUG_STATUS:
case VMMDEVREQ_CHECK_SHARED_MODULES:
case VMMDEVREQ_GET_PAGE_SHARING_STATUS:
case VMMDEVREQ_DEBUG_IS_PAGE_SHARED:
case VMMDEVREQ_REPORT_GUEST_STATS:
case VMMDEVREQ_REPORT_GUEST_USER_STATE:
case VMMDEVREQ_GET_STATISTICS_CHANGE_REQ:
trusted_apps_only = true;
break;
/* Anyone. */
case VMMDEVREQ_GET_MOUSE_STATUS:
case VMMDEVREQ_SET_MOUSE_STATUS:
case VMMDEVREQ_SET_POINTER_SHAPE:
case VMMDEVREQ_GET_HOST_VERSION:
case VMMDEVREQ_IDLE:
case VMMDEVREQ_GET_HOST_TIME:
case VMMDEVREQ_SET_POWER_STATUS:
case VMMDEVREQ_ACKNOWLEDGE_EVENTS:
case VMMDEVREQ_CTL_GUEST_FILTER_MASK:
case VMMDEVREQ_REPORT_GUEST_STATUS:
case VMMDEVREQ_GET_DISPLAY_CHANGE_REQ:
case VMMDEVREQ_VIDEMODE_SUPPORTED:
case VMMDEVREQ_GET_HEIGHT_REDUCTION:
case VMMDEVREQ_GET_DISPLAY_CHANGE_REQ2:
case VMMDEVREQ_VIDEMODE_SUPPORTED2:
case VMMDEVREQ_VIDEO_ACCEL_ENABLE:
case VMMDEVREQ_VIDEO_ACCEL_FLUSH:
case VMMDEVREQ_VIDEO_SET_VISIBLE_REGION:
case VMMDEVREQ_VIDEO_UPDATE_MONITOR_POSITIONS:
case VMMDEVREQ_GET_DISPLAY_CHANGE_REQEX:
case VMMDEVREQ_GET_DISPLAY_CHANGE_REQ_MULTI:
case VMMDEVREQ_GET_SEAMLESS_CHANGE_REQ:
case VMMDEVREQ_GET_VRDPCHANGE_REQ:
case VMMDEVREQ_LOG_STRING:
case VMMDEVREQ_GET_SESSION_ID:
trusted_apps_only = false;
break;
/* Depends on the request parameters... */
case VMMDEVREQ_REPORT_GUEST_CAPABILITIES:
guest_status = (const struct vmmdev_guest_status *)req;
switch (guest_status->facility) {
case VBOXGUEST_FACILITY_TYPE_ALL:
case VBOXGUEST_FACILITY_TYPE_VBOXGUEST_DRIVER:
vbg_err("Denying userspace vmm report guest cap. call facility %#08x\n",
guest_status->facility);
return -EPERM;
case VBOXGUEST_FACILITY_TYPE_VBOX_SERVICE:
trusted_apps_only = true;
break;
case VBOXGUEST_FACILITY_TYPE_VBOX_TRAY_CLIENT:
case VBOXGUEST_FACILITY_TYPE_SEAMLESS:
case VBOXGUEST_FACILITY_TYPE_GRAPHICS:
default:
trusted_apps_only = false;
break;
}
break;
/* Anything else is not allowed. */
default:
vbg_err("Denying userspace vmm call type %#08x\n",
req->request_type);
return -EPERM;
}
if (trusted_apps_only &&
(session->requestor & VMMDEV_REQUESTOR_USER_DEVICE)) {
vbg_err("Denying userspace vmm call type %#08x through vboxuser device node\n",
req->request_type);
return -EPERM;
}
return 0;
}