From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id 1A0F07E3FD for ; Wed, 10 Nov 2021 13:49:06 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 17A3F1BFD0 for ; Wed, 10 Nov 2021 13:49:06 +0100 (CET) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [94.136.29.106]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS id 032A61BF60 for ; Wed, 10 Nov 2021 13:49:05 +0100 (CET) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id CC53B44BC2 for ; Wed, 10 Nov 2021 13:49:04 +0100 (CET) From: Wolfgang Bumiller To: pve-devel@lists.proxmox.com Date: Wed, 10 Nov 2021 13:49:00 +0100 Message-Id: <20211110124904.164053-2-w.bumiller@proxmox.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211110124904.164053-1-w.bumiller@proxmox.com> References: <20211110124904.164053-1-w.bumiller@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.489 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [accesscontrol.pm] Subject: [pve-devel] [PATCH access-control 1/4] assert tfa/user config lock order X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 10 Nov 2021 12:49:06 -0000 Signed-off-by: Wolfgang Bumiller --- src/PVE/AccessControl.pm | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/PVE/AccessControl.pm b/src/PVE/AccessControl.pm index 0b00847..49cef94 100644 --- a/src/PVE/AccessControl.pm +++ b/src/PVE/AccessControl.pm @@ -12,6 +12,7 @@ use Digest::SHA; use IO::File; use File::stat; use JSON; +use Scalar::Util 'weaken'; use PVE::OTP; use PVE::Ticket; @@ -68,10 +69,20 @@ sub pve_verify_realm { PVE::Auth::Plugin::pve_verify_realm(@_); } +# Locking both config files together is only ever allowed in one order: +# 1) tfa config +# 2) user config +# If we permit the other way round, too, we might end up deadlocking! +my $user_config_locked; sub lock_user_config { my ($code, $errmsg) = @_; + my $locked = 1; + $user_config_locked = \$locked; + weaken $user_config_locked; # make this scope guard signal safe... + cfs_lock_file("user.cfg", undef, $code); + $user_config_locked = undef; if (my $err = $@) { $errmsg ? die "$errmsg: $err" : die $err; } @@ -80,6 +91,9 @@ sub lock_user_config { sub lock_tfa_config { my ($code, $errmsg) = @_; + die "tfa config lock cannot be acquired while holding user config lock\n" + if ($user_config_locked && $$user_config_locked); + my $res = cfs_lock_file("priv/tfa.cfg", undef, $code); if (my $err = $@) { $errmsg ? die "$errmsg: $err" : die $err; -- 2.30.2