Blame SOURCES/scap-security-guide-0.1.64-fix_sudoers_defaults-PR_9299.patch

1053e7
From 9243f7615c2656003e4a64c88076d0d660f58580 Mon Sep 17 00:00:00 2001
1053e7
From: =?UTF-8?q?Jan=20=C4=8Cern=C3=BD?= <jcerny@redhat.com>
1053e7
Date: Fri, 5 Aug 2022 12:45:24 +0200
1053e7
Subject: [PATCH] Fix rule sudo_custom_logfile
1053e7
1053e7
- Allow only white space after the Default keyword to avoid
1053e7
  matching words that only start with Default.
1053e7
- If the variable value contains slashes they need to be escaped
1053e7
  because the sed command uses slashes as a separator, otherwise
1053e7
  the sed doesn't replace the wrong line during a remediation.
1053e7
1053e7
Also adds 2 test scenarios.
1053e7
1053e7
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2083109
1053e7
---
1053e7
 .../guide/system/software/sudo/sudo_custom_logfile/rule.yml  | 2 +-
1053e7
 .../sudo/sudo_custom_logfile/tests/broken_defaults.fail.sh   | 4 ++++
1053e7
 .../sudo/sudo_custom_logfile/tests/wrong_logfile.fail.sh     | 4 ++++
1053e7
 shared/templates/sudo_defaults_option/ansible.template       | 2 +-
1053e7
 shared/templates/sudo_defaults_option/bash.template          | 5 +++--
1053e7
 shared/templates/sudo_defaults_option/oval.template          | 2 +-
1053e7
 6 files changed, 14 insertions(+), 5 deletions(-)
1053e7
 create mode 100644 linux_os/guide/system/software/sudo/sudo_custom_logfile/tests/broken_defaults.fail.sh
1053e7
 create mode 100644 linux_os/guide/system/software/sudo/sudo_custom_logfile/tests/wrong_logfile.fail.sh
1053e7
1053e7
diff --git a/linux_os/guide/system/software/sudo/sudo_custom_logfile/rule.yml b/linux_os/guide/system/software/sudo/sudo_custom_logfile/rule.yml
1053e7
index 739f5f14936..94fbaaa33ed 100644
1053e7
--- a/linux_os/guide/system/software/sudo/sudo_custom_logfile/rule.yml
1053e7
+++ b/linux_os/guide/system/software/sudo/sudo_custom_logfile/rule.yml
1053e7
@@ -29,7 +29,7 @@ ocil_clause: 'logfile is not enabled in sudo'
1053e7
 
1053e7
 ocil: |-
1053e7
     To determine if <tt>logfile</tt> has been configured for sudo, run the following command:
1053e7
-    
$ sudo grep -ri "^[\s]*Defaults.*\blogfile\b.*" /etc/sudoers /etc/sudoers.d/
1053e7
+    
$ sudo grep -ri "^[\s]*Defaults\s*\blogfile\b.*" /etc/sudoers /etc/sudoers.d/
1053e7
     The command should return a matching output.
1053e7
 
1053e7
 template:
1053e7
diff --git a/linux_os/guide/system/software/sudo/sudo_custom_logfile/tests/broken_defaults.fail.sh b/linux_os/guide/system/software/sudo/sudo_custom_logfile/tests/broken_defaults.fail.sh
1053e7
new file mode 100644
1053e7
index 00000000000..13ff4559edb
1053e7
--- /dev/null
1053e7
+++ b/linux_os/guide/system/software/sudo/sudo_custom_logfile/tests/broken_defaults.fail.sh
1053e7
@@ -0,0 +1,4 @@
1053e7
+#!/bin/bash
1053e7
+# platform = multi_platform_all
1053e7
+
1053e7
+echo "Defaultsabc logfile=/var/log/sudo.log" >> /etc/sudoers
1053e7
diff --git a/linux_os/guide/system/software/sudo/sudo_custom_logfile/tests/wrong_logfile.fail.sh b/linux_os/guide/system/software/sudo/sudo_custom_logfile/tests/wrong_logfile.fail.sh
1053e7
new file mode 100644
1053e7
index 00000000000..ec24854f0f9
1053e7
--- /dev/null
1053e7
+++ b/linux_os/guide/system/software/sudo/sudo_custom_logfile/tests/wrong_logfile.fail.sh
1053e7
@@ -0,0 +1,4 @@
1053e7
+#!/bin/bash
1053e7
+# platform = multi_platform_all
1053e7
+
1053e7
+echo "Defaults logfile=/var/log/othersudologfile.log" >> /etc/sudoers
1053e7
diff --git a/shared/templates/sudo_defaults_option/ansible.template b/shared/templates/sudo_defaults_option/ansible.template
1053e7
index 094fa430b64..c9e344ec772 100644
1053e7
--- a/shared/templates/sudo_defaults_option/ansible.template
1053e7
+++ b/shared/templates/sudo_defaults_option/ansible.template
1053e7
@@ -8,7 +8,7 @@
1053e7
 - name: Ensure {{{ OPTION }}} is enabled with the appropriate value in /etc/sudoers
1053e7
   lineinfile:
1053e7
     path: /etc/sudoers
1053e7
-    regexp: '^[\s]*Defaults\s(.*)\b{{{ OPTION }}}=[-]?\w+\b(.*)$'
1053e7
+    regexp: '^[\s]*Defaults\s(.*)\b{{{ OPTION }}}=[-]?.+\b(.*)$'
1053e7
     line: 'Defaults \1{{{ OPTION }}}={{ {{{ VARIABLE_NAME }}} }}\2'
1053e7
     validate: /usr/sbin/visudo -cf %s
1053e7
     backrefs: yes
1053e7
diff --git a/shared/templates/sudo_defaults_option/bash.template b/shared/templates/sudo_defaults_option/bash.template
1053e7
index e3563d42db6..e7d962a668d 100644
1053e7
--- a/shared/templates/sudo_defaults_option/bash.template
1053e7
+++ b/shared/templates/sudo_defaults_option/bash.template
1053e7
@@ -9,7 +9,7 @@
1053e7
 {{% endif %}}
1053e7
 if /usr/sbin/visudo -qcf /etc/sudoers; then
1053e7
     cp /etc/sudoers /etc/sudoers.bak
1053e7
-    if ! grep -P '^[\s]*Defaults.*\b{{{ OPTION_REGEX }}}\b.*$' /etc/sudoers; then
1053e7
+    if ! grep -P '^[\s]*Defaults[\s]*\b{{{ OPTION_REGEX }}}\b.*$' /etc/sudoers; then
1053e7
         # sudoers file doesn't define Option {{{ OPTION }}}
1053e7
         echo "Defaults {{{ OPTION_VALUE }}}" >> /etc/sudoers
1053e7
     {{%- if not VARIABLE_NAME %}}
1053e7
@@ -21,7 +21,8 @@ if /usr/sbin/visudo -qcf /etc/sudoers; then
1053e7
             {{% if '/' in OPTION %}}
1053e7
             {{{ raise("OPTION (" + OPTION + ") uses sed path separator (/) in " + rule_id) }}}
1053e7
             {{% endif %}}
1053e7
-            sed -Ei "s/(^[\s]*Defaults.*\b{{{ OPTION }}}=)[-]?\w+(\b.*$)/\1{{{ '${' ~ VARIABLE_NAME ~ '}' }}}\2/" /etc/sudoers
1053e7
+            escaped_variable={{{ "${" ~ VARIABLE_NAME ~ "//$'/'/$'\/'}" }}}
1053e7
+            sed -Ei "s/(^[\s]*Defaults.*\b{{{ OPTION }}}=)[-]?.+(\b.*$)/\1$escaped_variable\2/" /etc/sudoers
1053e7
         fi
1053e7
     fi
1053e7
     {{% endif %}}
1053e7
diff --git a/shared/templates/sudo_defaults_option/oval.template b/shared/templates/sudo_defaults_option/oval.template
1053e7
index c0d81c95093..a9636a7204a 100644
1053e7
--- a/shared/templates/sudo_defaults_option/oval.template
1053e7
+++ b/shared/templates/sudo_defaults_option/oval.template
1053e7
@@ -13,7 +13,7 @@
1053e7
   </ind:textfilecontent54_test>
1053e7
   <ind:textfilecontent54_object id="object_{{{ OPTION }}}_sudoers" version="1">
1053e7
     <ind:filepath operation="pattern match">^/etc/sudoers(|\.d/.*)$</ind:filepath>
1053e7
-    <ind:pattern operation="pattern match">^[\s]*Defaults.*\b{{{ OPTION_REGEX }}}.*$</ind:pattern>
1053e7
+    <ind:pattern operation="pattern match">^[\s]*Defaults[\s]*\b{{{ OPTION_REGEX }}}.*$</ind:pattern>
1053e7
     <ind:instance datatype="int" operation="greater than or equal" >1</ind:instance>
1053e7
   </ind:textfilecontent54_object>
1053e7