Skip to content

Commit 75cd4b3

Browse files
Harden cross-version join: Handle non-monotonicity of presence of COSE signatures (#7010)
Co-authored-by: Amaury Chamayou <amchamay@microsoft.com>
1 parent 98e72ca commit 75cd4b3

File tree

14 files changed

+124
-9
lines changed

14 files changed

+124
-9
lines changed

src/kv/deserialise.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ namespace ccf::kv
148148

149149
if (history)
150150
{
151-
if (!history->verify_root_signatures())
151+
if (!history->verify_root_signatures(version))
152152
{
153153
LOG_FAIL_FMT("Failed to deserialise");
154154
LOG_DEBUG_FMT(

src/kv/kv_types.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -400,7 +400,7 @@ namespace ccf::kv
400400
};
401401

402402
virtual ~TxHistory() {}
403-
virtual bool verify_root_signatures() = 0;
403+
virtual bool verify_root_signatures(ccf::kv::Version version) = 0;
404404
virtual void try_emit_signature() = 0;
405405
virtual void emit_signature() = 0;
406406
virtual ccf::crypto::Sha256Hash get_replicated_state_root() = 0;

src/node/history.h

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ namespace ccf
153153
version++;
154154
}
155155

156-
bool verify_root_signatures() override
156+
bool verify_root_signatures(ccf::kv::Version v) override
157157
{
158158
return true;
159159
}
@@ -772,7 +772,7 @@ namespace ccf
772772
term_of_next_version};
773773
}
774774

775-
bool verify_root_signatures() override
775+
bool verify_root_signatures(ccf::kv::Version version) override
776776
{
777777
auto tx = store.create_read_only_tx();
778778

@@ -801,6 +801,23 @@ namespace ccf
801801
return true;
802802
}
803803

804+
// Since COSE signatures have not always been emitted, it is possible in a
805+
// mixed-service to see an _old_ COSE signature (by reading from the KV)
806+
// that does not refer to the _current root_. When this occurs
807+
// version_of_previous_write will not match the version at which we're
808+
// verifying.
809+
const auto cose_sig_version =
810+
cose_signatures->get_version_of_previous_write();
811+
if (cose_sig_version.has_value() && cose_sig_version.value() != version)
812+
{
813+
LOG_INFO_FMT(
814+
"Non-monotonic presence of COSE signatures - had one at {} but none "
815+
"at {}",
816+
cose_sig_version.value(),
817+
version);
818+
return true;
819+
}
820+
804821
auto service = tx.template ro<ccf::Service>(Tables::SERVICE);
805822
auto service_info = service->get();
806823

tests/recovery.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import subprocess
1414
import json
1515
from infra.runner import ConcurrentRunner
16-
from distutils.dir_util import copy_tree
16+
from distutils.dir_util import remove_tree, copy_tree
1717
from infra.consortium import slurp_file
1818
import infra.health_watcher
1919
import time
@@ -536,8 +536,9 @@ def test_recover_service_from_files(
536536
os.path.dirname(os.path.realpath(__file__)), "testdata", directory
537537
)
538538

539-
old_common = os.path.join(service_dir, "common")
540539
new_common = infra.network.get_common_folder_name(args.workspace, args.label)
540+
remove_tree(new_common)
541+
old_common = os.path.join(service_dir, "common")
541542
copy_tree(old_common, new_common)
542543

543544
network = infra.network.Network(args.nodes, args.binary_dir)
@@ -1078,16 +1079,26 @@ def run(args):
10781079
), f"{service_status} service at seqno {seqno} did not start a new ledger chunk (started at {chunk_start_seqno})"
10791080

10801081
test_recover_service_from_files(
1081-
args, "expired_service", expected_recovery_count=2, test_receipt=True
1082+
args, directory="expired_service", expected_recovery_count=2, test_receipt=True
10821083
)
10831084
# sgx_service is historical ledger, from 1.x -> 2.x -> 3.x -> 5.x -> main.
10841085
# This is used to test recovery from SGX to SNP.
10851086
test_recover_service_from_files(
1086-
args, "sgx_service", expected_recovery_count=4, test_receipt=False
1087+
args, directory="sgx_service", expected_recovery_count=4, test_receipt=False
10871088
)
10881089

10891090
test_recover_service_from_files(
1090-
args, "double_sealed_service", expected_recovery_count=2, test_receipt=False
1091+
args,
1092+
directory="double_sealed_service",
1093+
expected_recovery_count=2,
1094+
test_receipt=False,
1095+
)
1096+
1097+
test_recover_service_from_files(
1098+
args,
1099+
directory="cose_flipflop_service",
1100+
expected_recovery_count=0,
1101+
test_receipt=False,
10911102
)
10921103

10931104

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIBtjCCATygAwIBAgIUTZE/TAbIYBwtCz7OKWJLQ2PlC0YwCgYIKoZIzj0EAwMw
3+
EjEQMA4GA1UEAwwHbWVtYmVyMDAeFw0yNTA1MTQwOTM4MjhaFw0yNjA1MTQwOTM4
4+
MjhaMBIxEDAOBgNVBAMMB21lbWJlcjAwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQR
5+
cCSEcdKjs4Nu5h55mNGo2JREdPlLmRiBBIaospJonX6m6UAQT0FFU3jeaSkI8Yq7
6+
5HKGGXcbxzi0628aN9tDir0W2IfFATWww12Ln/+xLQhgkuBjFXc5XLHSdX/zbKuj
7+
UzBRMB0GA1UdDgQWBBQnqJPZXtGRunqPjKeqXB/nLIjEUjAfBgNVHSMEGDAWgBQn
8+
qJPZXtGRunqPjKeqXB/nLIjEUjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMD
9+
A2gAMGUCMB1RJ1k8gU2HEjzUxO6KeluhMLwdzYWcKFtsVpjaIhGVtpPNvA/JEbZ2
10+
ye3R8lQZVAIxAP8H+jAdzZGbl0ZAj4fgMn3Hr8p5IRzy2QOkp7N0HQdn4jRnNn/f
11+
PSR+05Qr0dy0iw==
12+
-----END CERTIFICATE-----
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC0gQu2IGuDYWwO
3+
3Uza1k/Yz957bmQ6vsUBcw80aj9F1s0Q4xbX5zLHddf80KPdVeacXL696Xj4eaWR
4+
3p2KVU+485RAXnGPsgrnXOKp++sYm2Sbg/S7C0gN3F+nSKjOv2UucefGpJUGR2zE
5+
Vo+tR+F5COxKipCpeVKYqX9caPSsxa5x80fdY380LvxO5DA2TZHibn55Qurj9g+a
6+
5M3pvBB+d4tRqAQCLC6nmYBi7Efs71gpg0Gy6mQecx3iqtFF2hHSpSkOODQL7P0w
7+
ybhfMcPW+l2x8tnGZtAttRa4m39pVZoRXaAvke2QOPmrOMhnSJ4giOjryzG94j69
8+
x9ybipL9AgMBAAECggEAbvZlnLCRZ1KcewbQGDdnHoGq43YZZ4Oe2CVDU5V9EBHc
9+
PmVbxZ37OWLYRDJ+ibIk8jqRh23fT+B4SBPyBPgs6iXTHT7x0MRCr7gKHzUecSIV
10+
1wRnjhSBVwQCSXQBUheWu9aKBTNn6VQ/KPONn5hwo1c46xoDlCtg+zg3czeSMiLK
11+
X36/vRwgywCWLfh/n7R7W7VE+jloOdSRGVAXBiUBNRO7bJLyThUbQKfJpqPbEQJk
12+
T6lmmEKUHEtO3UwkQWaSo3le7P2YZj9Hbt2ZbIuKGlg1+TK99p2Ld5PgcbMojb4L
13+
VXeVtrninkj4yo8sNhKWSmUi40aBmGtoR1XCdCGCgQKBgQDtdejRdwmynCVf6O8/
14+
cFgm1uukK63gT5XcHARUfVCtl2IDAtOlerGzTzFS3Xxxju9bCgPlIhfrp+RVvLpx
15+
7LTQMvJHqYb33yZWQk3x3nZV632RlFE7u/fNS7aAWiwQyop7TcuuyJQUJ/niLefj
16+
nrv2LPFMFG+D7HC2rSJlI4H80wKBgQDCmMFEM78S5yBghmW0oqdeVdOSoV3r9PsS
17+
36g/8QUPxp7h+iaGLFY6i9TlpubHMA/qtUTc3DOWKEbu7kGybTT9PTU0HFOqj9p9
18+
+J5KMzrG8ZKnZ5cZnAz9djsHY2TlKNEPl9WVMz7BdpwSsE1+4PUXmidJa4fFnYKb
19+
d1fu97QO7wKBgCfwkBNDMVdgWgzyseL6s2j89y9qxVkYKb2W3MeVOE+qSar1+8E2
20+
jNL6+/HTHQ5Am1O1sIgGnv1dBNPC5Z0p0hO+re+NvQzN9LXHezK2VzMGY91rk+o3
21+
KGvYUz7ta8H7PyWUJTElvXpSav42+GzZkwXJ81/3g/Yte5vOLR3TxhZPAoGAYY+m
22+
LaRn4nlAEUSwTvzRPol3FmeSqA7dpdu+Bbi3me4xkAgTMmeeH6IlbbHct/aPtFOH
23+
H9fCgUDWN0n6ZBM+YsxCFUsyYyvWFhwEeBzxFfbdWNKlvbAwDw8sjwq09fMdxVyR
24+
N0lG6EWn//KmF7t/BYNCuRuRKXFLntgZnPRRML8CgYEAvKEHgmHtO5Pq5lEXA8zW
25+
tD8luf+PlHZEN65/1ramh13vjzBcT/Hy3Wd5mao9ukaDyxs7scpSQjIi7sGLi+AL
26+
mcH/EVJEhW/yhhS9oxjEiFw1hDkniRABkY8e7qgY+BYBr03IxAaeO3P5xbmtU6hD
27+
xQZD7728oOYUnGdJMECxk1E=
28+
-----END PRIVATE KEY-----
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
-----BEGIN PUBLIC KEY-----
2+
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtIELtiBrg2FsDt1M2tZP
3+
2M/ee25kOr7FAXMPNGo/RdbNEOMW1+cyx3XX/NCj3VXmnFy+vel4+Hmlkd6dilVP
4+
uPOUQF5xj7IK51ziqfvrGJtkm4P0uwtIDdxfp0iozr9lLnHnxqSVBkdsxFaPrUfh
5+
eQjsSoqQqXlSmKl/XGj0rMWucfNH3WN/NC78TuQwNk2R4m5+eULq4/YPmuTN6bwQ
6+
fneLUagEAiwup5mAYuxH7O9YKYNBsupkHnMd4qrRRdoR0qUpDjg0C+z9MMm4XzHD
7+
1vpdsfLZxmbQLbUWuJt/aVWaEV2gL5HtkDj5qzjIZ0ieIIjo68sxveI+vcfcm4qS
8+
/QIDAQAB
9+
-----END PUBLIC KEY-----
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
-----BEGIN EC PARAMETERS-----
2+
BgUrgQQAIg==
3+
-----END EC PARAMETERS-----
4+
-----BEGIN EC PRIVATE KEY-----
5+
MD4CAQEEMJE8kt9YzL1Rzq4KEJr6cwGaQzNBaXRT+H5o7D0Q3lzJb2YElOTbf4Bc
6+
JxtMzasj7KAHBgUrgQQAIg==
7+
-----END EC PRIVATE KEY-----
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIBxzCCAU6gAwIBAgIRANl2+C0zZDIT2lMUKTXnYYEwCgYIKoZIzj0EAwMwGzEZ
3+
MBcGA1UEAwwQQ0NGIFRlc3QgU2VydmljZTAeFw0yNTA1MTQwOTM4MjlaFw0yNTA4
4+
MTIwOTM4MjhaMBsxGTAXBgNVBAMMEENDRiBUZXN0IFNlcnZpY2UwdjAQBgcqhkjO
5+
PQIBBgUrgQQAIgNiAAS0OZpyTj4YkNdKkdb2oyWQyWl+3t4CW8GoDZV2wAwCT4qY
6+
qHvFlUV6/x9Po1vSO3jhZGSalh7Xt5g+/n/27oeJ3hwUuCFSHul5h83iz0/ic1cR
7+
PUZfb2q3w9BkxH0KDOyjVjBUMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE
8+
FGOM7cxAKjqDINga++n9fP/VYD3/MB8GA1UdIwQYMBaAFGOM7cxAKjqDINga++n9
9+
fP/VYD3/MAoGCCqGSM49BAMDA2cAMGQCMFwMjw+TrzJdDX6TwzTDxEZ1lbeMBoQZ
10+
ggP6dDyixzMM5fpf8IcVzIEmFLxhcHIxwQIwf0Er1e/V4liei8BrmDMVSoZ49ET9
11+
XTYUeiwfi4L9bH5AeZE3s7nl9YeZTYx7TqGO
12+
-----END CERTIFICATE-----
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIBsTCCATigAwIBAgIUO+mcweSUTjR+BRR7bGk7lLJAwyQwCgYIKoZIzj0EAwMw
3+
EDEOMAwGA1UEAwwFdXNlcjAwHhcNMjUwNTE0MDkzODMwWhcNMjYwNTE0MDkzODMw
4+
WjAQMQ4wDAYDVQQDDAV1c2VyMDB2MBAGByqGSM49AgEGBSuBBAAiA2IABDqJJdHa
5+
lRH8ouN0YdzZWCX98riSIuus/EgMy5uFGnXqf2hRAzA30Pf5nb8VbUxkc+j358y7
6+
5GDjlEHkiUifi9ulKmMWKwZORvyiDlkoJNtgtmuxnIOcL8zSzrTVYJK1k6NTMFEw
7+
HQYDVR0OBBYEFNbcukLhNYbUZyGg8cgGVlO4gOclMB8GA1UdIwQYMBaAFNbcukLh
8+
NYbUZyGg8cgGVlO4gOclMA8GA1UdEwEB/wQFMAMBAf8wCgYIKoZIzj0EAwMDZwAw
9+
ZAIwRvHW6wT7TJGFwoGSA8GCOl5dwUpgfE4mOfeTimPds460bVNuHPBEnpCMs4of
10+
ZWFJAjAneFheLWxphX+bZY1UZtg5qcsdHcojPZV76jP+ejwfbycB/ng1iGxzD8b/
11+
gnS9oHM=
12+
-----END CERTIFICATE-----
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
-----BEGIN EC PARAMETERS-----
2+
BgUrgQQAIg==
3+
-----END EC PARAMETERS-----
4+
-----BEGIN EC PRIVATE KEY-----
5+
MD4CAQEEMOyzlQIbgQgSdhgKF/ZEdcbW7yZ0FMXPf2q6HVb0dl+pcol7BDCVq1M5
6+
6x3R/L/WHqAHBgUrgQQAIg==
7+
-----END EC PRIVATE KEY-----
Binary file not shown.
Binary file not shown.

tests/testdata/cose_flipflop_service/snapshots/.gitkeep

Whitespace-only changes.

0 commit comments

Comments
 (0)