fix(upgrade): U-02 — validate version in minisign trusted comment against release tag
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
use sanctum::upgrade::{
|
||||
run_upgrade, verify_minisign_signature, UpgradeOptions, SANCTUM_RELEASE_PUBKEY,
|
||||
run_upgrade, validate_trusted_comment_version, verify_minisign_signature, UpgradeOptions,
|
||||
SANCTUM_RELEASE_PUBKEY,
|
||||
};
|
||||
|
||||
#[test]
|
||||
@@ -108,3 +109,38 @@ trusted comment: timestamp:1789750897\tfile:test_payload.txt\thashed\n\
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_u02_validate_trusted_comment_version_matching() {
|
||||
// Standard Minisign format with -t "version:0.8.0"
|
||||
let tc1 = "timestamp:1789750897\tversion:0.8.0\tfile:SHA256SUMS.txt\thashed";
|
||||
assert!(validate_trusted_comment_version(tc1, "0.8.0").is_ok());
|
||||
assert!(validate_trusted_comment_version(tc1, "v0.8.0").is_ok());
|
||||
|
||||
// Alternative tags like tag:v0.8.0 or release:0.8.0
|
||||
let tc2 = "release:0.8.0";
|
||||
assert!(validate_trusted_comment_version(tc2, "0.8.0").is_ok());
|
||||
let tc3 = "tag:v0.8.0";
|
||||
assert!(validate_trusted_comment_version(tc3, "0.8.0").is_ok());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_u02_reject_mismatched_release_tag_replay() {
|
||||
// An attacker replays a valid signature from v0.7.0 for an update claiming to be v0.8.0
|
||||
let tc_old = "timestamp:1789750897\tversion:0.7.0\tfile:SHA256SUMS.txt\thashed";
|
||||
let res = validate_trusted_comment_version(tc_old, "v0.8.0");
|
||||
assert!(
|
||||
res.is_err(),
|
||||
"U-02: Ältere oder abweichende Version im Trusted Comment muss abgewiesen werden"
|
||||
);
|
||||
let err_msg = res.unwrap_err().to_string();
|
||||
assert!(
|
||||
err_msg.contains("U-02") && err_msg.contains("Replay-Angriff"),
|
||||
"Fehlermeldung muss auf Replay-Angriff und U-02 hinweisen: {err_msg}"
|
||||
);
|
||||
|
||||
// Empty or completely missing version token
|
||||
let tc_no_ver = "timestamp:1789750897\tfile:SHA256SUMS.txt\thashed";
|
||||
let res2 = validate_trusted_comment_version(tc_no_ver, "0.8.0");
|
||||
assert!(res2.is_err());
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user