- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我发现在 Linux 上,通过自己调用 rt_sigqueue
系统调用,我可以将我喜欢的任何内容放入 si_uid
和 si_pid
字段,调用成功并愉快地传递了不正确的值。自然地,发送信号的 uid 限制提供了一些防止这种欺骗的保护,但我担心依赖这些信息可能是危险的。关于我可以阅读的主题有什么好的文档吗?为什么 Linux 允许调用者指定 siginfo
参数而不是在内核空间中生成它们这一明显不正确的行为?这看起来很荒谬,尤其是因为额外的系统为了在用户空间中获取 uid/gid,可能需要调用(因此需要性能成本)。
编辑:根据我对 POSIX 的阅读(重点是我加的):
If si_code is SI_USER or SI_QUEUE, [XSI] or any value less than or equal to 0, then the signal was generated by a process and si_pid and si_uid shall be set to the process ID and the real user ID of the sender, respectively.
我认为 Linux 的这种行为是不合规的,是一个严重的错误。
最佳答案
您引用的 POSIX 页面的那部分还列出了 si-code
的含义,其含义如下:
SI_QUEUE
The signal was sent by the sigqueue() function.
该部分接着说:
If the signal was not generated by one of the functions or events listed above,
si_code
shall be set either to one of the signal-specific values described in XBD , or to an implementation-defined value that is not equal to any of the values defined above.
如果只有 sigqueue()
函数使用 SI_QUEUE
,则不会违反任何内容。您的场景涉及使用 SI_QUEUE
的 sigqueue()
函数以外的代码不是 POSIX 定义的库函数)被允许进行具有某些特征的系统调用。我相信答案是否定的。
截至太平洋标准时间 2011 年 3 月 26 日 14:00 的编辑:
此编辑是为了回应八小时前 R.. 的评论,因为该页面不允许我留下足够多的评论:
我认为你基本上是对的。但是系统要么符合 POSIX,要么不符合。如果非库函数执行的系统调用导致 uid、pid 和“si_code”的不合规组合,那么我引用的第二条语句清楚地表明调用本身不合规。人们可以用两种方式来解释这一点。一种方式是:“如果用户违反了这条规则,那么他就会使系统不合规。”但你是对的,我认为那很愚蠢。当任何非特权用户都可以使其不合规时,系统有什么好处?正如我所看到的,修复是以某种方式让系统知道它不是库'sigqueue()'进行系统调用,然后内核本身应该将'si_code'设置为'SI_QUEUE'以外的东西,并离开您设置的 uid 和 pid。在我看来,你应该向内核人员提出这个问题。然而,他们可能有困难;我不知道他们有什么安全的方法来检测系统调用是否由特定的库函数进行,看看库是如何运行的。几乎根据定义,它们只是系统调用的便利包装器。这可能就是他们采取的立场,我知道这会令人失望。
(大量)截至太平洋标准时间 2011 年 3 月 26 日 18:00 的编辑:
同样是因为评论长度的限制。
这是对 R.. 大约一个小时前的评论的回应。
我对系统调用主题有点陌生,所以请多多包涵。
“内核 sysqueue
系统调用”是指 `__NR_rt_sigqueueinfo' 调用吗?这是我在执行此操作时发现的唯一一个:
grep -Ri 'NR.*queue' /usr/include
如果是这样,我想我没有理解您原来的观点。内核将允许(非 root)我使用带有伪造的 pid 和 uid 的 SI-QUEUE
而不会出错。如果我这样编码发送方:
#include <sys/syscall.h>
#include <sys/types.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc,
char **argv
)
{
long john_silver;
siginfo_t my_siginfo;
if(argc!=2)
{
fprintf(stderr,"missing pid argument\n");
exit(1);
}
john_silver=strtol(argv[1],NULL,0);
if(kill(john_silver,SIGUSR1))
{
fprintf(stderr,"kill() fail\n");
exit(1);
}
sleep(1);
my_siginfo.si_signo=SIGUSR1;
my_siginfo.si_code=SI_QUEUE;
my_siginfo.si_pid=getpid();
my_siginfo.si_uid=getuid();
my_siginfo.si_value.sival_int=41;
if(syscall(__NR_rt_sigqueueinfo,john_silver,SIGUSR1,&my_siginfo))
{
perror("syscall()");
exit(1);
}
sleep(1);
my_siginfo.si_signo=SIGUSR2;
my_siginfo.si_code=SI_QUEUE;
my_siginfo.si_pid=getpid()+1;
my_siginfo.si_uid=getuid()+1;
my_siginfo.si_value.sival_int=42;
if(syscall(__NR_rt_sigqueueinfo,john_silver,SIGUSR2,&my_siginfo))
{
perror("syscall()");
exit(1);
}
return 0;
} /* main() */
接收端这样编码:
#include <sys/types.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int signaled_flag=0;
siginfo_t received_information;
void
my_handler(int signal_number,
siginfo_t *signal_information,
void *we_ignore_this
)
{
memmove(&received_information,
signal_information,
sizeof(received_information)
);
signaled_flag=1;
} /* my_handler() */
/*--------------------------------------------------------------------------*/
int
main(void)
{
pid_t myself;
struct sigaction the_action;
myself=getpid();
printf("signal receiver is process %d\n",myself);
the_action.sa_sigaction=my_handler;
sigemptyset(&the_action.sa_mask);
the_action.sa_flags=SA_SIGINFO;
if(sigaction(SIGUSR1,&the_action,NULL))
{
fprintf(stderr,"sigaction(SIGUSR1) fail\n");
exit(1);
}
if(sigaction(SIGUSR2,&the_action,NULL))
{
fprintf(stderr,"sigaction(SIGUSR2) fail\n");
exit(1);
}
for(;;)
{
while(!signaled_flag)
{
sleep(1);
}
printf("si_signo: %d\n",received_information.si_signo);
printf("si_pid : %d\n",received_information.si_pid );
printf("si_uid : %d\n",received_information.si_uid );
if(received_information.si_signo==SIGUSR2)
{
break;
}
signaled_flag=0;
}
return 0;
} /* main() */
然后我可以这样运行(非 root)接收方:
wally:~/tmp/20110326$ receive
signal receiver is process 9023
si_signo: 10
si_pid : 9055
si_uid : 4000
si_signo: 10
si_pid : 9055
si_uid : 4000
si_signo: 12
si_pid : 9056
si_uid : 4001
wally:~/tmp/20110326$
在发送端看到这个(非根):
wally:~/tmp/20110326$ send 9023
wally:~/tmp/20110326$
如你所见,第三个事件欺骗了pid和uid。这不是你最初反对的吗?看不到 EINVAL
或 EPERM
。我想我很困惑。
关于c - siginfo 中的数据可信吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5267005/
初学者 android 问题。好的,我已经成功写入文件。例如。 //获取文件名 String filename = getResources().getString(R.string.filename
我已经将相同的图像保存到/data/data/mypackage/img/中,现在我想显示这个全屏,我曾尝试使用 ACTION_VIEW 来显示 android 标准程序,但它不是从/data/dat
我正在使用Xcode 9,Swift 4。 我正在尝试使用以下代码从URL在ImageView中显示图像: func getImageFromUrl(sourceUrl: String) -> UII
我的 Ubuntu 安装 genymotion 有问题。主要是我无法调试我的数据库,因为通过 eclipse 中的 DBMS 和 shell 中的 adb 我无法查看/data/文件夹的内容。没有显示
我正在尝试用 PHP 发布一些 JSON 数据。但是出了点问题。 这是我的 html -- {% for x in sets %}
我观察到两种方法的结果不同。为什么是这样?我知道 lm 上发生了什么,但无法弄清楚 tslm 上发生了什么。 > library(forecast) > set.seed(2) > tts lm(t
我不确定为什么会这样!我有一个由 spring data elasticsearch 和 spring data jpa 使用的类,但是当我尝试运行我的应用程序时出现错误。 Error creatin
在 this vega 图表,如果我下载并转换 flare-dependencies.json使用以下 jq 到 csv命令, jq -r '(map(keys) | add | unique) as
我正在提交一个项目,我必须在其中创建一个带有表的 mysql 数据库。一切都在我这边进行,所以我只想检查如何将我所有的压缩文件发送给使用不同计算机的人。基本上,我如何为另一台计算机创建我的数据库文件,
我有一个应用程序可以将文本文件写入内部存储。我想仔细看看我的电脑。 我运行了 Toast.makeText 来显示路径,它说:/数据/数据/我的包 但是当我转到 Android Studio 的 An
我喜欢使用 Genymotion 模拟器以如此出色的速度加载 Android。它有非常好的速度,但仍然有一些不稳定的性能。 如何从 Eclipse 中的文件资源管理器访问 Genymotion 模拟器
我需要更改 Silverlight 中文本框的格式。数据通过 MVVM 绑定(bind)。 例如,有一个 int 属性,我将 1 添加到 setter 中的值并调用 OnPropertyChanged
我想向 Youtube Data API 提出请求,但我不需要访问任何用户信息。我只想浏览公共(public)视频并根据搜索词显示视频。 我可以在未经授权的情况下这样做吗? 最佳答案 YouTube
我已经设置了一个 Twilio 应用程序,我想向人们发送更新,但我不想回复单个文本。我只是想让他们在有问题时打电话。我一切正常,但我想在发送文本时显示传入文本,以确保我不会错过任何问题。我正在使用 p
我有一个带有表单的网站(目前它是纯 HTML,但我们正在切换到 JQuery)。流程是这样的: 接受用户的输入 --- 5 个整数 通过 REST 调用网络服务 在服务器端运行一些计算...并生成一个
假设我们有一个名为 configuration.js 的文件,当我们查看内部时,我们会看到: 'use strict'; var profile = { "project": "%Projec
这部分是对 Previous Question 的扩展我的: 我现在可以从我的 CI Controller 成功返回 JSON 数据,它返回: {"results":[{"id":"1","Sourc
有什么有效的方法可以删除 ios 中 CBL 的所有文档存储?我对此有疑问,或者,如果有人知道如何从本质上使该应用程序像刚刚安装一样,那也会非常有帮助。我们正在努力确保我们的注销实际上将应用程序设置为
我有一个 Rails 应用程序,它与其他 Rails 应用程序通信以进行数据插入。我使用 jQuery $.post 方法进行数据插入。对于插入,我的其他 Rails 应用程序显示 200 OK。但在
我正在为服务于发布请求的 API 调用运行单元测试。我正在传递请求正文,并且必须将响应作为帐户数据返回。但我只收到断言错误 注意:数据是从 Azure 中获取的 spec.js const accou
我是一名优秀的程序员,十分优秀!