zfs/lib/libzfs
Tom Caputi f00ab3f22c Detect and prevent mixed raw and non-raw sends
Currently, there is an issue in the raw receive code where
raw receives are allowed to happen on top of previously
non-raw received datasets. This is a problem because the
source-side dataset doesn't know about how the blocks on
the destination were encrypted. As a result, any MAC in
the objset's checksum-of-MACs tree that is a parent of both
blocks encrypted on the source and blocks encrypted by the
destination will be incorrect. This will result in
authentication errors when we decrypt the dataset.

This patch fixes this issue by adding a new check to the
raw receive code. The code now maintains an "IVset guid",
which acts as an identifier for the set of IVs used to
encrypt a given snapshot. When a snapshot is raw received,
the destination snapshot will take this value from the
DRR_BEGIN payload. Non-raw receives and normal "zfs snap"
operations will cause ZFS to generate a new IVset guid.
When a raw incremental stream is received, ZFS will check
that the "from" IVset guid in the stream matches that of
the "from" destination snapshot. If they do not match, the
code will error out the receive, preventing the problem.

This patch requires an on-disk format change to add the
IVset guids to snapshots and bookmarks. As a result, this
patch has errata handling and a tunable to help affected
users resolve the issue with as little interruption as
possible.

Reviewed-by: Paul Dagnelie <pcd@delphix.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Matt Ahrens <mahrens@delphix.com>
Signed-off-by: Tom Caputi <tcaputi@datto.com>
Closes #8308
2019-03-13 11:00:43 -07:00
..
.gitignore Add a pkgconfig file 2014-08-28 07:59:43 -07:00
Makefile.am Include third party licenses in dist tarballs 2019-01-08 09:29:34 -08:00
THIRDPARTYLICENSE.openssl Encryption patch follow-up 2017-10-11 16:54:48 -04:00
THIRDPARTYLICENSE.openssl.descrip Encryption patch follow-up 2017-10-11 16:54:48 -04:00
libzfs.pc.in Add a pkgconfig file 2014-08-28 07:59:43 -07:00
libzfs_changelist.c Fix changelist mounted-dataset iteration 2018-10-10 21:13:13 -07:00
libzfs_config.c OpenZFS 4521 - zfstest is trying to execute evil "zfs unmount -a" 2017-02-03 13:24:44 -08:00
libzfs_core.pc.in Add a pkgconfig file 2014-08-28 07:59:43 -07:00
libzfs_crypto.c Added encryption support for zfs recv -o / -x 2018-08-15 09:48:49 -07:00
libzfs_dataset.c Avoid retrieving unused snapshot props 2019-03-12 13:13:22 -07:00
libzfs_diff.c OpenZFS 9559 - zfs diff handles files on delete queue in fromsnap poorly 2018-12-14 09:50:49 -08:00
libzfs_import.c Add libzutil for libzfs or libzpool consumers 2018-11-05 11:22:33 -08:00
libzfs_iter.c Detect and prevent mixed raw and non-raw sends 2019-03-13 11:00:43 -07:00
libzfs_mount.c OpenZFS 9880 - Race in ZFS parallel mount 2018-12-07 11:02:23 -08:00
libzfs_pool.c OpenZFS 9102 - zfs should be able to initialize storage devices 2019-01-07 10:37:26 -08:00
libzfs_sendrecv.c Detect and prevent mixed raw and non-raw sends 2019-03-13 11:00:43 -07:00
libzfs_status.c Add missing MMP status code to libzfs_status 2019-01-03 12:15:46 -08:00
libzfs_util.c ZVOLs should not be allowed to have children 2019-02-08 15:44:15 -08:00