All of lore.kernel.org
 help / color / mirror / Atom feed
From: Deven Bowers <deven.desai@linux.microsoft.com>
To: Eric Biggers <ebiggers@kernel.org>
Cc: agk@redhat.com, axboe@kernel.dk, snitzer@redhat.com,
	jmorris@namei.org, serge@hallyn.com, zohar@linux.ibm.com,
	viro@zeniv.linux.org.uk, paul@paul-moore.com, eparis@redhat.com,
	jannh@google.com, dm-devel@redhat.com,
	linux-integrity@vger.kernel.org,
	linux-security-module@vger.kernel.org,
	linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org,
	linux-audit@redhat.com, tyhicks@linux.microsoft.com,
	linux-kernel@vger.kernel.org, corbet@lwn.net, sashal@kernel.org,
	jaskarankhurana@linux.microsoft.com, mdsakib@microsoft.com,
	nramas@linux.microsoft.com, pasha.tatashin@soleen.com
Subject: Re: [RFC PATCH v5 06/11] dm-verity: move signature check after tree validation
Date: Tue, 28 Jul 2020 16:55:04 -0700	[thread overview]
Message-ID: <a5534f1c-8979-0cfd-3989-2567f4a29dbc@linux.microsoft.com> (raw)
In-Reply-To: <20200728215041.GF4053562@gmail.com>



On 7/28/2020 2:50 PM, Eric Biggers wrote:
> On Tue, Jul 28, 2020 at 02:36:06PM -0700, Deven Bowers wrote:
>> The CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG introduced by Jaskaran was
>> intended to be used to allow an LSM to enforce verifications for all
>> dm-verity volumes.
>>
>> However, with it's current implementation, this signature verification
>> occurs after the merkel-tree is validated, as a result the signature can
>> pass initial verification by passing a matching root-hash and signature.
>> This results in an unreadable block_device, but that has passed signature
>> validation (and subsequently, would be marked as verified).
>>
>> This change moves the signature verification to after the merkel-tree has
>> finished validation.
>>
>> Signed-off-by: Deven Bowers <deven.desai@linux.microsoft.com>
>> ---
>>   drivers/md/dm-verity-target.c     |  44 ++++------
>>   drivers/md/dm-verity-verify-sig.c | 140 ++++++++++++++++++++++--------
>>   drivers/md/dm-verity-verify-sig.h |  24 +++--
>>   drivers/md/dm-verity.h            |   2 +-
>>   4 files changed, 134 insertions(+), 76 deletions(-)
>>
>> diff --git a/drivers/md/dm-verity-target.c b/drivers/md/dm-verity-target.c
>> index eec9f252e935..fabc173aa7b3 100644
>> --- a/drivers/md/dm-verity-target.c
>> +++ b/drivers/md/dm-verity-target.c
>> @@ -471,9 +471,9 @@ static int verity_verify_io(struct dm_verity_io *io)
>>   	struct bvec_iter start;
>>   	unsigned b;
>>   	struct crypto_wait wait;
>> +	int r;
>>   
>>   	for (b = 0; b < io->n_blocks; b++) {
>> -		int r;
>>   		sector_t cur_block = io->block + b;
>>   		struct ahash_request *req = verity_io_hash_req(v, io);
>>   
>> @@ -530,6 +530,16 @@ static int verity_verify_io(struct dm_verity_io *io)
>>   			return -EIO;
>>   	}
>>   
>> +	/*
>> +	 * At this point, the merkel tree has finished validating.
>> +	 * if signature was specified, validate the signature here.
>> +	 */
>> +	r = verity_verify_root_hash(v);
>> +	if (r < 0) {
>> +		DMERR_LIMIT("signature mismatch");
>> +		return r;
>> +	}
>> +
>>   	return 0;
>>   }
> 
> This doesn't make any sense.
> 
> This just moves the signature verification to some random I/O.
> 
> The whole point of dm-verity is that data is verified on demand.  You can't know
> whether any particular data or hash block is consistent with the root hash or
> not until it is read and verified.
> 
> When the first I/O completes it might have just checked one block of a billion.
> 
> Not to mention that you didn't consider locking at all.
> 
> - Eric
> 

I appear to have dangerously misunderstood how dm-verity works under the
covers. What I thought was happening here was that *this* would be where
the first I/O that completes validation and has been verified - the root
hash signature could then be checked against the root hash, and then
no-op for remaining blocks, provided the signature validates.

The reason why I was proposing moving the signature check, is that I was 
afraid of the block_device being created in dm-verity with a root-hash 
that belongs to a different device + a signature that verifies that
root-hash, would get past verity_ctr, as despite the root hash not
matching the hash tree, the signature and the root hash will be 
verified. At this point, a block_device structure would be resident in
the kernel with the security attributes I propose in the next patch in 
the series. This device would never be read successfully, but the
structure with the attribute would exist.

This felt odd because there would be a structure in the kernel with an
attribute that says it passed a security check, but the block_device is
effectively invalid.

I realize now that that's a pretty ridiculous situation because the 
theoretical attack with access to manipulate the kernel memory in such a 
way to make it viable could just override whatever is needed to make the 
exploit work, and isn't unique to dm-verity.

I'm going to drop this patch in the next iteration of this series.



WARNING: multiple messages have this Message-ID (diff)
From: Deven Bowers <deven.desai@linux.microsoft.com>
To: Eric Biggers <ebiggers@kernel.org>
Cc: snitzer@redhat.com, zohar@linux.ibm.com, dm-devel@redhat.com,
	tyhicks@linux.microsoft.com, agk@redhat.com, sashal@kernel.org,
	mdsakib@microsoft.com, jmorris@namei.org,
	nramas@linux.microsoft.com, serge@hallyn.com,
	pasha.tatashin@soleen.com, jannh@google.com,
	linux-block@vger.kernel.org, viro@zeniv.linux.org.uk,
	axboe@kernel.dk, corbet@lwn.net, linux-kernel@vger.kernel.org,
	linux-security-module@vger.kernel.org, linux-audit@redhat.com,
	linux-fsdevel@vger.kernel.org, linux-integrity@vger.kernel.org,
	jaskarankhurana@linux.microsoft.com
Subject: Re: [RFC PATCH v5 06/11] dm-verity: move signature check after tree validation
Date: Tue, 28 Jul 2020 16:55:04 -0700	[thread overview]
Message-ID: <a5534f1c-8979-0cfd-3989-2567f4a29dbc@linux.microsoft.com> (raw)
In-Reply-To: <20200728215041.GF4053562@gmail.com>



On 7/28/2020 2:50 PM, Eric Biggers wrote:
> On Tue, Jul 28, 2020 at 02:36:06PM -0700, Deven Bowers wrote:
>> The CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG introduced by Jaskaran was
>> intended to be used to allow an LSM to enforce verifications for all
>> dm-verity volumes.
>>
>> However, with it's current implementation, this signature verification
>> occurs after the merkel-tree is validated, as a result the signature can
>> pass initial verification by passing a matching root-hash and signature.
>> This results in an unreadable block_device, but that has passed signature
>> validation (and subsequently, would be marked as verified).
>>
>> This change moves the signature verification to after the merkel-tree has
>> finished validation.
>>
>> Signed-off-by: Deven Bowers <deven.desai@linux.microsoft.com>
>> ---
>>   drivers/md/dm-verity-target.c     |  44 ++++------
>>   drivers/md/dm-verity-verify-sig.c | 140 ++++++++++++++++++++++--------
>>   drivers/md/dm-verity-verify-sig.h |  24 +++--
>>   drivers/md/dm-verity.h            |   2 +-
>>   4 files changed, 134 insertions(+), 76 deletions(-)
>>
>> diff --git a/drivers/md/dm-verity-target.c b/drivers/md/dm-verity-target.c
>> index eec9f252e935..fabc173aa7b3 100644
>> --- a/drivers/md/dm-verity-target.c
>> +++ b/drivers/md/dm-verity-target.c
>> @@ -471,9 +471,9 @@ static int verity_verify_io(struct dm_verity_io *io)
>>   	struct bvec_iter start;
>>   	unsigned b;
>>   	struct crypto_wait wait;
>> +	int r;
>>   
>>   	for (b = 0; b < io->n_blocks; b++) {
>> -		int r;
>>   		sector_t cur_block = io->block + b;
>>   		struct ahash_request *req = verity_io_hash_req(v, io);
>>   
>> @@ -530,6 +530,16 @@ static int verity_verify_io(struct dm_verity_io *io)
>>   			return -EIO;
>>   	}
>>   
>> +	/*
>> +	 * At this point, the merkel tree has finished validating.
>> +	 * if signature was specified, validate the signature here.
>> +	 */
>> +	r = verity_verify_root_hash(v);
>> +	if (r < 0) {
>> +		DMERR_LIMIT("signature mismatch");
>> +		return r;
>> +	}
>> +
>>   	return 0;
>>   }
> 
> This doesn't make any sense.
> 
> This just moves the signature verification to some random I/O.
> 
> The whole point of dm-verity is that data is verified on demand.  You can't know
> whether any particular data or hash block is consistent with the root hash or
> not until it is read and verified.
> 
> When the first I/O completes it might have just checked one block of a billion.
> 
> Not to mention that you didn't consider locking at all.
> 
> - Eric
> 

I appear to have dangerously misunderstood how dm-verity works under the
covers. What I thought was happening here was that *this* would be where
the first I/O that completes validation and has been verified - the root
hash signature could then be checked against the root hash, and then
no-op for remaining blocks, provided the signature validates.

The reason why I was proposing moving the signature check, is that I was 
afraid of the block_device being created in dm-verity with a root-hash 
that belongs to a different device + a signature that verifies that
root-hash, would get past verity_ctr, as despite the root hash not
matching the hash tree, the signature and the root hash will be 
verified. At this point, a block_device structure would be resident in
the kernel with the security attributes I propose in the next patch in 
the series. This device would never be read successfully, but the
structure with the attribute would exist.

This felt odd because there would be a structure in the kernel with an
attribute that says it passed a security check, but the block_device is
effectively invalid.

I realize now that that's a pretty ridiculous situation because the 
theoretical attack with access to manipulate the kernel memory in such a 
way to make it viable could just override whatever is needed to make the 
exploit work, and isn't unique to dm-verity.

I'm going to drop this patch in the next iteration of this series.


--
Linux-audit mailing list
Linux-audit@redhat.com
https://www.redhat.com/mailman/listinfo/linux-audit


  reply	other threads:[~2020-07-28 23:55 UTC|newest]

Thread overview: 147+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-07-28 21:36 [RFC PATCH v5 00/11] Integrity Policy Enforcement LSM (IPE) Deven Bowers
2020-07-28 21:36 ` Deven Bowers
2020-07-28 21:36 ` Deven Bowers
2020-07-28 21:36 ` [RFC PATCH v5 01/11] scripts: add ipe tooling to generate boot policy Deven Bowers
2020-07-28 21:36   ` Deven Bowers
2020-07-28 21:36 ` [RFC PATCH v5 02/11] security: add ipe lsm evaluation loop and audit system Deven Bowers
2020-07-28 21:36   ` Deven Bowers
2020-07-28 21:36 ` [RFC PATCH v5 03/11] security: add ipe lsm policy parser and policy loading Deven Bowers
2020-07-28 21:36   ` Deven Bowers
2020-07-28 21:36   ` Deven Bowers
2020-07-28 21:36 ` [RFC PATCH v5 04/11] ipe: add property for trust of boot volume Deven Bowers
2020-07-28 21:36   ` Deven Bowers
2020-07-28 21:36 ` [RFC PATCH v5 05/11] fs: add security blob and hooks for block_device Deven Bowers
2020-07-28 21:36   ` Deven Bowers
2020-07-28 22:22   ` Casey Schaufler
2020-07-28 22:22     ` Casey Schaufler
2020-07-28 22:40     ` Al Viro
2020-07-28 22:40       ` Al Viro
2020-07-28 23:55       ` Deven Bowers
2020-07-28 23:55         ` Deven Bowers
2020-07-28 21:36 ` [RFC PATCH v5 06/11] dm-verity: move signature check after tree validation Deven Bowers
2020-07-28 21:36   ` Deven Bowers
2020-07-28 21:50   ` Eric Biggers
2020-07-28 21:50     ` Eric Biggers
2020-07-28 23:55     ` Deven Bowers [this message]
2020-07-28 23:55       ` Deven Bowers
2020-07-28 21:36 ` [RFC PATCH v5 07/11] dm-verity: add bdev_setsecurity hook for dm-verity signature Deven Bowers
2020-07-28 21:36   ` Deven Bowers
2020-07-28 21:36 ` [RFC PATCH v5 08/11] ipe: add property for signed dmverity volumes Deven Bowers
2020-07-28 21:36   ` Deven Bowers
2020-07-28 21:36 ` [RFC PATCH v5 09/11] dm-verity: add bdev_setsecurity hook for root-hash Deven Bowers
2020-07-28 21:36   ` Deven Bowers
2020-07-28 21:36 ` [RFC PATCH v5 10/11] documentation: add ipe documentation Deven Bowers
2020-07-28 21:36   ` Deven Bowers
2020-07-28 21:36 ` [RFC PATCH v5 10/12] ipe: add property for dmverity roothash Deven Bowers
2020-07-28 21:36   ` Deven Bowers
2020-07-28 21:36 ` [RFC PATCH v5 11/11] cleanup: uapi/linux/audit.h Deven Bowers
2020-07-28 21:36   ` Deven Bowers
2020-07-28 21:36 ` [RFC PATCH v5 11/12] documentation: add ipe documentation Deven Bowers
2020-07-28 21:36   ` Deven Bowers
2020-07-28 21:36 ` [RFC PATCH v5 12/12] cleanup: uapi/linux/audit.h Deven Bowers
2020-07-28 21:36   ` Deven Bowers
2020-08-02 11:55 ` [RFC PATCH v5 00/11] Integrity Policy Enforcement LSM (IPE) Pavel Machek
2020-08-02 11:55   ` Pavel Machek
2020-08-02 14:03   ` Sasha Levin
2020-08-02 14:03     ` Sasha Levin
2020-08-02 14:31     ` Pavel Machek
2020-08-02 14:31       ` Pavel Machek
2020-08-02 16:43       ` [dm-devel] " James Bottomley
2020-08-02 16:43         ` James Bottomley
2020-08-04 16:07         ` Deven Bowers
2020-08-04 16:07           ` Deven Bowers
2020-08-04 16:07           ` [dm-devel] " Deven Bowers
2020-08-05 15:01           ` James Bottomley
2020-08-05 15:01             ` James Bottomley
2020-08-05 15:01             ` [dm-devel] " James Bottomley
2020-08-05 16:59             ` James Morris
2020-08-05 16:59               ` James Morris
2020-08-05 18:15               ` Mimi Zohar
2020-08-05 18:15                 ` Mimi Zohar
2020-08-05 23:51                 ` James Morris
2020-08-05 23:51                   ` James Morris
2020-08-06 14:33                   ` Mimi Zohar
2020-08-06 14:33                     ` Mimi Zohar
2020-08-06 14:33                     ` Mimi Zohar
2020-08-07 16:41                     ` James Morris
2020-08-07 16:41                       ` James Morris
2020-08-07 17:31                       ` Mimi Zohar
2020-08-07 17:31                         ` Mimi Zohar
2020-08-07 18:40                         ` Mimi Zohar
2020-08-07 18:40                           ` Mimi Zohar
2020-08-10 20:29                           ` James Morris
2020-08-10 20:29                             ` James Morris
2020-08-08 17:47                 ` Chuck Lever
2020-08-08 17:47                   ` Chuck Lever
2020-08-09 17:16                   ` Mimi Zohar
2020-08-09 17:16                     ` Mimi Zohar
2020-08-10 15:35                     ` James Bottomley
2020-08-10 15:35                       ` James Bottomley
2020-08-10 16:35                       ` Mimi Zohar
2020-08-10 16:35                         ` Mimi Zohar
2020-08-10 17:13                         ` James Bottomley
2020-08-10 17:13                           ` James Bottomley
2020-08-10 17:57                           ` Mimi Zohar
2020-08-10 17:57                             ` Mimi Zohar
2020-08-10 23:36                       ` Chuck Lever
2020-08-10 23:36                         ` Chuck Lever
2020-08-10 23:36                         ` Chuck Lever
2020-08-11  5:43                         ` James Bottomley
2020-08-11  5:43                           ` James Bottomley
2020-08-11  5:43                           ` James Bottomley
2020-08-11 14:48                           ` Chuck Lever
2020-08-11 14:48                             ` Chuck Lever
2020-08-11 14:48                             ` Chuck Lever
2020-08-11 15:32                             ` James Bottomley
2020-08-11 15:32                               ` James Bottomley
2020-08-11 15:32                               ` James Bottomley
2020-08-11 19:30                               ` Pavel Machek
2020-08-11 19:30                                 ` Pavel Machek
2020-08-11 19:30                                 ` Pavel Machek
2020-08-12 14:45                               ` Chuck Lever
2020-08-12 14:45                                 ` Chuck Lever
2020-08-12 14:45                                 ` Chuck Lever
2020-08-11 15:53                             ` James Bottomley
2020-08-11 15:53                               ` James Bottomley
2020-08-11 15:53                               ` James Bottomley
2020-08-12 14:15                               ` Chuck Lever
2020-08-12 14:15                                 ` Chuck Lever
2020-08-12 14:15                                 ` Chuck Lever
2020-08-12 15:51                                 ` James Bottomley
2020-08-12 15:51                                   ` James Bottomley
2020-08-12 15:51                                   ` James Bottomley
2020-08-13 14:42                                   ` Chuck Lever
2020-08-13 14:42                                     ` Chuck Lever
2020-08-13 14:42                                     ` Chuck Lever
2020-08-13 15:10                                     ` James Bottomley
2020-08-13 15:10                                       ` James Bottomley
2020-08-13 15:10                                       ` James Bottomley
2020-08-14 14:21                                       ` Chuck Lever
2020-08-14 14:21                                         ` Chuck Lever
2020-08-14 14:21                                         ` Chuck Lever
2020-08-11 18:28                             ` James Bottomley
2020-08-11 18:28                               ` James Bottomley
2020-08-11 18:28                               ` James Bottomley
2020-08-12 13:56                               ` Chuck Lever
2020-08-12 13:56                                 ` Chuck Lever
2020-08-12 13:56                                 ` Chuck Lever
2020-08-12 15:42                                 ` James Bottomley
2020-08-12 15:42                                   ` James Bottomley
2020-08-12 15:42                                   ` James Bottomley
2020-08-13 14:21                                   ` Chuck Lever
2020-08-13 14:21                                     ` Chuck Lever
2020-08-13 14:21                                     ` Chuck Lever
2020-08-13 14:42                                     ` James Bottomley
2020-08-13 14:42                                       ` James Bottomley
2020-08-13 14:42                                       ` James Bottomley
2020-08-13 14:56                                       ` Chuck Lever
2020-08-13 14:56                                         ` Chuck Lever
2020-08-13 14:56                                         ` Chuck Lever
2020-08-11 21:03                   ` James Morris
2020-08-11 21:03                     ` James Morris
2020-08-11 21:03                     ` James Morris
2020-08-12 14:18                     ` Chuck Lever
2020-08-12 14:18                       ` Chuck Lever
2020-08-12 14:18                       ` Chuck Lever
2020-08-12 17:07                       ` Deven Bowers
2020-08-12 17:07                         ` Deven Bowers

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=a5534f1c-8979-0cfd-3989-2567f4a29dbc@linux.microsoft.com \
    --to=deven.desai@linux.microsoft.com \
    --cc=agk@redhat.com \
    --cc=axboe@kernel.dk \
    --cc=corbet@lwn.net \
    --cc=dm-devel@redhat.com \
    --cc=ebiggers@kernel.org \
    --cc=eparis@redhat.com \
    --cc=jannh@google.com \
    --cc=jaskarankhurana@linux.microsoft.com \
    --cc=jmorris@namei.org \
    --cc=linux-audit@redhat.com \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-integrity@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-security-module@vger.kernel.org \
    --cc=mdsakib@microsoft.com \
    --cc=nramas@linux.microsoft.com \
    --cc=pasha.tatashin@soleen.com \
    --cc=paul@paul-moore.com \
    --cc=sashal@kernel.org \
    --cc=serge@hallyn.com \
    --cc=snitzer@redhat.com \
    --cc=tyhicks@linux.microsoft.com \
    --cc=viro@zeniv.linux.org.uk \
    --cc=zohar@linux.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.