Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp6656590imu; Wed, 14 Nov 2018 05:08:15 -0800 (PST) X-Google-Smtp-Source: AJdET5dkaFW9axrbKuDwCcGXgGYk4HX8GAgzeDDhG49wa+Ye4y4nlATLtJfh/Q4r85dymHttVOq6 X-Received: by 2002:a62:93d5:: with SMTP id r82-v6mr1911967pfk.55.1542200895904; Wed, 14 Nov 2018 05:08:15 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1542200895; cv=none; d=google.com; s=arc-20160816; b=tQfNPKea/Jl9jV6SZSj5XfbprSAlDkMnMA04g7HsELd4q/fLk1h3OmdqMaSWpqrVTi KyuJ3SHOT/7Y3KWLkZPvV2gktTIDpRW3SRDt72rA7qt++OTsA0FlksKJW9KuTwtLVwpG hUWhjUCHiM6fJBuNpa00GNB+q4bxjzuWyrx9xbOItn3DZVRGI62XG0Z97eA6AKhUS9/A n6TvHupTjXYOLONgCU4XacIqoTeGvQppSbDcMB+KsRVF1gZeCHvzq00CL2xiF/4wIEmT yJYICeiMMY/y6MvHFjLpwMbKw1U3ESxR7qNMrml/GtJqNsLARc3kJgq0t/CKXnPLrfNK cStQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=jY/UFCz8PIRjByHlsuj/mXPL0j5ejHSHK+uh3DIbbNM=; b=fcENyL22jKo9+gTAzyZmTvZ5Dl1PqCnjH2N/IVhQc10Y/4rpv1UYaFtx/1Z3gDIJv7 /VuAbXJhFIEkoc1WEyljqNqdBATn8bPAovo4XHmonFYBAOhEfNN7s+HApPe52zTjnblA /6tR/mZPyY46+VM8JnBpzfdVqC0c1eoxDpv7OufFNz6IS5co/Z3idZS+38S7lo/JMpN7 e2tN+qGxVqrR/6dVMJDLHA1Nd2JHQoH+ZYRDQEwXt44nsSFbiJl3+zY1m/ODLmUVbC2g 1YtejSQibnyFqwKatezl5XV7QKQ57RbyIA21iiNhs2jtSwQ3liSzOXxEQhVxu+ziO7f9 DI3Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=aZWL8FW4; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id d17si23335109pgl.484.2018.11.14.05.07.56; Wed, 14 Nov 2018 05:08:15 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=aZWL8FW4; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732485AbeKNXKp (ORCPT + 99 others); Wed, 14 Nov 2018 18:10:45 -0500 Received: from mail-wr1-f67.google.com ([209.85.221.67]:35294 "EHLO mail-wr1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728133AbeKNXKo (ORCPT ); Wed, 14 Nov 2018 18:10:44 -0500 Received: by mail-wr1-f67.google.com with SMTP id 96so318902wrb.2; Wed, 14 Nov 2018 05:07:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=jY/UFCz8PIRjByHlsuj/mXPL0j5ejHSHK+uh3DIbbNM=; b=aZWL8FW4yXYu8oqV/AM4BhNybsj8Ivji6xTdEPM9it7a6N9hR5//9iyMS64zuedKjg zPJy515qFP9xG/7sHm365y9V00bF7ut/xjIUTOYPvTSxZVKLNZL8GSOPIwDtzi/VXRMn UBtwxVQ/Dx45FmQjg5nIEkjWk4v72SfHBpdsCO4ii7JgNmZeBpLj6mbV7CNfRyZPyfKE MMWIwm2GOx/lqj8d7mE+Dx6JW4Rcl54qezuqBg86y8oC5UncB83JgH1Jkh710Rp+EZ/d Rrmc7jwzKiW/VNzxkdLZHJWRN2o/tbyV5iyaIFYsHfqo3MhVp8vQnkgZHGBIFP4zel+4 csAg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=jY/UFCz8PIRjByHlsuj/mXPL0j5ejHSHK+uh3DIbbNM=; b=NF5KwlxCyucKnSocAa6WMDeuZ3tlBaWJCsHC7J4MERTXand4hUoKuZfAM0wFZ0VsyG loyZdxX/5ypam0TPND4I6Xw4UfDYDEHJanaMZWIFedihRb40Zv4qDqVnEOV/yWe221X+ oCuhYLC2WPXZV70jDpVpZriF6kM+DMHhXE9DuOtZa+FLUqZhu9I5qazztWOQ4nKKfcAe 1Ae5EizFtGredmyBwCizfS24/D1ifWuyAO2vKhV5nWAK48DY9PVScB2eywhbhQZIfOEX p8Nm2mJuImrp4lOAS4ZyzFx7iyKxi1UxagjIeqj4Elp/8V7iMS/IdhTjuSi7/7/mXL5F R9kw== X-Gm-Message-State: AGRZ1gKW2rM6qd8PVNau4OPbN4yqePoKLmJ1eOJUNEz3ZyRcQjU/3VOa MVjMgLdgPgIVs3mRceJI5R5l1Kts X-Received: by 2002:adf:9170:: with SMTP id j103-v6mr1877263wrj.217.1542200851052; Wed, 14 Nov 2018 05:07:31 -0800 (PST) Received: from david-x1.fritz.box (p200300C2A7086500829F3F8E4928CB10.dip0.t-ipconnect.de. [2003:c2:a708:6500:829f:3f8e:4928:cb10]) by smtp.gmail.com with ESMTPSA id r19-v6sm14154473wmh.0.2018.11.14.05.07.30 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 14 Nov 2018 05:07:30 -0800 (PST) From: David Herrmann To: linux-input@vger.kernel.org Cc: linux-kernel@vger.kernel.org, jikos@kernel.org, benjamin.tissoires@redhat.com, David Herrmann Subject: [PATCH] HID: uhid: prevent splice(2) Date: Wed, 14 Nov 2018 14:07:12 +0100 Message-Id: <20181114130712.21028-1-dh.herrmann@gmail.com> X-Mailer: git-send-email 2.19.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The kernel has a default implementation of splice(2) for writing from a pipe into an arbitrary file. This behavior can be overriden by providing an f_op.splice_write() callback. Unfortunately, the default implementation of splice_write() takes page by page from the source pipe, calls kmap() and passes the mapped page as kernel-address to f_op.write(). Thus, it uses standard write(2) to implement splice(2). However, since the page is kernel-mapped, they have to `set_fs(get_ds())`. This is mostly fine, but UHID takes command-streams through write(2), and thus it might interpret the data taken as pointers. If called with KERNEL_DS, you can trick UHID to allow kernel-space pointers as well. As a simple fix, prevent splice(2) on UHID. It is unsecure, but it is also non-functional. We need a linear mapping of the input in UHID, so chunked input from splice(2) makes no sense, anyway. Reported-by: syzbot+72473edc9bf4eb1c6556@syzkaller.appspotmail.com Signed-off-by: David Herrmann --- drivers/hid/uhid.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/drivers/hid/uhid.c b/drivers/hid/uhid.c index 3c5507313606..fefedc0b4dc6 100644 --- a/drivers/hid/uhid.c +++ b/drivers/hid/uhid.c @@ -753,6 +753,15 @@ static ssize_t uhid_char_write(struct file *file, const char __user *buffer, return ret ? ret : count; } +static ssize_t uhid_char_splice_write(struct pipe_inode_info *pipe, + struct file *out, + loff_t *ppos, + size_t len, + unsigned int flags) +{ + return -EOPNOTSUPP; +} + static __poll_t uhid_char_poll(struct file *file, poll_table *wait) { struct uhid_device *uhid = file->private_data; @@ -771,6 +780,7 @@ static const struct file_operations uhid_fops = { .release = uhid_char_release, .read = uhid_char_read, .write = uhid_char_write, + .splice_write = uhid_char_splice_write, .poll = uhid_char_poll, .llseek = no_llseek, }; -- 2.19.1