haulm 发表于 2010-9-26 15:11:27

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

以下程序用root执行能得出setuid和seteuid的区虽和使用,可以肯定的是内核对权限的提升有了越来越多的限制
所以估计如果需要提升权限,必需要提供一个root id 执行的服务提供临时的权限提升,目前的内核根本上堵死直接修改uid提升权限的危险做法,所以新内核普通用户不能用mxd拔号也很正常了,新内核停止了rp-pppoe-gui组件的权限提升方法。
还可以给passwd这个指令设置s标志,不管你加了suid权限还是去掉,MGC下普通用户无法用passwd更换自己的密码。。。,所以解决普通用户权限的问题只能依靠已经成为标准权限服务的组件,具体的我希望nihui能给个有效的例程以供大家学习(上回两个例子没一个可以用)。#include <unistd.h> //setuid() and getuid()
#include <iostream>
#include <fstream>
using namespace std;
void test_read_file(const char *name)
{
ifstream f(name);
if(f.fail())
cout<<"=: read failed."<<endl;
else
cout<<"=: read successful."<<endl;
}
//打印uid和euid.
inline void p_states(void)
{
int uid,euid;
   cout<<"-----Current states--------------------------"<<endl;
   cout<<"real uid\t"<<getuid()<<endl;
   cout<<"effective uid\t"<<geteuid()<<endl;
   cout<<"---------------------------------------------"<<endl;
}
//调用setuid.
inline void run_setuid_fun(int uid)
{
   if(setuid(uid) == -1)
          cout<<"=: setuid("<<uid<<") error"<<endl;
      p_states();
}
//调用seteuid.
inline void run_seteuid_fun(int uid)
{
      if(seteuid(uid) == -1)
         cout<<"=: seteuid("<<uid<<") error"<<endl;
      p_states();
}

   int main()
{
          int t_re=0;
          const char * file = "./root_only.txt";
   
          cout<<endl<<"TEST 1: "<<endl;
          p_states();
          //此时 real uid= login user id
          //   effective uid = root
          //   saved uid = root
          test_read_file(file);
   
          cout<<endl<<"TEST 2: seteuid(503)"<<endl;
          run_seteuid_fun(503);
          //此时 real uid= login user id
          //   effective uid = login user id
          //   saved uid = root
          test_read_file(file);
   
          cout<<endl<<"TEST 3: seteuid(0)"<<endl;
      run_seteuid_fun(0);
          //此时 real uid= login user id
          //   effective uid = root
          //   saved uid = root
          test_read_file(file);
   
          cout<<endl<<"TEST 4: setuid(0)"<<endl;
          run_setuid_fun(0);
          //此时 real uid= root
          //   effective uid = root
          //   saved uid = root
          test_read_file(file);
   
          cout<<endl<<"TEST 5: setuid(503)"<<endl;
          run_setuid_fun(503);
          //此时 real uid= login user id
          //   effective uid = login user id
          //   saved uid = login user id
          test_read_file(file);
   
          cout<<endl<<"TEST 6: setuid(0)"<<endl;
          //此时 real uid= login user id
          //   effective uid = login user id
          //   saved uid = login user id
          // 运行setuid(0)是将返回错误值-1.
          run_setuid_fun(0);
          test_read_file(file);
          return 0;
      }
   
   

haulm 发表于 2010-9-26 15:17:11

也可以说是直接建立一个pppoe-start服务,它本身就已经准备在执行拔号了,这时如果普通用户给它一个信号,那么pppoe-start服务就直接拔号了,如果是这样,根本和权限没有任何关系了。Linux 的安全机制看来要围得水泄不通。

nihui 发表于 2010-9-26 18:55:15

新内核停止了rp-pppoe-gui组件的权限提升方法
这个不应该的,理论上不会,按照软件发展模式也不会。
上次给的那两个例子用的是 polkit,不是 pppoe-wrapper 用的 suid 的那套,要我写也不过就这样了 :?

haulm 发表于 2010-9-27 08:25:32

polkit 认证,手头有个写文件的例子,就在培训论坛,测试也都通过了,不过我想要的是能运行程序的例子,polkit 认证dbus接口,有点杂乱,得理清看懂才行。
页: [1]
查看完整版本: 关于奇奇怪怪的权限编程问题