105 lines
4.2 KiB
Diff
105 lines
4.2 KiB
Diff
From ea90c1e23120e8bde86d22d83d179bc393bc2daa Mon Sep 17 00:00:00 2001
|
|
Message-Id: <ea90c1e23120e8bde86d22d83d179bc393bc2daa@dist-git>
|
|
From: =?UTF-8?q?J=C3=A1n=20Tomko?= <jtomko@redhat.com>
|
|
Date: Tue, 29 Sep 2020 14:43:04 +0200
|
|
Subject: [PATCH] rpc: add support for filtering @acls by uint params
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
CVE-2020-25637
|
|
|
|
Add a new field to @acl annotations for filtering by
|
|
unsigned int parameters.
|
|
|
|
Signed-off-by: Ján Tomko <jtomko@redhat.com>
|
|
(cherry picked from commit 50864dcda191eb35732dbd80fb6ca251a6bba923)
|
|
Signed-off-by: Ján Tomko <jtomko@redhat.com>
|
|
Message-Id: <7900a5f9e8479789a5cc427a85f385095e517e87.1601383236.git.jtomko@redhat.com>
|
|
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
|
|
---
|
|
src/remote/remote_protocol.x | 3 +++
|
|
src/rpc/gendispatch.pl | 21 ++++++++++++++++++++-
|
|
2 files changed, 23 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x
|
|
index 79cdb13a90..2527a78142 100644
|
|
--- a/src/remote/remote_protocol.x
|
|
+++ b/src/remote/remote_protocol.x
|
|
@@ -3805,6 +3805,7 @@ enum remote_procedure {
|
|
*
|
|
* - @acl: <object>:<permission>
|
|
* - @acl: <object>:<permission>:<flagname>
|
|
+ * - @acl: <object>:<permission>::<param>:<value>
|
|
*
|
|
* Declare the access control requirements for the API. May be repeated
|
|
* multiple times, if multiple rules are required.
|
|
@@ -3814,6 +3815,8 @@ enum remote_procedure {
|
|
* <permission> is one of the permissions in access/viraccessperm.h
|
|
* <flagname> indicates the rule only applies if the named flag
|
|
* is set in the API call
|
|
+ * <param> and <value> can be used to check an unsigned int parameter
|
|
+ * against value
|
|
*
|
|
* - @aclfilter: <object>:<permission>
|
|
*
|
|
diff --git a/src/rpc/gendispatch.pl b/src/rpc/gendispatch.pl
|
|
index 4cb9701e59..6a4f8074ad 100755
|
|
--- a/src/rpc/gendispatch.pl
|
|
+++ b/src/rpc/gendispatch.pl
|
|
@@ -2104,10 +2104,12 @@ elsif ($mode eq "client") {
|
|
my @acl;
|
|
foreach (@{$acl}) {
|
|
my @bits = split /:/;
|
|
- push @acl, { object => $bits[0], perm => $bits[1], flags => $bits[2] }
|
|
+ push @acl, { object => $bits[0], perm => $bits[1], flags => $bits[2],
|
|
+ param => $bits[3], value => $bits[4] }
|
|
}
|
|
|
|
my $checkflags = 0;
|
|
+ my $paramtocheck = undef;
|
|
for (my $i = 1 ; $i <= $#acl ; $i++) {
|
|
if ($acl[$i]->{object} ne $acl[0]->{object}) {
|
|
die "acl for '$call->{ProcName}' cannot check different objects";
|
|
@@ -2115,6 +2117,9 @@ elsif ($mode eq "client") {
|
|
if (defined $acl[$i]->{flags} && length $acl[$i]->{flags}) {
|
|
$checkflags = 1;
|
|
}
|
|
+ if (defined $acl[$i]->{param}) {
|
|
+ $paramtocheck = $acl[$i]->{param};
|
|
+ }
|
|
}
|
|
|
|
my $apiname = $prefix . $call->{ProcName};
|
|
@@ -2150,6 +2155,9 @@ elsif ($mode eq "client") {
|
|
if ($checkflags) {
|
|
push @argdecls, "unsigned int flags";
|
|
}
|
|
+ if (defined $paramtocheck) {
|
|
+ push @argdecls, "unsigned int " . $paramtocheck;
|
|
+ }
|
|
|
|
my $ret;
|
|
my $pass;
|
|
@@ -2210,6 +2218,17 @@ elsif ($mode eq "client") {
|
|
}
|
|
print " ";
|
|
}
|
|
+ if (defined $acl->{param}) {
|
|
+ my $param = $acl->{param};
|
|
+ my $value = $acl->{value};
|
|
+ if ($value =~ /^\!/) {
|
|
+ $value = substr $value, 1;
|
|
+ print "($param != ($value)) &&\n";
|
|
+ } else {
|
|
+ print "($param == ($value)) &&\n";
|
|
+ }
|
|
+ print " ";
|
|
+ }
|
|
print "(rv = $method(" . join(", ", @argvars, $perm) . ")) <= 0) {\n";
|
|
print " virObjectUnref(mgr);\n";
|
|
if ($action eq "Ensure") {
|
|
--
|
|
2.28.0
|
|
|