Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753066AbdLKQku (ORCPT ); Mon, 11 Dec 2017 11:40:50 -0500 Received: from mail-he1eur01on0091.outbound.protection.outlook.com ([104.47.0.91]:20554 "EHLO EUR01-HE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752803AbdLKQko (ORCPT ); Mon, 11 Dec 2017 11:40:44 -0500 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=aryabinin@virtuozzo.com; Subject: Re: [PATCH] lib/string: avoid reading beyond src buffer in strscpy To: Kees Cook , Dmitry Vyukov Cc: Eryu Guan , LKML , Andrew Morton , Chris Metcalf , Alexander Potapenko , Linus Torvalds References: <20171207113324.24388-1-eguan@redhat.com> <9f0a9cf6-51f7-cd1f-5dc6-6d510a7b8ec4@virtuozzo.com> From: Andrey Ryabinin Message-ID: <46584b52-f2f2-a602-1ae6-cfa0e321324a@virtuozzo.com> Date: Mon, 11 Dec 2017 19:44:16 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.5.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: VI1PR08CA0239.eurprd08.prod.outlook.com (2603:10a6:802:15::48) To AM4PR08MB2819.eurprd08.prod.outlook.com (2603:10a6:205:d::25) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 4576ff65-87c8-4580-c0cf-08d540b5ea4a X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(5600026)(4604075)(4534020)(4602075)(7168020)(4627115)(201703031133081)(201702281549075)(2017052603307);SRVR:AM4PR08MB2819; X-Microsoft-Exchange-Diagnostics: 1;AM4PR08MB2819;3:6YBlsIIoypTfiIpjH5cGyjbMUGDtbtgExlCHiUbecAAlq4uoIV65cvuKcR48ODPSFIGaWoiumdUtbH++1Wg7D/TNz1L+27/VwLYdfEpX4/PY4gYB7SU7ngL4mscbEyh1MaLcHb2p94PHtOlFt3eOYaX+0guHSCT99UMQcRHPGdBFO5Jhs3FA4H/IdEvbTq9yfa0IGstPkY1awNeZqg7loo0MuFdfy9HgSF+VeY1/pH2EUQtOPH2udXhZaEMOr4Z6;25:MrRtAadLwI+LjFYNxICDmgSu4zNoWNZggIEH0Tfr+b3befvQ5K9+At2PtWXyRLny+IuNmZXvgyfpLS42QuMPCudri1Qa8jcV+zKT79IFeauswlt2s0CUjmWYy9r4ejT9vC+r/JKg8pY0KjI7zItsDEpP6tCJTwj74uvOIdI6djpKOtOHxApmy3bUCzzgJCPeUqnUAP1kQ24zHNUkyirWqYONJaLPtYZJA/RfmSpsg8UqZyaq6rAXj8FN3Dyv18oalif73NsfxcGHTLzX45TQ6rgJ3++ibr4sDe9OBUPiP/Chsfk02Ky4g358LUkdM8hH92nAk0I/ckLMm9h9uAiLiA==;31:vXdmXQ8ZjS+UxzMzSMKW8dtT4VafIL9PE4UD1JHa4WftA2NW3uO2Bx9UyiSwDyL4NVoCt8Jcnyo90PyyhqOWjihYWQCe2/BqVE3WwKnJKE2GyHtjEh7VkqW9KCQUMip2odsyvToSmzAfI0RKfHhakRRqvkg5HC8uU6kr4KL63I/hZCU4Zpr3vn0I1G5qpMi/HwtmZOKPhxzOwCEBrP6qZUIsDp+hLr/ZqntbAILcLto= X-MS-TrafficTypeDiagnostic: AM4PR08MB2819: X-Microsoft-Exchange-Diagnostics: 1;AM4PR08MB2819;20:l8BoJScIhcR+q3bUAR0Y1SNQ/Sqfvf2a0nggTgqdLW/NhyG8T3hcbdHfSABqYEl08HyIvmNAhsIcIE//UwYT0ZRwXwLEdIbhExglYfJL7Mn6kcNagicqdVMAUg1bMPPkPq7dlS2sF7uB+JSqFpnAE8T52uD3xgg3ej1H+au6RJcZdaoomEvGaqq7VNOYJHRSjvl2xMG9fJJCHogbxn8sC88yEttIXLrYwKq3yALjJYqYK1hSnZ5jc8+OHXUbfCQ8tzLb0sLrfEDo4wOegMlMJyMsYcnIH297wMo/ZniCDxf5erHH2eRdxKtuCD5M1ofm6y8YrXckHZYt8LxzIqUqOcnzlzJYFfj+vGqfotYf5zo/uv+PFl8aviPfp56UfMKfmaf0vVe/BFr+9BJWhykBCYMUO1q4bnL3efYYMin/nS4=;4:YzUiAKBWP8ZT1z+eATNXQ3Vaar8vMTxH5WdzmdqfmYqW6aSthBV89mG+Wh/rZrVDQdfe2RIc4LCn5ictX48yVpU9IWJ0h5jYvq13t2Ch6L26K8WR4x5jTEtJOOvGQjpp+8cKC9hT091gTmyPd3KeUoj+PtaZn6O2We0ZncbTKIJX4+go7tyvFvGqQDgnU5tJbEAaI26zejHqILGkB4BvdD6tOobbkV9gm4EIA6MtxaZqtXxmYIZpP2r0wQH3M53oFzW71Pr2Aeq8HbKRaX6J2hjGW+osaqouFg2I1m9Y9SXvCeqORJTOFsNLTnHq8NMqyrRuqzRLVDICfyCWK9BT7fjsCTVi7qek62RZvK069Ihnxgq4N52oQ/K1x6WvSxnl X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(211936372134217)(42068640409301)(153496737603132); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040450)(2401047)(8121501046)(5005006)(93006095)(93001095)(3002001)(10201501046)(3231022)(920507027)(6041248)(20161123562025)(20161123564025)(20161123560025)(20161123555025)(20161123558100)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(6072148)(201708071742011);SRVR:AM4PR08MB2819;BCL:0;PCL:0;RULEID:(100000803101)(100110400095);SRVR:AM4PR08MB2819; X-Forefront-PRVS: 0518EEFB48 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(6049001)(346002)(376002)(366004)(24454002)(189003)(199004)(229853002)(966005)(65956001)(16576012)(2950100002)(58126008)(47776003)(6666003)(93886005)(36756003)(64126003)(6246003)(76176011)(8936002)(31686004)(25786009)(4326008)(110136005)(105586002)(106356001)(305945005)(97736004)(7736002)(59450400001)(3846002)(6116002)(54906003)(55236003)(2906002)(53936002)(86362001)(77096006)(16526018)(34040400001)(6306002)(6486002)(66066001)(5660300001)(52116002)(230700001)(68736007)(31696002)(83506002)(52146003)(50466002)(81166006)(478600001)(316002)(23676004)(2486003)(65806001)(81156014)(65826007)(8676002)(53546010)(129583001)(156123004);DIR:OUT;SFP:1102;SCL:1;SRVR:AM4PR08MB2819;H:[172.16.25.12];FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtBTTRQUjA4TUIyODE5OzIzOmM2ckJqdnhaeVZEc1ZsTWtCRERPMmJGYVBM?= =?utf-8?B?Zm8vZzJJdnhyYWppU0hDQmpRVmc2bUxDMG4xanIzd3JMYlRuU1V3cUlJS1Vu?= =?utf-8?B?TWdyeGVkRzMyRU4vMlRBWUI3SXQ5TVQwTzBqZlVFVVoyeFFuN0gvYitDMm8y?= =?utf-8?B?U1h4eHBJS2tZcUx1ZnhsMXVOQ2NzclZWNmNhUG5NVmY5THV1cTFUaUdYSkdC?= =?utf-8?B?NUVsVGUzUE9uQTlMSzZHbDlCaDg3QkMyODhEdk5ibkJ0SDdJa0w4NFVSR1Jy?= =?utf-8?B?bzRETmU5T3hyWmYzTEgvMDVpRWo4QUVidmUvY05WMzR6NmxSSzExRG0xWlMz?= =?utf-8?B?TzRETTJlaUJkNjUvMjlZRFRjZU0vNUFxbjI5bU45engwdnZFUU81SmEvZ2pV?= =?utf-8?B?SUM2NE5xQi8rZU1iUU42c0xMc2xFbnpkMkgvT3BUWVBSeFRDNXVnM29PZm9v?= =?utf-8?B?RjBEN2dNUmkxV1FLaXRZaWlneU0zd3dwblVKb0gzZTliVXpxOXEyODdnSEVx?= =?utf-8?B?ZjNSQVhvMlFKZURSQVV6clVoMHZmSSt1K2xoWS9iWjB5bHBFbmVJUVczblNF?= =?utf-8?B?WS9sQ011ZE5RRVVjVXVDYkUrWXVoNmVwNVBkZmMweVdYZllXSGh3OHRQd0xU?= =?utf-8?B?c1BMOG5zaEFQOUR3THd5NXhhejgvSEI4UHgwNURkTnNsUnkvS3M3eGRJWEV4?= =?utf-8?B?YlJ4K1JTbmk5Nzl1QVpCd0FyR3pjNlVYUVNPZ2JiRldiUWo3M25DS0d2K1I4?= =?utf-8?B?WHlTUFNIRCtVajBuWFRLSUkyM1JRYkJZcnlqVnFIMFp6RnhxMnVkbWV2ZmVx?= =?utf-8?B?dHhsdU1TMCtidTZHclhRakxGTE9paEhaSXUvakxFalFHZnZPOU5sRWpOd3ly?= =?utf-8?B?V0hmU20zNUlQa1JqMGNBc3RrMlcyUHFRRElkdkFWWjhtUWhxSmJxZVRTNEYw?= =?utf-8?B?THBEL1VlWC9VU3JBY21TMk16aXZNL1UyOVR2MTdHdG8yM1JwREpjUGFmem9C?= =?utf-8?B?cTVZRzBkMzZFTkZSbVphOFJmazhPREpDSVJhYlpRc2JuclBxVzF2alVCOVY5?= =?utf-8?B?RGJqenpjRmRxV3RhbWlZSmRqeXhTaEIvVk95eW1QM241OThWc3QzQmtYb214?= =?utf-8?B?VGJkQ1BacW9pMWVsZUxteGpzWHVEeDRZbWV6OVZXUmUzS25MRk9qaW1IQW9B?= =?utf-8?B?THdTYSsySGlsSFVoVSt3WWNGVVVpNC9nbmdEYTFNUUxHbjBpbDhISXplMFlk?= =?utf-8?B?S2IxZWl3cDMwS1ozK2VQTnZvNEl2M1MxcTFvcnJ3dHpoY2R3d0RtQjZCUDhn?= =?utf-8?B?MXBLQ0pxektEamgrQXlUTW5CbGVRT00yYWdBclVUZXhxYk1VU1hzMnlWRlNm?= =?utf-8?B?SUpub1JUZlR6R1NIc1hpY2Y3ZVdQZHRPdW44UnpGd040LzJub0N6Z2dwNFZw?= =?utf-8?B?OTVnVmlYdDMreU9uTzBFWGgxS2pHUWdVQ2RSSHVMMzlwTzlRUXZId1ErM3pC?= =?utf-8?B?RTR0V3JTV25xbk5HSmt4SnM5cStpL1pXeTRYSWxRWTNyUFlLM0poNW9XRVZX?= =?utf-8?B?N1F3NzJSUzBxUnNYT2Y5RmQ1SHdlbXhkYXp6Mk4xR0plRzlvK1djL00za20x?= =?utf-8?B?U2dMcVFYbTJTRForcmZibjZEd2lubTRucnVubzdGQnp5dVFTZWovY1RORXor?= =?utf-8?B?MzZrUE5mRFFLcC9CdG9xYTVnYkRHUlpzekZqWDZzVGZaV3JtbjgvWUhJMm1i?= =?utf-8?B?Z1I0b3Y3dVE0bjJwRThSYVdSKzI2V2V1K0pHODZPRlpwSVYwWWpEN3ZNZlhS?= =?utf-8?B?eUpJSDdOUnY3NkJpK21sTWlJL0RsRUJJWElUdWJyRkw2SWJXSUJGakhnUnJ1?= =?utf-8?B?NnM2dnRPQ3FhMjNYSzk5MjNzNjJjTmlBZFNCd09Qc2NsUUR4U1l4WEtyZDFP?= =?utf-8?B?WERsZUZCUWVhL0c2Y09kUWJjMlJrQXdmam11K1ptYStrY25PWGNXOW5vRGhM?= =?utf-8?Q?bfvbuO?= X-Microsoft-Exchange-Diagnostics: 1;AM4PR08MB2819;6:LbyW8/pmKgjqv6criHYGhZsV7sMIOUgHTwT2Q+HN2Bq/1j8e/hQ1mrVAK2J9+kOjKVtv7WtixpXsqUASq1vOBcBhO82X9X8rQPU4WyeEA2Die7iFwgx+vo10/exjOCNmHe5rvd11pbg2CuQU0/n1HU7L696uZIcxlw6r45igedRisaUdf9dURR/1OXCWCk/1reYQs2HlzD4mebMWCotoflJqihYhpDZi8OG8Zr746/GoplW3Zcsn+C9+B75cOlm4vCYHFOHAbfTEJihA8jiPA/dFtswRrtXD8e+IODRdb839i1oN1JG6f8ECw9INbqI5VJ/ztGeOsTY5JQwQ/rXpjS+fn6hhWJLsPJSu+VRA/aM=;5:TPHYoaPnIC49AP1eIJXJJo7u80jf2qvkyKJzq1GHYSKxE2Nbb9CqpPED2iBJ/kuLajlNcLPXuRx5nh3Ij/sDa9VAGozvwipmfNA3c90wa4mqF3DlPhn8ZwSsCQ0FEKZI9qbjzyEP7WGBnEi634bGjdz/p7c3+eLw4iXwlBsR5QQ=;24:2xLDg/c25/PUqyzGnhTpEi1wUwbAL0fnQqXowDJEqLQIqMCehA6Ys3DrRoWVuJBzUNHPcbPu+HAM3kwRU3I0PVUa9/b87Mx/cdBz2OB1yZI=;7:dr8A/ByKLRnxH4XWYvTm19woHwfv6iwtP4DMkJKNTUm4tt9Ro2GxZ+BnECeulLAuti3enF6glXPlWcHa67tseNM6I/DwCqBmYJdz2qEagCtJpDY9YriwXbD0NJIgOtnkDXz96uk09Ku9dbu11osqzLUTBZIcINFq9mh8ZbLK0qkiLkHib/5XLGBjbMVwlBL2MGH2v5v9fRsINiEENchmnUklH7JTri/1vC65Mp0M/z1u5P4yXM9knWJg2DIE2Ujp SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;AM4PR08MB2819;20:ThpGGSlJ5SFg7EebU6FHYX+jAbhVnjfBU6WVrOHHrmugr70pAdXvtSyg/Hunz5hqCZt6Sqbn/AupSXqXshJFQLK+3ZF0xYIlHpE2pDctVhtAY42C32QCwdfnZsekcATD0Y1iv1+/jAuwUqHQ/uPJvtJpoM5pYnerLH/hRSzFpP8= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Dec 2017 16:40:39.8381 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 4576ff65-87c8-4580-c0cf-08d540b5ea4a X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM4PR08MB2819 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2065 Lines: 45 On 12/08/2017 11:54 PM, Kees Cook wrote: > On Fri, Dec 8, 2017 at 7:29 AM, Dmitry Vyukov wrote: >> On Fri, Dec 8, 2017 at 4:29 PM, Andrey Ryabinin wrote: >>> >>> So, possible solutions are: >>> >>> 1) Simply disable word-at-a-time optimization in strscpy(). I seriously doubt >>> that this optimization have noticeable performance impact in real workloads. >>> >>> 2) Apply patch https://lkml.kernel.org/r/20170718171523.32208-1-aryabinin@virtuozzo.com >>> It's a simple, minimally intrusive way to fix the bug. >>> However, the patch changes semantics/implementation of the strscpy() which is bad idea. >>> It basically means that we use one implementation of the strscpy() but test with KASAN another implementation. >>> For that reason patch wasn't liked by Linus. >>> >>> 3) Introduce read_once_partial_check() function and use it in strscpy(). >>> read_once_partial_check() supposed to read one word, but KASAN will check only the first byte of the access. >>> Dmitry didn't like this. I'm also not fan of this solution, because we may not notice some real bugs, e.g.: >>> >>> char dst[8]; >>> char *src; >>> >>> src = kmalloc(5, GFP_KERNEL); >>> memset(src, 0xff, 5); >>> strscpy(dst, src, 8); >>> >>> stscpy() will copy from 6 up to 8 bytes (exact size depends on what is stored in src[5-7]) >>> from non-null terminated src. With read_once_partial_check() used in strscpy() KASAN will >>> not report such bug. >>> >>> >>> So, what it's gonna be? Let's finally decide something and deal with the problem. >>> My vote belongs to 1) or 2). >> >> >> My vote is for 1) if we agree that the optimization is not worth it, >> otherwise for 2). > > Who would be the best person to measure the difference for 1)? > I suppose that depends on which one strscpy() caller you'd want to test. Briefly looking at all current users, it doesn't look like they process huge amounts of data through strscpy(), thus we shouldn't suffer from a slight performance degradation of strscpy().