QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1458|回复: 3

关于奇奇怪怪的权限编程问题

[复制链接]
发表于 2010-9-26 15:11:27 | 显示全部楼层 |阅读模式
以下程序用root执行能得出setuid和seteuid的区虽和使用,可以肯定的是内核对权限的提升有了越来越多的限制
所以估计如果需要提升权限,必需要提供一个root id 执行的服务提供临时的权限提升,目前的内核根本上堵死直接修改uid提升权限的危险做法,所以新内核普通用户不能用mxd拔号也很正常了,新内核停止了rp-pppoe-gui组件的权限提升方法。
还可以给passwd这个指令设置s标志,不管你加了suid权限还是去掉,MGC下普通用户无法用passwd更换自己的密码。。。,所以解决普通用户权限的问题只能依靠已经成为标准权限服务的组件,具体的我希望nihui能给个有效的例程以供大家学习(上回两个例子没一个可以用)。
  1. #include <unistd.h> //setuid() and getuid()
  2. #include <iostream>
  3. #include <fstream>
  4. using namespace std;
  5. void test_read_file(const char *name)
  6. {
  7. ifstream f(name);
  8. if(f.fail())
  9. cout<<"=[ERROR]: read failed."<<endl;
  10. else
  11. cout<<"=[OK]: read successful."<<endl;
  12.   }
  13. //打印uid和euid.
  14. inline void p_states(void)
  15. {
  16. int uid,euid;
  17.      cout<<"-----Current states--------------------------"<<endl;
  18.      cout<<"real uid\t"<<getuid()<<endl;
  19.      cout<<"effective uid\t"<<geteuid()<<endl;
  20.      cout<<"---------------------------------------------"<<endl;
  21. }
  22. //调用setuid.
  23. inline void run_setuid_fun(int uid)
  24.   {
  25.      if(setuid(uid) == -1)
  26.           cout<<"=[ERROR]: setuid("<<uid<<") error"<<endl;
  27.       p_states();
  28.   }
  29. //调用seteuid.
  30.   inline void run_seteuid_fun(int uid)
  31.   {
  32.       if(seteuid(uid) == -1)
  33.            cout<<"=[ERROR]: seteuid("<<uid<<") error"<<endl;
  34.       p_states();
  35.   }

  36.    int main()
  37.   {
  38.           int t_re=0;
  39.           const char * file = "./root_only.txt";
  40.    
  41.           cout<<endl<<"TEST 1: "<<endl;
  42.           p_states();
  43.           //[1]此时 real uid= login user id
  44.           //     effective uid = root
  45.           //     saved uid = root
  46.           test_read_file(file);
  47.    
  48.           cout<<endl<<"TEST 2: seteuid(503)"<<endl;
  49.           run_seteuid_fun(503);
  50.           //[2]此时 real uid= login user id
  51.           //     effective uid = login user id
  52.           //     saved uid = root
  53.           test_read_file(file);
  54.    
  55.           cout<<endl<<"TEST 3: seteuid(0)"<<endl;
  56.         run_seteuid_fun(0);
  57.           //[3]此时 real uid= login user id
  58.           //     effective uid = root
  59.           //     saved uid = root
  60.           test_read_file(file);
  61.    
  62.           cout<<endl<<"TEST 4: setuid(0)"<<endl;
  63.           run_setuid_fun(0);
  64.           //[4]此时 real uid= root
  65.           //     effective uid = root
  66.           //     saved uid = root
  67.           test_read_file(file);
  68.    
  69.           cout<<endl<<"TEST 5: setuid(503)"<<endl;
  70.           run_setuid_fun(503);
  71.           //[5]此时 real uid= login user id
  72.           //     effective uid = login user id
  73.           //     saved uid = login user id
  74.           test_read_file(file);
  75.    
  76.           cout<<endl<<"TEST 6: setuid(0)"<<endl;
  77.           //[6]此时 real uid= login user id
  78.           //     effective uid = login user id
  79.           //     saved uid = login user id
  80.           // 运行setuid(0)是将返回错误值-1.
  81.           run_setuid_fun(0);
  82.           test_read_file(file);
  83.           return 0;
  84.       }
  85.    
  86.    
复制代码
 楼主| 发表于 2010-9-26 15:17:11 | 显示全部楼层
也可以说是直接建立一个pppoe-start服务,它本身就已经准备在执行拔号了,这时如果普通用户给它一个信号,那么pppoe-start服务就直接拔号了,如果是这样,根本和权限没有任何关系了。Linux 的安全机制看来要围得水泄不通。
回复

使用道具 举报

发表于 2010-9-26 18:55:15 | 显示全部楼层
新内核停止了rp-pppoe-gui组件的权限提升方法

这个不应该的,理论上不会,按照软件发展模式也不会。
上次给的那两个例子用的是 polkit,不是 pppoe-wrapper 用的 suid 的那套,要我写也不过就这样了
回复

使用道具 举报

 楼主| 发表于 2010-9-27 08:25:32 | 显示全部楼层
polkit 认证,手头有个写文件的例子,就在培训论坛,测试也都通过了,不过我想要的是能运行程序的例子,polkit 认证dbus接口,有点杂乱,得理清看懂才行。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-22 16:38 , Processed in 0.056815 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表