- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试了解用户 ID/有效用户 ID。当我切换到一个用户(在此示例中为 apache)时,我仍然可以向在根 UID 下运行的程序发送 SIGKILL 信号。
输出示例:
[root@devserv ~]# ./testsuid
Real UID = 0
Effective UID = 0
Real GID = 0
Effective GID = 0
Real UID = 0
Effective UID = 102
Real GID = 0
Effective GID = 501
Real UID = 0
Effective UID = 0
Real GID = 0
Effective GID = 0
这里是我正在执行的代码:
[root@devserv ~]# cat test.c
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/file.h>
static uid_t euid, ruid;
static gid_t egid, rgid;
void do_setuid (void) {
int status;
int statusgid;
#ifdef _POSIX_SAVED_IDS
status = setegid (egid);
statusgid = seteuid (euid);
#else
status = setregid (rgid, egid);
statusgid = setreuid (ruid, euid);
#endif
if (status < 0) {
fprintf (stderr, "Couldn't set uid.\n");
exit (status);
}
if (statusgid < 0) {
fprintf (stderr, "Couldn't set gid.\n");
exit (status);
}
}
void undo_setuid (void) {
int status;
#ifdef _POSIX_SAVED_IDS
status = seteuid (ruid);
status = setegid (rgid);
#else
status = setreuid (euid, ruid);
status = setregid (egid, rgid);
#endif
if (status < 0) {
fprintf (stderr, "Couldn't set uid.\n");
exit (status);
}
}
int main(void)
{
ruid = 0;
euid = 102;
rgid = 0;
egid = 501;
undo_setuid ();
printf("Real UID\t= %d\n", getuid());
printf("Effective UID\t= %d\n", geteuid());
printf("Real GID\t= %d\n", getgid());
printf("Effective GID\t= %d\n", getegid());
do_setuid ();
printf("\n\nReal UID\t= %d\n", getuid());
printf("Effective UID\t= %d\n", geteuid());
printf("Real GID\t= %d\n", getgid());
printf("Effective GID\t= %d\n", getegid());
kill(27279, SIGKILL);
undo_setuid();
printf("\n\nReal UID\t= %d\n", getuid());
printf("Effective UID\t= %d\n", geteuid());
printf("Real GID\t= %d\n", getgid());
printf("Effective GID\t= %d\n", getegid());
return EXIT_SUCCESS;
}
strace 对我的 nano 进程的结果:
[root@devserv ~]# strace -p 27279
Process 27279 attached - interrupt to quit
read(0, <unfinished ...>
+++ killed by SIGKILL +++
现在的问题是:
有效 UID 为 102 的进程如何终止以 root 身份运行的进程?
最佳答案
来自 man 2 kill
(强调我的):
For a process to have permission to send a signal it must either be privileged (under Linux: have the CAP_KILL capability), or the real or effective user ID of the sending process must equal the real or saved set-user-ID of the target process.
换句话说,尽管有效 UID 为 102,它的真实 UID 仍为 0,因此它能够向根进程发送 SIGKILL。
关于c - 有效的 UID 对 kill 命令不生效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25245872/
我希望在通过 POST 方法发送数据后文本框消失。但我无法让 Javascript 工作。页面不断重新加载,因此文本框始终存在。 function puff() { if (document.get
我无法让 expand_aliases 在 bash 中生效。我尝试了很多不同的方法,但没有任何效果。 这是一个简单的测试用例: /bin/bash -c 'shopt -s expand_alias
我正在尝试查找 #include 位于 extern C block 内的所有位置。是否可以使用预处理器进行检查?我想在我的头文件中添加类似这样的内容: #ifdef EXTERN_C_IS_IN_E
我们扩展了 UILabel,以便能够为我们应用程序中给定标签类型的所有用途应用标准字体和颜色。例如。 @interface UILabelHeadingBold : UILabel @end 在我们的
案例1 我们正在尝试将自定义样式应用于渲染的 vuetify 元素: .input-group__input { background: red; } 但是没有任何变化。 案
我正在使用 symfony 1.4 和 sfGuardDoctrinePlugin,我已经安装并设置好了,但我遇到以下问题: 如果我以管理员身份登录并更新用户的权限,该用户必须注销然后重新登录才能获得
getElementsByTagName() 有 2 个很棒的特性:速度快且实时。但是,如果我想获得 p strong 怎么办。当然,我可以再次使用 getElementsByTagName() 优化
我有三个文件: spark_mock_dependency.py 提供了一个user() 方法来读取/etc/user, spark_mock.py 用于创建一个 Env 类,它使用 user() 方
我从 samples/bpf/pare_simple.c(来自 Linux 内核树)编译了 BPF 示例,做了非常简单的更改: SEC("simple") int handle_ingress(str
我有一个基本的树结构。容器可以水平滚动。我在所有 上都有正确的填充元素。但是,正确的填充没有生效。我该如何修复它才能生效? ul { height: 100%; margin: 0; p
我目前在使用 Ruby on Rails 上的 Assets 管道时遇到了一些问题。 我正在使用电子商务解决方案 (Spree),在文档中,文档中有这个: [...] you can improve
在我们非常庞大且非常复杂的 AngularJS 应用程序中,我注意到(偶然!)我的主模块设置中有这样一行... application.run(function($rootScope) { w
我发现重写getResources()后app第一次运行的activity也会对后面运行的activity生效,前提是你的手机字体特别大。 例如:执行以下步骤 将手机字体设置为巨无霸 创建两个名为 A
我正在尝试使用 KVO 来观察在我的页面 View Controller 的子内容 View Controller 的 ScrollView 中使用拖动时的更新变化,但是当应用程序启动时,它崩溃了说:
我是一名优秀的程序员,十分优秀!