diff --git a/Changes b/Changes
index 6badcf3..07840ae 100644
--- a/Changes
+++ b/Changes
@@ -2,6 +2,12 @@ Revision history for XML-Sig
{{$NEXT}}
+ [Notable Changes since 0.67]
+ - Fixed (CVE-2025-40934) issue where unsigned xml verified as true (thanks @gttds)
+
+ [Change Log]
+ - 420d8c4 Fixes #63: An unsigned XML should fail verification
+
0.67 -- Fri Nov 07 18:25:52 AST 2025
[Notable Changes since 0.65]
diff --git a/Makefile.PL b/Makefile.PL
index 93613c6..b80422e 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -47,7 +47,7 @@ my %WriteMakefileArgs = (
"Test::Lib" => 0,
"Test::More" => 0
},
- "VERSION" => "0.67",
+ "VERSION" => "0.68",
"test" => {
"TESTS" => "t/*.t"
}
diff --git a/README b/README
index 12876e9..b236a63 100644
--- a/README
+++ b/README
@@ -3,7 +3,7 @@ NAME
Signatures
VERSION
- version 0.67
+ version 0.68
SYNOPSIS
my $xml = '123';
diff --git a/lib/XML/Sig.pm b/lib/XML/Sig.pm
index 8fe9a88..2eab3e6 100644
--- a/lib/XML/Sig.pm
+++ b/lib/XML/Sig.pm
@@ -500,6 +500,7 @@ sub verify {
my $numsigs = $signature_nodeset->size();
print ("NodeSet Size: $numsigs\n") if $DEBUG;
+ die 'XML::Sig - XML does not include any signatures' if $numsigs <= 0;
# Loop through each Signature in the document checking each
my $i;
while (my $signature_node = $signature_nodeset->shift()) {
@@ -669,7 +670,7 @@ sub verify {
return 0 unless ($refdigest eq _trim(encode_base64($digest, '')));
print ( "Signature $i Valid\n") if $DEBUG;
- }
+ }
return 1;
}
diff --git a/t/027_no_signatures_should_fail.t b/t/027_no_signatures_should_fail.t
new file mode 100644
index 0000000..ffe9d01
--- /dev/null
+++ b/t/027_no_signatures_should_fail.t
@@ -0,0 +1,35 @@
+use strict;
+use warnings;
+use Test::More;
+use Test::Exception;
+
+use XML::Sig;
+
+my $cert_text = '-----BEGIN CERTIFICATE-----
+MIIC4jCCAcoCCQC33wnybT5QZDANBgkqhkiG9w0BAQsFADAyMQswCQYDVQQGEwJV
+SzEPMA0GA1UECgwGQm94eUhRMRIwEAYDVQQDDAlNb2NrIFNBTUwwIBcNMjIwMjI4
+MjE0NjM4WhgPMzAyMTA3MDEyMTQ2MzhaMDIxCzAJBgNVBAYTAlVLMQ8wDQYDVQQK
+DAZCb3h5SFExEjAQBgNVBAMMCU1vY2sgU0FNTDCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBALGfYettMsct1T6tVUwTudNJH5Pnb9GGnkXi9Zw/e6x45DD0
+RuRONbFlJ2T4RjAE/uG+AjXxXQ8o2SZfb9+GgmCHuTJFNgHoZ1nFVXCmb/Hg8Hpd
+4vOAGXndixaReOiq3EH5XvpMjMkJ3+8+9VYMzMZOjkgQtAqO36eAFFfNKX7dTj3V
+pwLkvz6/KFCq8OAwY+AUi4eZm5J57D31GzjHwfjH9WTeX0MyndmnNB1qV75qQR3b
+2/W5sGHRv+9AarggJkF+ptUkXoLtVA51wcfYm6hILptpde5FQC8RWY1YrswBWAEZ
+NfyrR4JeSweElNHg4NVOs4TwGjOPwWGqzTfgTlECAwEAATANBgkqhkiG9w0BAQsF
+AAOCAQEAAYRlYflSXAWoZpFfwNiCQVE5d9zZ0DPzNdWhAybXcTyMf0z5mDf6FWBW
+5Gyoi9u3EMEDnzLcJNkwJAAc39Apa4I2/tml+Jy29dk8bTyX6m93ngmCgdLh5Za4
+khuU3AM3L63g7VexCuO7kwkjh/+LqdcIXsVGO6XDfu2QOs1Xpe9zIzLpwm/RNYeX
+UjbSj5ce/jekpAw7qyVVL4xOyh8AtUW1ek3wIw1MJvEgEPt0d16oshWJpoS1OT8L
+r/22SvYEo3EmSGdTVGgk3x3s+A0qWAqTcyjr7Q4s/GKYRFfomGwz0TZ4Iw1ZN99M
+m0eo2USlSRTVl7QHRTuiuSThHpLKQQ==
+-----END CERTIFICATE-----';
+
+my $xml = '123';
+my $signer = XML::Sig->new({
+ cert_text => $cert_text,
+});
+
+# verify a signature
+dies_ok( sub { $signer->verify($xml); }, "No Signatures found die properly.");
+
+done_testing();