Received: by 2002:a25:e7d8:0:0:0:0:0 with SMTP id e207csp1178701ybh; Tue, 10 Mar 2020 16:36:21 -0700 (PDT) X-Google-Smtp-Source: ADFU+vsHSsZkGxUpqsqAAd6xwZiTB/OiQgGkPMQE0X8t+uknhBQOgtPTdqgWTAe2J1SHnTUqSe5y X-Received: by 2002:a05:6830:20c9:: with SMTP id z9mr197629otq.44.1583883381118; Tue, 10 Mar 2020 16:36:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1583883381; cv=none; d=google.com; s=arc-20160816; b=lSmex5XIsCZjpGU3zMS7f4KuyX1R6sng+/lLHrbJsP3a1AXUxO7/o5lFjc0SCE1owe udkfI6wGleAA7orND3g4X0Yg5NO2FLt4OylZLjn5DjC0/y8XBqulFR/xZVM3Gt2BgjoY IvLktZzcQL0mzY9U0IFi8Uvw7WahtkESHcaRcKF40jpRxshQrEe8/aHOOZ8/FOuC+zq5 RKGosFhKiZF0AFGQwk47HqOOG9gSK92WzoDBvX8U9UNSPuIy0hW0TzOxVhlAE0xzo7ZY YY7Fvbha5wPG3ODq1/5XnrUjySRzJ66u/Mg2aZ9H6TAQzewepKJqe6BQeScQBixxOp46 TX9A== 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:cc:to:subject :message-id:date:from:in-reply-to:references:mime-version :dkim-signature; bh=LsgpEUiUKyrURcXLrkUcl42gnwA2NgJmCnyAYXeLFu0=; b=GXj737Y2Tjj319DcJ2raYB4Q4vrC6ggyUkqmr6EJiSbrU6D8QQB0rxoo+9WpPY+/Uz rvuXREBvC38Ck2ipmZBKQcAiIMyLIegMJrRUHnzoLnZewhUxVHb9cdzg5PFqLNnaEnhz HAYMZZJsVycz9CxBx9eouvZk/NkXE3meNQd2jhBoim84ekegCpr3looHNhy4pQYfXH6U RqMszteYJzeA2vmi95m7uwD4RIO4ccXWJyVjSGfbpC6rn2V/XtGtC2VQtNeGDsC8aT7X eaGGNXWvPYzlUXesd4YwQDZkIsZferHt/GlZLmTB69WbS0sjQi97njbfPF2lw93/TGdH MOow== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=QVR3deuJ; spf=pass (google.com: best guess record for domain of linux-bluetooth-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id v15si99110oth.307.2020.03.10.16.35.57; Tue, 10 Mar 2020 16:36:21 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-bluetooth-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=@google.com header.s=20161025 header.b=QVR3deuJ; spf=pass (google.com: best guess record for domain of linux-bluetooth-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726463AbgCJXfu (ORCPT + 99 others); Tue, 10 Mar 2020 19:35:50 -0400 Received: from mail-lj1-f194.google.com ([209.85.208.194]:33789 "EHLO mail-lj1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726380AbgCJXfu (ORCPT ); Tue, 10 Mar 2020 19:35:50 -0400 Received: by mail-lj1-f194.google.com with SMTP id f13so257941ljp.0 for ; Tue, 10 Mar 2020 16:35:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=LsgpEUiUKyrURcXLrkUcl42gnwA2NgJmCnyAYXeLFu0=; b=QVR3deuJIjLRnTYG1mHTw1GPQUhkTmo07MXqIrkyGLLHOtFQMkjD4iKR5KgL0c6yQ0 7e7sGQ+ClJvbbYCK+jFMG0Jrev94G10F/Y0d0cvnInypBtasehEThAK8zsuImNAQHMS/ Liisd+FauYWfDAyZfw/Cm579N2OvCWrxbrZL5SyBKVVakBlH9lIU84NXz5jZtMYk3NvS WZD/Z1MppuTsjC+2QBmjQQlV6TawJbKjGcz/4GnNNIsSF9+6t9F4Td3vOUhznVDnv0A1 KQ9JA/cNzgYsBiteIbVTk1iU9nnaSjlyhvEkedzSwBCs8ljp1VZSa97Mc52VA5p8VxJW VfCw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=LsgpEUiUKyrURcXLrkUcl42gnwA2NgJmCnyAYXeLFu0=; b=WDmqKcq0KdsH+2B9/UuaGDCQ/iHB60K+kAiR3BMgivIUyrhLJDcNpCfJ821XiCxLXG 6AzzJwSxDsGeYFFt3mvA1fU98dMc36tJOZT7SOZG/8AgkNkfCIsgkL9GbXenWOWR4qrW 38gnPdcXYKPLzN5OHGQUMNJTjwP97tJWgPPT8KIEd3qxaDK2Dv4fc+WpxddqIJrv/MDV v5Sc9mqO97MLlkVFtrgGVmzdXjx2uSADnRN2bU2Zfx2tJbCCSAQprClNNB6yPVJRttZo fPJ7pnHlws5/g7ZYNCtNhUla9BtpYgRj7oqqG5m8DHvZVEFvH38eKDwxZCF71L2Uxi7P P5ag== X-Gm-Message-State: ANhLgQ1WxAf24UPOjpaAA5yTf7Cg1tsFE0IMY8aa8TscMTvPSnuov+JB 5nrVlPvcbjVZdI0XWmwWEmSg0tXR4upxU74opfKo6hvN X-Received: by 2002:a2e:8893:: with SMTP id k19mr331710lji.55.1583883346436; Tue, 10 Mar 2020 16:35:46 -0700 (PDT) MIME-Version: 1.0 References: <20200310173649.32722-1-luiz.dentz@gmail.com> In-Reply-To: From: Alain Michaud Date: Tue, 10 Mar 2020 19:35:34 -0400 Message-ID: Subject: Re: [PATCH BlueZ] input: hog: Attempt to set security level if not bonded To: Luiz Augusto von Dentz Cc: BlueZ Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Sender: linux-bluetooth-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org Hi Luiz, On Tue, Mar 10, 2020 at 6:29 PM Luiz Augusto von Dentz wrote: > > Hi Alain, > > On Tue, Mar 10, 2020 at 2:07 PM Alain Michaud w= rote: > > > > Hi Luiz > > > > On Tue, Mar 10, 2020 at 4:39 PM Luiz Augusto von Dentz wrote: > >> > >> Hi Alain, > >> > >> On Tue, Mar 10, 2020 at 11:53 AM Alain Michaud wrote: > >> > > >> > Hi Luiz, > >> > > >> > On Tue, Mar 10, 2020 at 2:46 PM Luiz Augusto von Dentz > >> > wrote: > >> > > > >> > > Hi Alain, > >> > > > >> > > On Tue, Mar 10, 2020 at 11:37 AM Alain Michaud wrote: > >> > > > > >> > > > Hi Luiz, > >> > > > > >> > > > On Tue, Mar 10, 2020 at 2:27 PM Luiz Augusto von Dentz > >> > > > wrote: > >> > > > > > >> > > > > Hi Alain, > >> > > > > > >> > > > > On Tue, Mar 10, 2020 at 11:04 AM Alain Michaud wrote: > >> > > > > > > >> > > > > > Hi Luiz, > >> > > > > > > >> > > > > > On Tue, Mar 10, 2020 at 1:36 PM Luiz Augusto von Dentz > >> > > > > > wrote: > >> > > > > > > > >> > > > > > > From: Luiz Augusto von Dentz > >> > > > > > > > >> > > > > > > This attempts to set the security if the device is not bon= ded, the > >> > > > > > > kernel will block any communication on the ATT socket whil= e bumping > >> > > > > > > the security and if that fails the device will be disconne= cted which > >> > > > > > > is better than having the device dangling around without b= eing able to > >> > > > > > > communicate with it until it is properly bonded. > >> > > > > > > --- > >> > > > > > > profiles/input/hog.c | 13 +++++++++++-- > >> > > > > > > 1 file changed, 11 insertions(+), 2 deletions(-) > >> > > > > > > > >> > > > > > > diff --git a/profiles/input/hog.c b/profiles/input/hog.c > >> > > > > > > index dfac68921..f0226ebbd 100644 > >> > > > > > > --- a/profiles/input/hog.c > >> > > > > > > +++ b/profiles/input/hog.c > >> > > > > > > @@ -49,6 +49,8 @@ > >> > > > > > > #include "src/shared/util.h" > >> > > > > > > #include "src/shared/uhid.h" > >> > > > > > > #include "src/shared/queue.h" > >> > > > > > > +#include "src/shared/att.h" > >> > > > > > > +#include "src/shared/gatt-client.h" > >> > > > > > > #include "src/plugin.h" > >> > > > > > > > >> > > > > > > #include "suspend.h" > >> > > > > > > @@ -187,8 +189,15 @@ static int hog_accept(struct btd_serv= ice *service) > >> > > > > > > } > >> > > > > > > > >> > > > > > > /* HOGP 1.0 Section 6.1 requires bonding */ > >> > > > > > > - if (!device_is_bonded(device, btd_device_get_bdadd= r_type(device))) > >> > > > > > > - return -ECONNREFUSED; > >> > > > > > > + if (!device_is_bonded(device, btd_device_get_bdadd= r_type(device))) { > >> > > > > > > + struct bt_gatt_client *client; > >> > > > > > > + > >> > > > > > > + client =3D btd_device_get_gatt_client(devi= ce); > >> > > > > > > + if (!bt_gatt_client_set_security(client, > >> > > > > > > + BT_ATT_SEC= URITY_MEDIUM)) { > >> > > > > > > + return -ECONNREFUSED; > >> > > > > > > + } > >> > > > > > > + } > >> > > > > > I wonder if this is really necessary. For example, this may= cause a > >> > > > > > device the user has not deliberately bonded to suddenly expo= se a HOG > >> > > > > > Service which will trigger the user to pair (most users are = known to > >> > > > > > blindly accept the pairing). I believe the previous posture= is more > >> > > > > > secure by having the user deliberately pair HID devices as o= pposed to > >> > > > > > on demand. > >> > > > > > >> > > > > There are dedicated APIs to connect specific profiles, so if > >> > > > > hog_accept is reached it means the user/application does want = to > >> > > > > connect HoG and in that case it should trigger bonding, so thi= s only > >> > > > > automate the process, like Ive commented for legacy HID we alr= eady > >> > > > > attempt to bump the security in a similar way. Having the user > >> > > > > deliberately pair may cause breakage since in most cases the G= ATT > >> > > > > services do that on demand, in fact HoG is possibly the only e= xception > >> > > > > to that since it appear to mandate encryption at connection le= vel > >> > > > > rather than on attribute level, so if the user had a periphera= l that > >> > > > > used to not require bonding it will suddenly stop working but = if we do > >> > > > > have this change it would possible still work after the pairin= g > >> > > > > procedure is complete. > >> > > > The outgoing contract where the user somehow asked for the profi= le to > >> > > > be connected and would result in pairing, I'm ok with. However,= this > >> > > > being in the accept path, it doesn't seem to always be client si= de > >> > > > initiated, so that still seems like a concern to me. > >> > > > >> > > Since this is a profile so we are always acting as GATT client her= e, > >> > > so it is either initiated by the client when setting up a new > >> > > peripheral or it has been previously setup with Add Device and is > >> > > marked to auto connect, the later is exactly the problem I describ= ed > >> > > that there could be existing peripheral not requiring bonding that > >> > > suddenly stop working. > >> > My understanding is that the HOG service can get added to any other > >> > device through a service change notification or other means, so I > >> > don't think it is a safe assumption that this code will only execute > >> > if a user explicitly requested it. > >> > >> I would assume the users would expect that this would trigger pairing > >> procedure since silently ignoring the change would make this go > >> completely unnoticed. > > > > In this case it may be a device impersonating a device you were just co= mmunicating with without bonding, manages to connect and expose an HOG Serv= ice and all of the suddent requests a pairing confirmation. Data suggests = users pay little attention to these sorts of notification and tend to blind= ly accept them leading them to a compromised state. HOGP is unique in the = sense that the consequences are higher since it can lead to executing code = in the user's context by injecting keystrokes. > > Sure but this is true regardless of doing pairing automatically or > requiring the user to pair it manually, or you are suggesting this is > safer because it would have the go over the setting to start the > pairing? Im afraid not all user interface would react the same in this > regard, or at all,also at this state even if the user pair the device > it would have to reconnect before it start working again since the > driver would not be probed again. The difference is in the context. In one case, the user is deliberately trying to add a device and is cognitively within the right context to be able to make a deliberate choice to choose a device from the list and pair against it. In the other, they are receiving an unsolicited request to pair which they may or may not understand sufficiently to make the right choice. I agree, not all user interfaces (or frankly platforms) have the same requirements. > > >> > >> > >> > You are correct that the change may cause a device to stop working i= f > >> > it was using HOGP without bonding, but this would also be a non > >> > compliant device and one that compromises the system's security. I'= m > >> > ok if we make this a configuration in case you believe the > >> > compatibility with these sorts of scenarios must be maintained. > >> > >> This gets a bit tricky since the HOGP mandates security but HIDS does = not: > >> > >> Security Permissions of =E2=80=9CNone=E2=80=9D means that this service= does not impose > >> any requirements. > >> > >> So my understanding is that a peripheral implementing HIDS does _not_ > >> require bonding and to make matters more confusing none of the > >> attributes requires security etiher which is perhaps the very reason > >> HOGP mandates bonding, also afaik peripherals are not mandate to > >> initiate pairing procedures so it looks like peripherals can in fact > >> not require bonding and still be compliant. > > > > > > The peripheral yes, but HOGP would not so I'd assert if the device is r= equired to work without bonding, it likely didn't pass the profile qualific= ation. > > It would have pass it alright, its the PTS side that would exercise > this requirement of HOGP not the peripheral, the peripheral just have > to respond to the pairing procedure but it may never inititate it by > itself. Like I said none of HIDS attributes require any security and > the TS don't seem to even test authentication errors as it only > mentions something like: > > If the IUT requires a bonding procedure then perform a bonding procedure. > > Take for example zephyr hids example: > > https://github.com/zephyrproject-rtos/zephyr/blob/master/samples/bluetoot= h/peripheral_hids/src/hog.c > > It never checks for bonding nor it requires any security, so if I attempt= : > > #bluetoothctl> connect > > HoG no longer connects. > > > As stated before, it seems acceptable to me if BlueZ would want a more= compatible posture here, I would however like to request that a configurat= ion be available so that HOGP can simply reject as the original patch did. > > Well in that case we would have to implement reprobing logic so that > if the device gets paired hog_accept should be called once again, imo > triggering bonding seems a better alternative in the sort term until > we verify all use cases are attended. I don't think re_probing is necessary in this case since we wouldn't expect it to be "upgraded" to a bonded state. For the golden path we would expect to start bonded. Again, I respect the different requirements where some platforms may want to allow this upgrading, what I'm articulating is that some platforms may also want to take a more secure posture and not allow this upgrade to take place automatically and instead require that the user deliberately initiate pairing with HID devices. The later, more secure posture, would be my preference for chromium platforms hence the request to make this conditional to a configuration that can be applied on some platforms. > > >> > >> > >> > > > >> > > > > > >> > > > > > > >> > > > > > > > >> > > > > > > /* TODO: Replace GAttrib with bt_gatt_client */ > >> > > > > > > bt_hog_attach(dev->hog, attrib); > >> > > > > > > -- > >> > > > > > > 2.21.1 > >> > > > > > > > >> > > > > > >> > > > > > >> > > > > > >> > > > > -- > >> > > > > Luiz Augusto von Dentz > >> > > > >> > > > >> > > > >> > > -- > >> > > Luiz Augusto von Dentz > >> > >> > >> > >> -- > >> Luiz Augusto von Dentz > > > > -- > Luiz Augusto von Dentz