Received: by 2002:a05:6a10:6d10:0:0:0:0 with SMTP id gq16csp308005pxb; Fri, 22 Apr 2022 00:58:43 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx6CosCGFHHjdoBb2FqYYC+rWHsV3rL3V6aF91Jtm4xhz1rM++nKvNcicF9Tc4rKX80Jlw4 X-Received: by 2002:a17:907:7ea6:b0:6ef:f384:15b4 with SMTP id qb38-20020a1709077ea600b006eff38415b4mr3101941ejc.91.1650614323525; Fri, 22 Apr 2022 00:58:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1650614323; cv=none; d=google.com; s=arc-20160816; b=Tg2rDsONNFj02Z/++eDQOwnA2CHW13uO4EIlXkvlC8j/GeDjDjJZUAKWzm21vBlU6h RU2OwudRAXULnB1DZmZ3NdQpBRBh2QySDgMzj7uxSVPv5KAb+k/iAtUeuHWHtePGlM73 zZwsb1ZIr7ptpOYoi+cK8KunGQaU9wlQ++wWmZnqJxncCR1V85SzMlM1W8pTNqnHBX+1 Mk1+Zs017jsgRcG7u+9tYz8MC8x/C7ghkZPpFQEnwoIsVMNutH+kgtYvytwwtDu4E5E7 xnuwRJzEsPgbbnRFSPENh1N1uVK+e7CA2vAaOPphmExrYSdkQLfgxOzMnxLwUmbXmDS/ ME/w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=mZ4DQrUT0teh2OCHLccoXzTPXFLo3iiH/Aggk2F56Hg=; b=iN7S+uI+BAtL3KP5554qFY+S4U8KPxAd6iYFge7gcxQjbdiNE00uCXlp1W1NftblTR F+G9DbArU5kuZjUR9Bmf82S1eJcfUc4aGZ6KAgR3csJubtV+WZIYKGtroLqLqLsjghdc PeJStUnDbthtXeE9f9PTJCuPOHGzw+HMJcZYl153qt8mokezRxO7dAXd2URQFZB56FDc 2CXIHg3qrR5f8kOS1D3t+b+LXyh4IOhT+KJreymtwjVX7BDu+ybtLIvYtbQloniaLpE/ fOzdzYUFA7VDG4VuWZZSdXjtvyrzirflCWzezl2fop5XFjan96RjdCq675t0OnE1rnr4 4ENg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=B42U8RHK; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id l23-20020a17090615d700b006e87b73b8ffsi5986392ejd.131.2022.04.22.00.58.19; Fri, 22 Apr 2022 00:58:43 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=B42U8RHK; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1383398AbiDUAPa (ORCPT + 99 others); Wed, 20 Apr 2022 20:15:30 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50054 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1383390AbiDUAPZ (ORCPT ); Wed, 20 Apr 2022 20:15:25 -0400 Received: from mail-pl1-x631.google.com (mail-pl1-x631.google.com [IPv6:2607:f8b0:4864:20::631]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E9E421A078 for ; Wed, 20 Apr 2022 17:12:36 -0700 (PDT) Received: by mail-pl1-x631.google.com with SMTP id s17so3263373plg.9 for ; Wed, 20 Apr 2022 17:12:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=mZ4DQrUT0teh2OCHLccoXzTPXFLo3iiH/Aggk2F56Hg=; b=B42U8RHKbCW+dc4LpDeKZT8c8MND7ONSahnG4v/GlOuP3U9dbEKh6rL6z4rMDfWacR YDSvoZ8pHgISE2TrrAS0iZkbiuBCYeG6TUa0duCosI4AOZXN9FXOcxdZcOrYeuv6zGtK rkMFXd1fPr3ugLhaBEgvReSoHR2nmD2ADfyGo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=mZ4DQrUT0teh2OCHLccoXzTPXFLo3iiH/Aggk2F56Hg=; b=g1XzQMT36Hh9Wc88K2Y8J9KLXgCxDXh+IqW7dMuFhVgOQjNyub6AnZ9TXuH5CGcT42 zwCJoQA0dk14yiPu4nhJ+KknXphhmgwDQ54pmEAyHrcXPK+85+sMw/WGBi3uQEc10uRi EDOdEpwGCn69qRjFHBEsDCOY0azX+f+iCGY6GGQ7QuCZkHqDP8fzJ63UsDuJvIrmwY/3 6q3DPR2PbxGQuKOZFuZJhbivwdrUBBfHSQoDNjf1C0mVYha5zKq4oEzhXl/MgEij78bS gpfo9UPFHAJ+Ucy/Y1lOuNGjFCM8AQTlJgRDg9B6Xg2aYr5Oh0F4tfqTwXiE/zgQkLwj sCgQ== X-Gm-Message-State: AOAM531sO1Gia/zEqRpeRW1omNJjqwscspp0SOEQhcf4m/uDujisCOAD 4CH6wY6giQbQVWK/7JKbjvdTRw== X-Received: by 2002:a17:902:cecb:b0:158:9a0b:c839 with SMTP id d11-20020a170902cecb00b001589a0bc839mr22007105plg.58.1650499956459; Wed, 20 Apr 2022 17:12:36 -0700 (PDT) Received: from www.outflux.net (smtp.outflux.net. [198.145.64.163]) by smtp.gmail.com with ESMTPSA id c15-20020a63350f000000b003992202f95fsm21198168pga.38.2022.04.20.17.12.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 Apr 2022 17:12:36 -0700 (PDT) From: Kees Cook To: Johan Hovold Cc: Kees Cook , kernel test robot , Greg Kroah-Hartman , linux-usb@vger.kernel.org, stable@vger.kernel.org, linux-kernel@vger.kernel.org, linux-hardening@vger.kernel.org Subject: [PATCH v2] USB: serial: Fix heap overflow in WHITEHEAT_GET_DTR_RTS Date: Wed, 20 Apr 2022 17:12:34 -0700 Message-Id: <20220421001234.2421107-1-keescook@chromium.org> X-Mailer: git-send-email 2.32.0 MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=3048; h=from:subject; bh=27sA78q0oVmYGS0XfXLNtfdHOOZSlXQQsmiidfepGiM=; b=owEBbQKS/ZANAwAKAYly9N/cbcAmAcsmYgBiYKFxlmtHj212PdV32XRZoSS1OuohiF8aXa+eAnEi uF3EZFKJAjMEAAEKAB0WIQSlw/aPIp3WD3I+bhOJcvTf3G3AJgUCYmChcQAKCRCJcvTf3G3AJt1SD/ wIA5Ub4jPeBldsKvd0TU9ZGzRKJ2m3utc987tW5kJirN4PIYWyvyvoEbO6rSSEzZ8hpIH7ypA2dtSE yeTdYwaBQR3Q6HxrVBDC7TU15XzdQludQ6ar8yL5JoH8yn6omH7AxRe1OOhh5YLo8lqFDsXzQhI5Xn 35MZsHPZs21sP7lR4XU17SK7K6VRWOb6oR6fkmW1xB/0mG87IiimtO0LMSLo4FRSgw6kKOQZyhdQwJ lQQH5dFl6DqEGx0Ublm44BRZ6PUd+bUuGa3fbAKVK4ZkCQ6EEnqxLiBuyhmf/DcUTPAzJSO0b7xi0E DzrzAKxacn9Go1NfeAwHHPYNB2PY2kqcGqqXOsUQdD1cj5ugYICOwsAjEtga2CGJnlCIbxcT2UYD6E YB4dweO4RUSNphc/Pih/xZwmMignRP2S7P+/C0tyfrfEY/5krd/yktNv6kYacwphMJu6XaFHG8j0yq 1dJ+u6X7tFxzf/gDSvbzNyDDsQOd/++G0XqHVD7QD9y7lF+Pq7Hibhw/2WsKGrYRgT3n+juSH/59rw B174TvjeYgAgfMLO6qphWf2S3K24S6h4EJUd9su3a77JTZYA/eOYRxdCKydzddWseKoHqrkGk6thGF nstFY+p0WOtloFx8MNBIoCWBrtRPT0qEeCWwOWPzYjvf1HLqYqPRYvCwa3Bg== X-Developer-Key: i=keescook@chromium.org; a=openpgp; fpr=A5C3F68F229DD60F723E6E138972F4DFDC6DC026 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The sizeof(struct whitehat_dr_info) can be 4 bytes under CONFIG_AEABI=n due to "-mabi=apcs-gnu", even though it has a single u8: whiteheat_private { __u8 mcr; /* 0 1 */ /* size: 4, cachelines: 1, members: 1 */ /* padding: 3 */ /* last cacheline: 4 bytes */ }; The result is technically harmless, as both the source and the destinations are currently the same allocation size (4 bytes) and don't use their padding, but if anything were to ever be added after the "mcr" member in "struct whiteheat_private", it would be overwritten. The structs both have a single u8 "mcr" member, but are 4 bytes in padded size. The memcpy() destination was explicitly targeting the u8 member (size 1) with the length of the whole structure (size 4), triggering the memcpy buffer overflow warning: In file included from include/linux/string.h:253, from include/linux/bitmap.h:11, from include/linux/cpumask.h:12, from include/linux/smp.h:13, from include/linux/lockdep.h:14, from include/linux/spinlock.h:62, from include/linux/mmzone.h:8, from include/linux/gfp.h:6, from include/linux/slab.h:15, from drivers/usb/serial/whiteheat.c:17: In function 'fortify_memcpy_chk', inlined from 'firm_send_command' at drivers/usb/serial/whiteheat.c:587:4: include/linux/fortify-string.h:328:25: warning: call to '__write_overflow_field' declared with attribute warning: detected write beyond size of field (1st parameter); maybe use struct_group()? [-Wattribute-warning] 328 | __write_overflow_field(p_size_field, size); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Instead, just assign the one byte directly. Reported-by: kernel test robot Link: https://lore.kernel.org/lkml/202204142318.vDqjjSFn-lkp@intel.com Cc: Johan Hovold Cc: Greg Kroah-Hartman Cc: linux-usb@vger.kernel.org Cc: stable@vger.kernel.org Signed-off-by: Kees Cook --- v1: https://lore.kernel.org/lkml/20220419041742.4117026-1-keescook@chromium.org/ v2: - just assign the single byte --- drivers/usb/serial/whiteheat.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/drivers/usb/serial/whiteheat.c b/drivers/usb/serial/whiteheat.c index da65d14c9ed5..06aad0d727dd 100644 --- a/drivers/usb/serial/whiteheat.c +++ b/drivers/usb/serial/whiteheat.c @@ -584,9 +584,8 @@ static int firm_send_command(struct usb_serial_port *port, __u8 command, switch (command) { case WHITEHEAT_GET_DTR_RTS: info = usb_get_serial_port_data(port); - memcpy(&info->mcr, command_info->result_buffer, - sizeof(struct whiteheat_dr_info)); - break; + info->mcr = command_info->result_buffer[0]; + break; } } exit: -- 2.32.0