|
 |
35e59b |
From 5764a80e5edd7fa38323146261c6b4e498d282dd Mon Sep 17 00:00:00 2001
|
|
 |
35e59b |
From: "Endi S. Dewata" <edewata@redhat.com>
|
|
 |
35e59b |
Date: Mon, 17 May 2021 18:17:26 -0500
|
|
 |
35e59b |
Subject: [PATCH] Use password file when creating admin user
|
|
 |
35e59b |
|
|
 |
35e59b |
The pki-server <subsystem>-user-add has been updated to
|
|
 |
35e59b |
provide a --password-file option. The deployment tool
|
|
 |
35e59b |
has been modified to use this option when creating the
|
|
 |
35e59b |
admin user to avoid the password from getting logged in
|
|
 |
35e59b |
the debug mode.
|
|
 |
35e59b |
|
|
 |
35e59b |
Resolves: CVE-2021-3551
|
|
 |
35e59b |
---
|
|
 |
35e59b |
base/server/python/pki/server/cli/user.py | 9 ++-
|
|
 |
35e59b |
.../python/pki/server/deployment/__init__.py | 5 +-
|
|
 |
35e59b |
base/server/python/pki/server/subsystem.py | 74 +++++++++++--------
|
|
 |
35e59b |
.../server/cli/SubsystemUserAddCLI.java | 11 +++
|
|
 |
35e59b |
4 files changed, 66 insertions(+), 33 deletions(-)
|
|
 |
35e59b |
|
|
 |
35e59b |
diff --git a/base/server/python/pki/server/cli/user.py b/base/server/python/pki/server/cli/user.py
|
|
 |
35e59b |
index c00a1acb50..c5c8d52956 100644
|
|
 |
35e59b |
--- a/base/server/python/pki/server/cli/user.py
|
|
 |
35e59b |
+++ b/base/server/python/pki/server/cli/user.py
|
|
 |
35e59b |
@@ -47,6 +47,7 @@ class UserAddCLI(pki.cli.CLI):
|
|
 |
35e59b |
print(' --full-name <full name> Full name')
|
|
 |
35e59b |
print(' --email <email> Email')
|
|
 |
35e59b |
print(' --password <password> Password')
|
|
 |
35e59b |
+ print(' --password-file <path> Password file')
|
|
 |
35e59b |
print(' --phone <phone> Phone')
|
|
 |
35e59b |
print(' --type <type> Type')
|
|
 |
35e59b |
print(' --state <state> State')
|
|
 |
35e59b |
@@ -59,7 +60,8 @@ class UserAddCLI(pki.cli.CLI):
|
|
 |
35e59b |
def execute(self, argv):
|
|
 |
35e59b |
try:
|
|
 |
35e59b |
opts, args = getopt.gnu_getopt(argv, 'i:v', [
|
|
 |
35e59b |
- 'instance=', 'full-name=', 'email=', 'password=',
|
|
 |
35e59b |
+ 'instance=', 'full-name=', 'email=',
|
|
 |
35e59b |
+ 'password=', 'password-file=',
|
|
 |
35e59b |
'phone=', 'type=', 'state=', 'tps-profiles=',
|
|
 |
35e59b |
'verbose', 'debug', 'help'])
|
|
 |
35e59b |
|
|
 |
35e59b |
@@ -73,6 +75,7 @@ class UserAddCLI(pki.cli.CLI):
|
|
 |
35e59b |
full_name = None
|
|
 |
35e59b |
email = None
|
|
 |
35e59b |
password = None
|
|
 |
35e59b |
+ password_file = None
|
|
 |
35e59b |
phone = None
|
|
 |
35e59b |
user_type = None
|
|
 |
35e59b |
state = None
|
|
 |
35e59b |
@@ -91,6 +94,9 @@ class UserAddCLI(pki.cli.CLI):
|
|
 |
35e59b |
elif o == '--password':
|
|
 |
35e59b |
password = a
|
|
 |
35e59b |
|
|
 |
35e59b |
+ elif o == '--password-file':
|
|
 |
35e59b |
+ password_file = a
|
|
 |
35e59b |
+
|
|
 |
35e59b |
elif o == '--phone':
|
|
 |
35e59b |
phone = a
|
|
 |
35e59b |
|
|
 |
35e59b |
@@ -149,6 +155,7 @@ class UserAddCLI(pki.cli.CLI):
|
|
 |
35e59b |
full_name=full_name,
|
|
 |
35e59b |
email=email,
|
|
 |
35e59b |
password=password,
|
|
 |
35e59b |
+ password_file=password_file,
|
|
 |
35e59b |
phone=phone,
|
|
 |
35e59b |
user_type=user_type,
|
|
 |
35e59b |
tps_profiles=tps_profiles,
|
|
 |
35e59b |
diff --git a/base/server/python/pki/server/deployment/__init__.py b/base/server/python/pki/server/deployment/__init__.py
|
|
 |
35e59b |
index 347ab1acdd..6d5f083b47 100644
|
|
 |
35e59b |
--- a/base/server/python/pki/server/deployment/__init__.py
|
|
 |
35e59b |
+++ b/base/server/python/pki/server/deployment/__init__.py
|
|
 |
35e59b |
@@ -373,6 +373,8 @@ class PKIDeployer:
|
|
 |
35e59b |
|
|
 |
35e59b |
response = client.setupAdmin(request)
|
|
 |
35e59b |
|
|
 |
35e59b |
+ # Run the command as current user such that
|
|
 |
35e59b |
+ # it can read the temporary password file.
|
|
 |
35e59b |
subsystem.add_user(
|
|
 |
35e59b |
uid,
|
|
 |
35e59b |
full_name=full_name,
|
|
 |
35e59b |
@@ -380,7 +382,8 @@ class PKIDeployer:
|
|
 |
35e59b |
password=password,
|
|
 |
35e59b |
user_type='adminType',
|
|
 |
35e59b |
state='1',
|
|
 |
35e59b |
- tps_profiles=tps_profiles)
|
|
 |
35e59b |
+ tps_profiles=tps_profiles,
|
|
 |
35e59b |
+ as_current_user=True)
|
|
 |
35e59b |
|
|
 |
35e59b |
admin_groups = subsystem.config['preop.admin.group']
|
|
 |
35e59b |
groups = [x.strip() for x in admin_groups.split(',')]
|
|
 |
35e59b |
diff --git a/base/server/python/pki/server/subsystem.py b/base/server/python/pki/server/subsystem.py
|
|
 |
35e59b |
index a3ed0c7f3a..41d8d67c2e 100644
|
|
 |
35e59b |
--- a/base/server/python/pki/server/subsystem.py
|
|
 |
35e59b |
+++ b/base/server/python/pki/server/subsystem.py
|
|
 |
35e59b |
@@ -1335,54 +1335,66 @@ class PKISubsystem(object):
|
|
 |
35e59b |
full_name=None,
|
|
 |
35e59b |
email=None,
|
|
 |
35e59b |
password=None,
|
|
 |
35e59b |
+ password_file=None,
|
|
 |
35e59b |
phone=None,
|
|
 |
35e59b |
user_type=None,
|
|
 |
35e59b |
state=None,
|
|
 |
35e59b |
tps_profiles=None,
|
|
 |
35e59b |
as_current_user=False):
|
|
 |
35e59b |
|
|
 |
35e59b |
- cmd = [self.name + '-user-add']
|
|
 |
35e59b |
+ tmpdir = tempfile.mkdtemp()
|
|
 |
35e59b |
|
|
 |
35e59b |
- if full_name:
|
|
 |
35e59b |
- cmd.append('--full-name')
|
|
 |
35e59b |
- cmd.append(full_name)
|
|
 |
35e59b |
+ try:
|
|
 |
35e59b |
+ if password and not password_file:
|
|
 |
35e59b |
+ password_file = os.path.join(tmpdir, 'password.txt')
|
|
 |
35e59b |
+ with open(password_file, 'w') as f:
|
|
 |
35e59b |
+ f.write(password)
|
|
 |
35e59b |
|
|
 |
35e59b |
- if email:
|
|
 |
35e59b |
- cmd.append('--email')
|
|
 |
35e59b |
- cmd.append(email)
|
|
 |
35e59b |
+ cmd = [self.name + '-user-add']
|
|
 |
35e59b |
|
|
 |
35e59b |
- if password:
|
|
 |
35e59b |
- cmd.append('--password')
|
|
 |
35e59b |
- cmd.append(password)
|
|
 |
35e59b |
+ if full_name:
|
|
 |
35e59b |
+ cmd.append('--full-name')
|
|
 |
35e59b |
+ cmd.append(full_name)
|
|
 |
35e59b |
|
|
 |
35e59b |
- if phone:
|
|
 |
35e59b |
- cmd.append('--phone')
|
|
 |
35e59b |
- cmd.append(phone)
|
|
 |
35e59b |
+ if email:
|
|
 |
35e59b |
+ cmd.append('--email')
|
|
 |
35e59b |
+ cmd.append(email)
|
|
 |
35e59b |
|
|
 |
35e59b |
- if user_type:
|
|
 |
35e59b |
- cmd.append('--type')
|
|
 |
35e59b |
- cmd.append(user_type)
|
|
 |
35e59b |
+ if password_file:
|
|
 |
35e59b |
+ cmd.append('--password-file')
|
|
 |
35e59b |
+ cmd.append(password_file)
|
|
 |
35e59b |
|
|
 |
35e59b |
- if state:
|
|
 |
35e59b |
- cmd.append('--state')
|
|
 |
35e59b |
- cmd.append(state)
|
|
 |
35e59b |
+ if phone:
|
|
 |
35e59b |
+ cmd.append('--phone')
|
|
 |
35e59b |
+ cmd.append(phone)
|
|
 |
35e59b |
|
|
 |
35e59b |
- if tps_profiles:
|
|
 |
35e59b |
- cmd.append('--tps-profiles')
|
|
 |
35e59b |
- cmd.append(','.join(tps_profiles))
|
|
 |
35e59b |
+ if user_type:
|
|
 |
35e59b |
+ cmd.append('--type')
|
|
 |
35e59b |
+ cmd.append(user_type)
|
|
 |
35e59b |
|
|
 |
35e59b |
- if logger.isEnabledFor(logging.DEBUG):
|
|
 |
35e59b |
- cmd.append('--debug')
|
|
 |
35e59b |
+ if state:
|
|
 |
35e59b |
+ cmd.append('--state')
|
|
 |
35e59b |
+ cmd.append(state)
|
|
 |
35e59b |
|
|
 |
35e59b |
- elif logger.isEnabledFor(logging.INFO):
|
|
 |
35e59b |
- cmd.append('--verbose')
|
|
 |
35e59b |
+ if tps_profiles:
|
|
 |
35e59b |
+ cmd.append('--tps-profiles')
|
|
 |
35e59b |
+ cmd.append(','.join(tps_profiles))
|
|
 |
35e59b |
|
|
 |
35e59b |
- cmd.append(user_id)
|
|
 |
35e59b |
+ if logger.isEnabledFor(logging.DEBUG):
|
|
 |
35e59b |
+ cmd.append('--debug')
|
|
 |
35e59b |
|
|
 |
35e59b |
- self.run(
|
|
 |
35e59b |
- cmd,
|
|
 |
35e59b |
- as_current_user=as_current_user,
|
|
 |
35e59b |
- capture_output=True)
|
|
 |
35e59b |
+ elif logger.isEnabledFor(logging.INFO):
|
|
 |
35e59b |
+ cmd.append('--verbose')
|
|
 |
35e59b |
+
|
|
 |
35e59b |
+ cmd.append(user_id)
|
|
 |
35e59b |
+
|
|
 |
35e59b |
+ self.run(
|
|
 |
35e59b |
+ cmd,
|
|
 |
35e59b |
+ as_current_user=as_current_user,
|
|
 |
35e59b |
+ capture_output=True)
|
|
 |
35e59b |
+
|
|
 |
35e59b |
+ finally:
|
|
 |
35e59b |
+ shutil.rmtree(tmpdir)
|
|
 |
35e59b |
|
|
 |
35e59b |
def modify_user(self, user_id, add_see_also=None, del_see_also=None,
|
|
 |
35e59b |
as_current_user=False):
|
|
 |
35e59b |
diff --git a/base/server/src/org/dogtagpki/server/cli/SubsystemUserAddCLI.java b/base/server/src/org/dogtagpki/server/cli/SubsystemUserAddCLI.java
|
|
 |
35e59b |
index 5a385c359f..04d68de758 100644
|
|
 |
35e59b |
--- a/base/server/src/org/dogtagpki/server/cli/SubsystemUserAddCLI.java
|
|
 |
35e59b |
+++ b/base/server/src/org/dogtagpki/server/cli/SubsystemUserAddCLI.java
|
|
 |
35e59b |
@@ -6,6 +6,8 @@
|
|
 |
35e59b |
package org.dogtagpki.server.cli;
|
|
 |
35e59b |
|
|
 |
35e59b |
import java.io.File;
|
|
 |
35e59b |
+import java.nio.file.Files;
|
|
 |
35e59b |
+import java.nio.file.Paths;
|
|
 |
35e59b |
import java.util.Arrays;
|
|
 |
35e59b |
import java.util.List;
|
|
 |
35e59b |
|
|
 |
35e59b |
@@ -60,6 +62,10 @@ public class SubsystemUserAddCLI extends CommandCLI {
|
|
 |
35e59b |
option.setArgName("password");
|
|
 |
35e59b |
options.addOption(option);
|
|
 |
35e59b |
|
|
 |
35e59b |
+ option = new Option(null, "password-file", true, "Password file");
|
|
 |
35e59b |
+ option.setArgName("path");
|
|
 |
35e59b |
+ options.addOption(option);
|
|
 |
35e59b |
+
|
|
 |
35e59b |
option = new Option(null, "phone", true, "Phone");
|
|
 |
35e59b |
option.setArgName("phone");
|
|
 |
35e59b |
options.addOption(option);
|
|
 |
35e59b |
@@ -95,11 +101,16 @@ public class SubsystemUserAddCLI extends CommandCLI {
|
|
 |
35e59b |
|
|
 |
35e59b |
String email = cmd.getOptionValue("email");
|
|
 |
35e59b |
String password = cmd.getOptionValue("password");
|
|
 |
35e59b |
+ String passwordFile = cmd.getOptionValue("password-file");
|
|
 |
35e59b |
String phone = cmd.getOptionValue("phone");
|
|
 |
35e59b |
String type = cmd.getOptionValue("type");
|
|
 |
35e59b |
String state = cmd.getOptionValue("state");
|
|
 |
35e59b |
String tpsProfiles = cmd.getOptionValue("tps-profiles");
|
|
 |
35e59b |
|
|
 |
35e59b |
+ if (passwordFile != null) {
|
|
 |
35e59b |
+ password = new String(Files.readAllBytes(Paths.get(passwordFile)), "UTF-8").trim();
|
|
 |
35e59b |
+ }
|
|
 |
35e59b |
+
|
|
 |
35e59b |
String catalinaBase = System.getProperty("catalina.base");
|
|
 |
35e59b |
|
|
 |
35e59b |
TomcatJSS tomcatjss = TomcatJSS.getInstance();
|
|
 |
35e59b |
--
|
|
 |
35e59b |
2.30.2
|
|
 |
35e59b |
|