* [LTP] [PATCH v3 0/4] tst_sudo.c, ima_{conditionals, measurements}.sh enhancements
@ 2025-11-27 8:26 Petr Vorel
2025-11-27 8:26 ` [LTP] [PATCH v3 1/4] shell: Add tst_sudo.c helper Petr Vorel
` (3 more replies)
0 siblings, 4 replies; 10+ messages in thread
From: Petr Vorel @ 2025-11-27 8:26 UTC (permalink / raw)
To: ltp; +Cc: selinux, linux-integrity
From: Petr Vorel <petr.vorel@gmail.com>
Changes v2->v3:
Rebased due conflict when 69b28f1f78 ("shell: Add support for runtime")
was merged.
Links to v2:
https://lore.kernel.org/ltp/20251121152111.10419-1-pvorel@suse.cz/
https://patchwork.ozlabs.org/project/ltp/list/?series=483104&state=*
Changes v1->v2:
Main change is implementing LTP binary tst_sudo.c as suggested by Jan
Stancek [1] instead of creating new user.
Links to v1:
https://lore.kernel.org/ltp/20251002083701.315334-1-pvorel@suse.cz/
https://patchwork.ozlabs.org/project/ltp/list/?series=476004&state=*
[1] https://lore.kernel.org/ltp/CAASaF6yjdrLLVnehESx1TjsrB_z48nmN_2i585GPfkG3Vvg15Q@mail.gmail.com/
Petr Vorel (4):
shell: Add tst_sudo.c helper
tst_test.sh: Add TST_USR_{G,U}ID variables
ima_{conditionals,measurements}.sh: Use tst_sudo
ima_conditionals.sh: Split test by request
doc/users/setup_tests.rst | 4 +
runtest/ima | 5 +-
.../integrity/ima/tests/ima_conditionals.sh | 78 +++++++++++--------
.../integrity/ima/tests/ima_measurements.sh | 11 +--
testcases/lib/.gitignore | 1 +
testcases/lib/Makefile | 2 +-
testcases/lib/tst_sudo.c | 51 ++++++++++++
testcases/lib/tst_test.sh | 6 +-
8 files changed, 115 insertions(+), 43 deletions(-)
create mode 100644 testcases/lib/tst_sudo.c
--
2.51.0
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 10+ messages in thread
* [LTP] [PATCH v3 1/4] shell: Add tst_sudo.c helper
2025-11-27 8:26 [LTP] [PATCH v3 0/4] tst_sudo.c, ima_{conditionals, measurements}.sh enhancements Petr Vorel
@ 2025-11-27 8:26 ` Petr Vorel
2025-11-27 11:57 ` Li Wang via ltp
2025-11-27 8:26 ` [LTP] [PATCH v3 2/4] tst_test.sh: Add TST_USR_{G,U}ID variables Petr Vorel
` (2 subsequent siblings)
3 siblings, 1 reply; 10+ messages in thread
From: Petr Vorel @ 2025-11-27 8:26 UTC (permalink / raw)
To: ltp; +Cc: selinux, linux-integrity
It will be used in LTP IMA tests. Not only it removes external
dependency, but also fixes problem when 'nobody' user is not possible to
use due using /usr/sbin/nologin shell.
Suggested-by: Jan Stancek <jstancek@redhat.com>
Signed-off-by: Petr Vorel <pvorel@suse.cz>
---
doc/users/setup_tests.rst | 4 ++++
testcases/lib/.gitignore | 1 +
testcases/lib/Makefile | 2 +-
testcases/lib/tst_sudo.c | 50 +++++++++++++++++++++++++++++++++++++++
4 files changed, 56 insertions(+), 1 deletion(-)
create mode 100644 testcases/lib/tst_sudo.c
diff --git a/doc/users/setup_tests.rst b/doc/users/setup_tests.rst
index 38976f3b0a..9c49852830 100644
--- a/doc/users/setup_tests.rst
+++ b/doc/users/setup_tests.rst
@@ -71,6 +71,10 @@ users.
* - LTP_IMA_LOAD_POLICY
- Load IMA example policy, see :master:`testcases/kernel/security/integrity/ima/README.md`.
+ * - LTP_USR_UID, LTP_USR_GID
+ - Set UID and GID of ``nobody`` user for :doc:`../developers/api_shell_tests`,
+ see :master:`testcases/lib/tst_sudo.c`.
+
* - LTP_VIRT_OVERRIDE
- Overrides virtual machine detection in the test library. Setting it to
empty string, tells the library that system is not a virtual machine.
diff --git a/testcases/lib/.gitignore b/testcases/lib/.gitignore
index 19d7c67bbe..785d638cba 100644
--- a/testcases/lib/.gitignore
+++ b/testcases/lib/.gitignore
@@ -26,3 +26,4 @@
/tst_res_
/tst_run_shell
/tst_remaining_runtime
+/tst_sudo
diff --git a/testcases/lib/Makefile b/testcases/lib/Makefile
index 2309a42a3d..9be9946057 100644
--- a/testcases/lib/Makefile
+++ b/testcases/lib/Makefile
@@ -17,6 +17,6 @@ MAKE_TARGETS := tst_sleep tst_random tst_checkpoint tst_rod tst_kvcmp\
tst_get_median tst_hexdump tst_get_free_pids tst_timeout_kill\
tst_check_kconfigs tst_cgctl tst_fsfreeze tst_ns_create tst_ns_exec\
tst_ns_ifmove tst_lockdown_enabled tst_secureboot_enabled tst_res_\
- tst_run_shell tst_remaining_runtime
+ tst_run_shell tst_remaining_runtime tst_sudo
include $(top_srcdir)/include/mk/generic_trunk_target.mk
diff --git a/testcases/lib/tst_sudo.c b/testcases/lib/tst_sudo.c
new file mode 100644
index 0000000000..e8d5d8dd9d
--- /dev/null
+++ b/testcases/lib/tst_sudo.c
@@ -0,0 +1,50 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2025 Petr Vorel <pvorel@suse.cz>
+ */
+
+#define LTP_USR_UID 65534
+#define LTP_USR_GID 65534
+
+#define TST_NO_DEFAULT_MAIN
+#include "tst_test.h"
+
+static void print_help(void)
+{
+ fprintf(stderr, "Usage: %s cmd [args] ...\n", __FILE__);
+ fprintf(stderr, "Usage: %s cmd [-h] print help\n\n", __FILE__);
+
+ fprintf(stderr, "Environment Variables\n");
+ fprintf(stderr, "LTP_USR_UID: UID of 'nobody' user, defaults %d\n",
+ LTP_USR_UID);
+ fprintf(stderr, "LTP_USR_GID: GID of 'nobody' user, defaults %d\n",
+ LTP_USR_GID);
+}
+
+int main(int argc, char *argv[])
+{
+ if (argc < 2 || !strcmp(argv[1], "-h")) {
+ print_help();
+ return 1;
+ }
+
+ unsigned uid = LTP_USR_UID, gid = LTP_USR_GID;
+
+ char *uid_env = getenv(TST_TO_STR_(LTP_USR_UID));
+ char *gid_env = getenv(TST_TO_STR_(LTP_USR_GID));
+
+ if (uid_env)
+ uid = SAFE_STRTOL(uid_env, 1, INT_MAX);
+
+ if (gid_env)
+ gid = SAFE_STRTOL(gid_env, 1, INT_MAX);
+
+ tst_res(TINFO, "UID: %d, GID: %d", uid, gid);
+ SAFE_SETGROUPS(0, NULL);
+ SAFE_SETRESGID(gid, gid, gid);
+ SAFE_SETRESUID(uid, uid, uid);
+
+ SAFE_CMD((const char * const *)&argv[1], NULL, NULL);
+
+ return 0;
+}
--
2.51.0
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [LTP] [PATCH v3 2/4] tst_test.sh: Add TST_USR_{G,U}ID variables
2025-11-27 8:26 [LTP] [PATCH v3 0/4] tst_sudo.c, ima_{conditionals, measurements}.sh enhancements Petr Vorel
2025-11-27 8:26 ` [LTP] [PATCH v3 1/4] shell: Add tst_sudo.c helper Petr Vorel
@ 2025-11-27 8:26 ` Petr Vorel
2025-11-27 8:26 ` [LTP] [PATCH v3 3/4] ima_{conditionals, measurements}.sh: Use tst_sudo Petr Vorel
2025-11-27 8:26 ` [LTP] [PATCH v3 4/4] ima_conditionals.sh: Split test by request Petr Vorel
3 siblings, 0 replies; 10+ messages in thread
From: Petr Vorel @ 2025-11-27 8:26 UTC (permalink / raw)
To: ltp; +Cc: selinux, linux-integrity
Add TST_USR_{G,U}ID variables with the default values from tst_sudo.c.
These can be used as a default values for tests which use tst_sudo and
need to know UID/GID for other commands.
It will be used in LTP IMA tests.
Signed-off-by: Petr Vorel <pvorel@suse.cz>
---
testcases/lib/tst_sudo.c | 1 +
testcases/lib/tst_test.sh | 6 +++++-
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/testcases/lib/tst_sudo.c b/testcases/lib/tst_sudo.c
index e8d5d8dd9d..e937828273 100644
--- a/testcases/lib/tst_sudo.c
+++ b/testcases/lib/tst_sudo.c
@@ -3,6 +3,7 @@
* Copyright (c) 2025 Petr Vorel <pvorel@suse.cz>
*/
+/* update also tst_test.sh */
#define LTP_USR_UID 65534
#define LTP_USR_GID 65534
diff --git a/testcases/lib/tst_test.sh b/testcases/lib/tst_test.sh
index 4be10a4f94..49f282d7c8 100644
--- a/testcases/lib/tst_test.sh
+++ b/testcases/lib/tst_test.sh
@@ -17,6 +17,10 @@ export TST_ITERATIONS=1
export TST_TMPDIR_RHOST=0
export TST_LIB_LOADED=1
+# see testcases/lib/tst_sudo.c
+export TST_USR_UID="${LTP_USR_UID:-65534}"
+export TST_USR_GID="${LTP_USR_GID:-65534}"
+
. tst_ansi_color.sh
. tst_security.sh
@@ -689,7 +693,7 @@ tst_run()
CHECKPOINT_WAKE2|CHECKPOINT_WAKE_AND_WAIT);;
DEV_EXTRA_OPTS|DEV_FS_OPTS|FORMAT_DEVICE|MOUNT_DEVICE);;
SKIP_FILESYSTEMS|SKIP_IN_LOCKDOWN|SKIP_IN_SECUREBOOT);;
- DEVICE_SIZE);;
+ DEVICE_SIZE|USR_UID|USR_GID);;
*) tst_res TWARN "Reserved variable TST_$_tst_i used!";;
esac
done
--
2.51.0
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [LTP] [PATCH v3 3/4] ima_{conditionals, measurements}.sh: Use tst_sudo
2025-11-27 8:26 [LTP] [PATCH v3 0/4] tst_sudo.c, ima_{conditionals, measurements}.sh enhancements Petr Vorel
2025-11-27 8:26 ` [LTP] [PATCH v3 1/4] shell: Add tst_sudo.c helper Petr Vorel
2025-11-27 8:26 ` [LTP] [PATCH v3 2/4] tst_test.sh: Add TST_USR_{G,U}ID variables Petr Vorel
@ 2025-11-27 8:26 ` Petr Vorel
2025-11-27 8:26 ` [LTP] [PATCH v3 4/4] ima_conditionals.sh: Split test by request Petr Vorel
3 siblings, 0 replies; 10+ messages in thread
From: Petr Vorel @ 2025-11-27 8:26 UTC (permalink / raw)
To: ltp; +Cc: selinux, linux-integrity
Replace 'sudo' and 'sg' with 'tst_sudo'.
This not only removes 'sudo' external dependency, but it s required
because new releases of many distros (e.g. Debian, openSUSE Tumbleweed,
SLES, ...) switched shell for 'nobody' user from /bin/bash (or /bin/sh)
to /usr/sbin/nologin. That effectively disables using 'sudo', 'su', 'sg':
ima_conditionals 1 TINFO: verify measuring user files when requested via uid
sudo: Account expired or PAM config lacks an "account" section for sudo, contact your system administrator
sudo: a password is required
Signed-off-by: Petr Vorel <pvorel@suse.cz>
---
.../integrity/ima/tests/ima_conditionals.sh | 13 ++++++-------
.../integrity/ima/tests/ima_measurements.sh | 11 ++---------
2 files changed, 8 insertions(+), 16 deletions(-)
diff --git a/testcases/kernel/security/integrity/ima/tests/ima_conditionals.sh b/testcases/kernel/security/integrity/ima/tests/ima_conditionals.sh
index ba19176039..e290dcdaaa 100755
--- a/testcases/kernel/security/integrity/ima/tests/ima_conditionals.sh
+++ b/testcases/kernel/security/integrity/ima/tests/ima_conditionals.sh
@@ -9,7 +9,7 @@
# gid and fgroup options test kernel commit 40224c41661b ("ima: add gid
# support") from v5.16.
-TST_NEEDS_CMDS="cat chgrp chown id sg sudo"
+TST_NEEDS_CMDS="cat chgrp chown"
TST_SETUP="setup"
TST_CNT=1
@@ -27,8 +27,8 @@ verify_measurement()
local test_file="$PWD/test.txt"
local cmd="cat $test_file > /dev/null"
- local value="$(id -u $user)"
- [ "$request" = 'gid' -o "$request" = 'fgroup' ] && value="$(id -g $user)"
+ local value="$TST_USR_UID"
+ [ "$request" = 'gid' -o "$request" = 'fgroup' ] && value="$TST_USR_GID"
# needs to be checked each run (not in setup)
require_policy_writable
@@ -41,15 +41,14 @@ verify_measurement()
case "$request" in
fgroup)
- chgrp $user $test_file
+ chgrp $TST_USR_GID $test_file
sh -c "$cmd"
;;
fowner)
- chown $user $test_file
+ chown $TST_USR_UID $test_file
sh -c "$cmd"
;;
- gid) sg $user "sh -c '$cmd'";;
- uid) sudo -n -u $user sh -c "$cmd";;
+ gid|uid) tst_sudo sh -c "$cmd";;
*) tst_brk TBROK "Invalid res type '$1'";;
esac
diff --git a/testcases/kernel/security/integrity/ima/tests/ima_measurements.sh b/testcases/kernel/security/integrity/ima/tests/ima_measurements.sh
index 60350f3926..30bfe3e629 100755
--- a/testcases/kernel/security/integrity/ima/tests/ima_measurements.sh
+++ b/testcases/kernel/security/integrity/ima/tests/ima_measurements.sh
@@ -68,30 +68,23 @@ test2()
test3()
{
- local user="nobody"
local dir="$PWD/user"
local file="$dir/test.txt"
local cmd="grep $file $ASCII_MEASUREMENTS"
# Default policy does not measure user files
tst_res TINFO "verify not measuring user files"
- tst_check_cmds sudo || return
if [ "$IMA_MISSING_POLICY_CONTENT" = 1 ]; then
tst_res TCONF "test requires specific policy, try load it with LTP_IMA_LOAD_POLICY=1"
return
fi
- if ! id $user >/dev/null 2>/dev/null; then
- tst_res TCONF "missing system user $user (wrong installation)"
- return
- fi
-
[ -d "$dir" ] || mkdir -m 0700 $dir
- chown $user $dir
+ chown $TST_USR_UID $dir
cd $dir
# need to read file to get updated $ASCII_MEASUREMENTS
- sudo -n -u $user sh -c "echo $(cat /proc/uptime) user file > $file; cat $file > /dev/null"
+ tst_sudo sh -c "echo $(cat /proc/uptime) user file > $file; cat $file > /dev/null"
cd ..
if ! tst_rod "$cmd" 2> /dev/null; then
--
2.51.0
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [LTP] [PATCH v3 4/4] ima_conditionals.sh: Split test by request
2025-11-27 8:26 [LTP] [PATCH v3 0/4] tst_sudo.c, ima_{conditionals, measurements}.sh enhancements Petr Vorel
` (2 preceding siblings ...)
2025-11-27 8:26 ` [LTP] [PATCH v3 3/4] ima_{conditionals, measurements}.sh: Use tst_sudo Petr Vorel
@ 2025-11-27 8:26 ` Petr Vorel
3 siblings, 0 replies; 10+ messages in thread
From: Petr Vorel @ 2025-11-27 8:26 UTC (permalink / raw)
To: ltp; +Cc: selinux, linux-integrity
This helps to run all testcases on systems without CONFIG_IMA_WRITE_POLICY=y
(disabled by default in mainline, therefore disabled for some distros,
e.g. openSUSE Tumbleweed), if SUT reboots.
Signed-off-by: Petr Vorel <pvorel@suse.cz>
---
runtest/ima | 5 +-
.../integrity/ima/tests/ima_conditionals.sh | 67 ++++++++++++-------
2 files changed, 46 insertions(+), 26 deletions(-)
diff --git a/runtest/ima b/runtest/ima
index 01942eefa3..c8d0c6801e 100644
--- a/runtest/ima
+++ b/runtest/ima
@@ -6,5 +6,8 @@ ima_violations ima_violations.sh
ima_keys ima_keys.sh
ima_kexec ima_kexec.sh
ima_selinux ima_selinux.sh
-ima_conditionals ima_conditionals.sh
+ima_conditionals_uid ima_conditionals.sh -r uid
+ima_conditionals_fowner ima_conditionals.sh -r fowner
+ima_conditionals_gid ima_conditionals.sh -r gid
+ima_conditionals_fgroup ima_conditionals.sh -r fgroup
evm_overlay evm_overlay.sh
diff --git a/testcases/kernel/security/integrity/ima/tests/ima_conditionals.sh b/testcases/kernel/security/integrity/ima/tests/ima_conditionals.sh
index e290dcdaaa..8eed0b6a9d 100755
--- a/testcases/kernel/security/integrity/ima/tests/ima_conditionals.sh
+++ b/testcases/kernel/security/integrity/ima/tests/ima_conditionals.sh
@@ -11,35 +11,66 @@
TST_NEEDS_CMDS="cat chgrp chown"
TST_SETUP="setup"
-TST_CNT=1
+TST_OPTS="r:"
+TST_USAGE="usage"
+TST_PARSE_ARGS="parse_args"
+REQUEST="uid"
+
+parse_args()
+{
+ REQUEST="$2"
+}
+
+usage()
+{
+ cat << EOF
+usage: $0 [-r <uid|fowner|gid|fgroup>]
+
+OPTIONS
+-r Specify the request to be measured. One of:
+ uid, fowner, gid, fgroup
+ Default: uid
+EOF
+}
setup()
{
+ case "$REQUEST" in
+ fgroup|fowner|gid|uid)
+ tst_res TINFO "request '$REQUEST'"
+ ;;
+ *) tst_brk TBROK "Invalid -r '$REQUEST', use: -r <uid|fowner|gid|fgroup>";;
+ esac
+
if check_need_signed_policy; then
tst_brk TCONF "policy have to be signed"
fi
}
-verify_measurement()
+test()
{
+ # needs to be checked each run (not in setup)
+ require_policy_writable
+
local request="$1"
- local user="nobody"
local test_file="$PWD/test.txt"
local cmd="cat $test_file > /dev/null"
-
local value="$TST_USR_UID"
- [ "$request" = 'gid' -o "$request" = 'fgroup' ] && value="$TST_USR_GID"
- # needs to be checked each run (not in setup)
- require_policy_writable
+ if [ "$REQUEST" = 'gid' -o "$REQUEST" = 'fgroup' ]; then
+ if tst_kvcmp -lt 5.16; then
+ tst_brk TCONF "gid and fgroup options require kernel 5.16 or newer"
+ fi
+ value="$TST_USR_GID"
+ fi
ROD rm -f $test_file
- tst_res TINFO "verify measuring user files when requested via $request"
- ROD echo "measure $request=$value" \> $IMA_POLICY
- ROD echo "$(cat /proc/uptime) $request test" \> $test_file
+ tst_res TINFO "verify measuring user files when requested via $REQUEST"
+ ROD echo "measure $REQUEST=$value" \> $IMA_POLICY
+ ROD echo "$(cat /proc/uptime) $REQUEST test" \> $test_file
- case "$request" in
+ case "$REQUEST" in
fgroup)
chgrp $TST_USR_GID $test_file
sh -c "$cmd"
@@ -49,24 +80,10 @@ verify_measurement()
sh -c "$cmd"
;;
gid|uid) tst_sudo sh -c "$cmd";;
- *) tst_brk TBROK "Invalid res type '$1'";;
esac
ima_check $test_file
}
-test1()
-{
- verify_measurement uid
- verify_measurement fowner
-
- if tst_kvcmp -lt 5.16; then
- tst_brk TCONF "gid and fgroup options require kernel 5.16 or newer"
- fi
-
- verify_measurement gid
- verify_measurement fgroup
-}
-
. ima_setup.sh
tst_run
--
2.51.0
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [LTP] [PATCH v3 1/4] shell: Add tst_sudo.c helper
2025-11-27 8:26 ` [LTP] [PATCH v3 1/4] shell: Add tst_sudo.c helper Petr Vorel
@ 2025-11-27 11:57 ` Li Wang via ltp
2025-11-27 12:11 ` Li Wang via ltp
0 siblings, 1 reply; 10+ messages in thread
From: Li Wang via ltp @ 2025-11-27 11:57 UTC (permalink / raw)
To: Petr Vorel; +Cc: selinux, linux-integrity, ltp
Hi Petr,
I feel that the filename tst_sudo.c is a bit misleading. The helper doesn’t
replicate sudo behavior (authentication, privilege escalation), it simply
drops from root to a fixed UID/GID before executing a command.
So readers may expect a “sudo-like” elevation wrapper when, however
it’s a privilege-dropping trampoline.
What about renaming it to:
tst_runas.c,
tst_runas_nobody.c, or
tst_drop_privs.c?
On Thu, Nov 27, 2025 at 4:26 PM Petr Vorel <pvorel@suse.cz> wrote:
> It will be used in LTP IMA tests. Not only it removes external
> dependency, but also fixes problem when 'nobody' user is not possible to
> use due using /usr/sbin/nologin shell.
>
> Suggested-by: Jan Stancek <jstancek@redhat.com>
> Signed-off-by: Petr Vorel <pvorel@suse.cz>
> ---
> doc/users/setup_tests.rst | 4 ++++
> testcases/lib/.gitignore | 1 +
> testcases/lib/Makefile | 2 +-
> testcases/lib/tst_sudo.c | 50 +++++++++++++++++++++++++++++++++++++++
> 4 files changed, 56 insertions(+), 1 deletion(-)
> create mode 100644 testcases/lib/tst_sudo.c
>
> diff --git a/doc/users/setup_tests.rst b/doc/users/setup_tests.rst
> index 38976f3b0a..9c49852830 100644
> --- a/doc/users/setup_tests.rst
> +++ b/doc/users/setup_tests.rst
> @@ -71,6 +71,10 @@ users.
> * - LTP_IMA_LOAD_POLICY
> - Load IMA example policy, see
> :master:`testcases/kernel/security/integrity/ima/README.md`.
>
> + * - LTP_USR_UID, LTP_USR_GID
> + - Set UID and GID of ``nobody`` user for
> :doc:`../developers/api_shell_tests`,
> + see :master:`testcases/lib/tst_sudo.c`.
> +
> * - LTP_VIRT_OVERRIDE
> - Overrides virtual machine detection in the test library. Setting
> it to
> empty string, tells the library that system is not a virtual
> machine.
> diff --git a/testcases/lib/.gitignore b/testcases/lib/.gitignore
> index 19d7c67bbe..785d638cba 100644
> --- a/testcases/lib/.gitignore
> +++ b/testcases/lib/.gitignore
> @@ -26,3 +26,4 @@
> /tst_res_
> /tst_run_shell
> /tst_remaining_runtime
> +/tst_sudo
> diff --git a/testcases/lib/Makefile b/testcases/lib/Makefile
> index 2309a42a3d..9be9946057 100644
> --- a/testcases/lib/Makefile
> +++ b/testcases/lib/Makefile
> @@ -17,6 +17,6 @@ MAKE_TARGETS := tst_sleep tst_random
> tst_checkpoint tst_rod tst_kvcmp\
> tst_get_median tst_hexdump tst_get_free_pids
> tst_timeout_kill\
> tst_check_kconfigs tst_cgctl tst_fsfreeze
> tst_ns_create tst_ns_exec\
> tst_ns_ifmove tst_lockdown_enabled
> tst_secureboot_enabled tst_res_\
> - tst_run_shell tst_remaining_runtime
> + tst_run_shell tst_remaining_runtime tst_sudo
>
> include $(top_srcdir)/include/mk/generic_trunk_target.mk
> diff --git a/testcases/lib/tst_sudo.c b/testcases/lib/tst_sudo.c
> new file mode 100644
> index 0000000000..e8d5d8dd9d
> --- /dev/null
> +++ b/testcases/lib/tst_sudo.c
> @@ -0,0 +1,50 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (c) 2025 Petr Vorel <pvorel@suse.cz>
> + */
> +
> +#define LTP_USR_UID 65534
> +#define LTP_USR_GID 65534
> +
> +#define TST_NO_DEFAULT_MAIN
> +#include "tst_test.h"
> +
> +static void print_help(void)
> +{
> + fprintf(stderr, "Usage: %s cmd [args] ...\n", __FILE__);
> + fprintf(stderr, "Usage: %s cmd [-h] print help\n\n", __FILE__);
> +
> + fprintf(stderr, "Environment Variables\n");
> + fprintf(stderr, "LTP_USR_UID: UID of 'nobody' user, defaults %d\n",
> + LTP_USR_UID);
> + fprintf(stderr, "LTP_USR_GID: GID of 'nobody' user, defaults %d\n",
> + LTP_USR_GID);
> +}
> +
> +int main(int argc, char *argv[])
> +{
> + if (argc < 2 || !strcmp(argv[1], "-h")) {
> + print_help();
> + return 1;
> + }
> +
> + unsigned uid = LTP_USR_UID, gid = LTP_USR_GID;
> +
>
> + char *uid_env = getenv(TST_TO_STR_(LTP_USR_UID));
> + char *gid_env = getenv(TST_TO_STR_(LTP_USR_GID));
>
I guess you probably want:
- char *uid_env = getenv(TST_TO_STR_(LTP_USR_UID));
- char *gid_env = getenv(TST_TO_STR_(LTP_USR_GID));
+ char *uid_env = getenv("LTP_USR_UID");
+ char *gid_env = getenv("LTP_USR_GID");
> +
> + if (uid_env)
> + uid = SAFE_STRTOL(uid_env, 1, INT_MAX);
> +
> + if (gid_env)
> + gid = SAFE_STRTOL(gid_env, 1, INT_MAX);
>
If you want to support root privilege here we need to accept 0.
> +
> + tst_res(TINFO, "UID: %d, GID: %d", uid, gid);
> + SAFE_SETGROUPS(0, NULL);
> + SAFE_SETRESGID(gid, gid, gid);
> + SAFE_SETRESUID(uid, uid, uid);
> +
> + SAFE_CMD((const char * const *)&argv[1], NULL, NULL);
> +
> + return 0;
> +}
> --
> 2.51.0
>
>
--
Regards,
Li Wang
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [LTP] [PATCH v3 1/4] shell: Add tst_sudo.c helper
2025-11-27 11:57 ` Li Wang via ltp
@ 2025-11-27 12:11 ` Li Wang via ltp
2025-11-27 12:55 ` Petr Vorel
2025-12-09 13:19 ` Cyril Hrubis
0 siblings, 2 replies; 10+ messages in thread
From: Li Wang via ltp @ 2025-11-27 12:11 UTC (permalink / raw)
To: Petr Vorel; +Cc: selinux, linux-integrity, ltp
On Thu, Nov 27, 2025 at 7:57 PM Li Wang <liwang@redhat.com> wrote:
> Hi Petr,
>
> I feel that the filename tst_sudo.c is a bit misleading. The helper
> doesn’t
> replicate sudo behavior (authentication, privilege escalation), it simply
> drops from root to a fixed UID/GID before executing a command.
>
> So readers may expect a “sudo-like” elevation wrapper when, however
> it’s a privilege-dropping trampoline.
>
> What about renaming it to:
> tst_runas.c,
> tst_runas_nobody.c, or
> tst_drop_privs.c?
>
Personally, I prefer the tst_runas_nody.c because it reflects the
default privilege,
but due it supports the more env so contains "su" maybe better:
tst_su_switch.c, tst_su_cmd.c
--
Regards,
Li Wang
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [LTP] [PATCH v3 1/4] shell: Add tst_sudo.c helper
2025-11-27 12:11 ` Li Wang via ltp
@ 2025-11-27 12:55 ` Petr Vorel
2025-12-09 13:19 ` Cyril Hrubis
1 sibling, 0 replies; 10+ messages in thread
From: Petr Vorel @ 2025-11-27 12:55 UTC (permalink / raw)
To: Li Wang; +Cc: selinux, linux-integrity, ltp
> On Thu, Nov 27, 2025 at 7:57 PM Li Wang <liwang@redhat.com> wrote:
> > Hi Petr,
> > I feel that the filename tst_sudo.c is a bit misleading. The helper
> > doesn’t
> > replicate sudo behavior (authentication, privilege escalation), it simply
> > drops from root to a fixed UID/GID before executing a command.
> > So readers may expect a “sudo-like” elevation wrapper when, however
> > it’s a privilege-dropping trampoline.
Thanks, makes sense.
> > What about renaming it to:
> > tst_runas.c,
> > tst_runas_nobody.c, or
> > tst_drop_privs.c?
> Personally, I prefer the tst_runas_nody.c because it reflects the
> default privilege,
> but due it supports the more env so contains "su" maybe better:
> tst_su_switch.c, tst_su_cmd.c
I'd be ok with tst_su.c, but sure tst_su_cmd.c is ok as well.
I'll wait little longer for feedback from others.
Kind regards,
Petr
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [LTP] [PATCH v3 1/4] shell: Add tst_sudo.c helper
2025-11-27 12:11 ` Li Wang via ltp
2025-11-27 12:55 ` Petr Vorel
@ 2025-12-09 13:19 ` Cyril Hrubis
2025-12-09 18:44 ` Petr Vorel
1 sibling, 1 reply; 10+ messages in thread
From: Cyril Hrubis @ 2025-12-09 13:19 UTC (permalink / raw)
To: Li Wang; +Cc: selinux, linux-integrity, ltp
Hi!
> > I feel that the filename tst_sudo.c is a bit misleading. The helper
> > doesn’t
> > replicate sudo behavior (authentication, privilege escalation), it simply
> > drops from root to a fixed UID/GID before executing a command.
> >
> > So readers may expect a “sudo-like” elevation wrapper when, however
> > it’s a privilege-dropping trampoline.
> >
> > What about renaming it to:
> > tst_runas.c,
> > tst_runas_nobody.c, or
> > tst_drop_privs.c?
> >
>
>
> Personally, I prefer the tst_runas_nody.c because it reflects the
> default privilege,
> but due it supports the more env so contains "su" maybe better:
> tst_su_switch.c, tst_su_cmd.c
Maybe just tst_runas.c I think that 'runas' in the name is probably the
best description.
--
Cyril Hrubis
chrubis@suse.cz
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [LTP] [PATCH v3 1/4] shell: Add tst_sudo.c helper
2025-12-09 13:19 ` Cyril Hrubis
@ 2025-12-09 18:44 ` Petr Vorel
0 siblings, 0 replies; 10+ messages in thread
From: Petr Vorel @ 2025-12-09 18:44 UTC (permalink / raw)
To: Cyril Hrubis; +Cc: selinux, linux-integrity, ltp
> Hi!
> > > I feel that the filename tst_sudo.c is a bit misleading. The helper
> > > doesn’t
> > > replicate sudo behavior (authentication, privilege escalation), it simply
> > > drops from root to a fixed UID/GID before executing a command.
> > > So readers may expect a “sudo-like” elevation wrapper when, however
> > > it’s a privilege-dropping trampoline.
> > > What about renaming it to:
> > > tst_runas.c,
> > > tst_runas_nobody.c, or
> > > tst_drop_privs.c?
> > Personally, I prefer the tst_runas_nody.c because it reflects the
> > default privilege,
> > but due it supports the more env so contains "su" maybe better:
> > tst_su_switch.c, tst_su_cmd.c
> Maybe just tst_runas.c I think that 'runas' in the name is probably the
> best description.
LGTM. I'll send v4.
Kind regards,
Petr
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2025-12-09 18:44 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-11-27 8:26 [LTP] [PATCH v3 0/4] tst_sudo.c, ima_{conditionals, measurements}.sh enhancements Petr Vorel
2025-11-27 8:26 ` [LTP] [PATCH v3 1/4] shell: Add tst_sudo.c helper Petr Vorel
2025-11-27 11:57 ` Li Wang via ltp
2025-11-27 12:11 ` Li Wang via ltp
2025-11-27 12:55 ` Petr Vorel
2025-12-09 13:19 ` Cyril Hrubis
2025-12-09 18:44 ` Petr Vorel
2025-11-27 8:26 ` [LTP] [PATCH v3 2/4] tst_test.sh: Add TST_USR_{G,U}ID variables Petr Vorel
2025-11-27 8:26 ` [LTP] [PATCH v3 3/4] ima_{conditionals, measurements}.sh: Use tst_sudo Petr Vorel
2025-11-27 8:26 ` [LTP] [PATCH v3 4/4] ima_conditionals.sh: Split test by request Petr Vorel
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox