Linux开发

推荐列表 站点导航

当前位置:首页 > 服务器技术 > Linux开发 >

linux保存的设置用户/组ID(set-user-ID)的测试

来源:网络整理  作者:  发布时间:2020-12-22 22:09
直接贴代码和结果: // FileName: id.cpp #include iostream #include unistd.h using namespace std; int main() { cout 进程ID: getpid() endl; cou...

直接贴代码和结果:

// FileName: id.cpp

#include <iostream>

#include <unistd.h>

using namespace std;

int main()

{

cout << "进程ID:     " << getpid() << endl;

cout << "实际用户ID: " << getuid() << endl;

cout << "有效用户ID: " << geteuid() << endl;

return 0;

}

linux保存的设置用户/组ID(set-user-ID)的测试

 

实际ID: root(0), xyz(1000), abc(1001)

可以发现,用户xyz给程序a.out的权限加上s后,ls -l的权限字符串第4位的x变成了s,之后其他用户在执行a.out时,当前进程的有效用户ID都会变成a.out所属用户(即xyz)的ID。

每个进程都有一套ID,用户ID(UID)和组ID(GID),两者是类似的,所以这里只考虑用户ID。

 

POSIX.1的API可以获取的有:实际用户ID和有效用户ID

实际用户ID就是/etc/passwd里的ID,有效用户ID是在执行某些系统调用时用来进行权限验证的,一般情况下等于实际用户ID。只有在设置了set-user-ID对应的权限位后(比如rwx变成了rws)有效ID才和实际ID产生了差别。

也就是说,用户xyz想让其他用户可以执行自己的这个应用程序(a.out),用户xyz可以用chmod o+x a.out让其他用户拥有执行(x,即execute)的权限。但是a.out程序内部又有需要验证有效ID的系统调用(比如open函数),这时用户xyz就可以用chmod u+s a.out来让其他用户顺利通过这一层测试。

 

再来个例子:

// FileName: append.c

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <errno.h>

#include <unistd.h>

#include <fcntl.h>

int main(void)

{

char filename[] = "file.txt";

int fd;

if ((fd = open(filename, O_WRONLY | O_APPEND)) == -1) {

fprintf(stderr, "open %s error: %s\n", filename, strerror(errno));

exit(1);

}

// 忽略了错误处理以及关闭文件描述符的操作   

char buf[BUFSIZ];

snprintf(buf, BUFSIZ, "Access ID: %ld\n", (long)getuid());

write(fd, buf, strlen(buf));

return 0;

}

linux保存的设置用户/组ID(set-user-ID)的测试

 

可以看出在设置用户ID位没有被设置时(APUE的说法,说得很绕口,简单地可以理解为表示用户权限的x没有变成s),用户abc通过权限位x获得了执行a.out的权限,但是却无法打开所属用户ID为xyz的文件file.txt,因为open函数写入时需要检查权限(而file.txt的权限位是rw-rw-r--,最后3位是其他用户,可以看出是没有写入权限的),因此以O_WRONLY来打开file.txt时会Permission denied,被权限挡住。

而在设置好设置用户ID位后,open函数验证权限时发现有效ID是xyz(虽然实际ID是abc),通过验证。

相关热词: Linux

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!

本文地址: https://v30.fanwenzhu.com/server/kaifa/7522.shtml

相关文章
Copyright © www.juheyunku.com      关于 | 合作 | 声明 | 联系 | 更新 | 地图 | Tags

linux保存的设置用户/组ID(set-user-ID)的测试

2020-12-22 编辑:

直接贴代码和结果:

// FileName: id.cpp

#include <iostream>

#include <unistd.h>

using namespace std;

int main()

{

cout << "进程ID:     " << getpid() << endl;

cout << "实际用户ID: " << getuid() << endl;

cout << "有效用户ID: " << geteuid() << endl;

return 0;

}

linux保存的设置用户/组ID(set-user-ID)的测试

 

实际ID: root(0), xyz(1000), abc(1001)

可以发现,用户xyz给程序a.out的权限加上s后,ls -l的权限字符串第4位的x变成了s,之后其他用户在执行a.out时,当前进程的有效用户ID都会变成a.out所属用户(即xyz)的ID。

每个进程都有一套ID,用户ID(UID)和组ID(GID),两者是类似的,所以这里只考虑用户ID。

 

POSIX.1的API可以获取的有:实际用户ID和有效用户ID

实际用户ID就是/etc/passwd里的ID,有效用户ID是在执行某些系统调用时用来进行权限验证的,一般情况下等于实际用户ID。只有在设置了set-user-ID对应的权限位后(比如rwx变成了rws)有效ID才和实际ID产生了差别。

也就是说,用户xyz想让其他用户可以执行自己的这个应用程序(a.out),用户xyz可以用chmod o+x a.out让其他用户拥有执行(x,即execute)的权限。但是a.out程序内部又有需要验证有效ID的系统调用(比如open函数),这时用户xyz就可以用chmod u+s a.out来让其他用户顺利通过这一层测试。

 

再来个例子:

// FileName: append.c

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <errno.h>

#include <unistd.h>

#include <fcntl.h>

int main(void)

{

char filename[] = "file.txt";

int fd;

if ((fd = open(filename, O_WRONLY | O_APPEND)) == -1) {

fprintf(stderr, "open %s error: %s\n", filename, strerror(errno));

exit(1);

}

// 忽略了错误处理以及关闭文件描述符的操作   

char buf[BUFSIZ];

snprintf(buf, BUFSIZ, "Access ID: %ld\n", (long)getuid());

write(fd, buf, strlen(buf));

return 0;

}

linux保存的设置用户/组ID(set-user-ID)的测试

 

可以看出在设置用户ID位没有被设置时(APUE的说法,说得很绕口,简单地可以理解为表示用户权限的x没有变成s),用户abc通过权限位x获得了执行a.out的权限,但是却无法打开所属用户ID为xyz的文件file.txt,因为open函数写入时需要检查权限(而file.txt的权限位是rw-rw-r--,最后3位是其他用户,可以看出是没有写入权限的),因此以O_WRONLY来打开file.txt时会Permission denied,被权限挡住。

而在设置好设置用户ID位后,open函数验证权限时发现有效ID是xyz(虽然实际ID是abc),通过验证。

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供学习参考!
本文地址为 https://v30.fanwenzhu.com/server/kaifa/7522.shtml

相关文章

风云图片

推荐阅读

返回Linux开发频道首页