gpt4 book ai didi

linux-kernel - 以非root用户写入/dev/port

转载 作者:行者123 更新时间:2023-12-02 02:11:49 25 4
gpt4 key购买 nike

我正在编写一个相当复杂的 C++ 代码,它以标准用户身份执行以下操作

fd = open("/dev/port",O_WRONLY);
...
lseek(fd, 0x2E,SEEK_SET);
...
write(fd,&buf,1);

尽管对文件进行了 chmod,但在打开文件时出现“不允许操作”错误。

crwxrwxrwx 1 root kmem 1, 4 Sep 12 14:32 /dev/port

我知道 chmodding/dev/port 存在安全问题,但就我们而言,系统将在封闭的 LAN 上运行。


为了更容易,这个:

using namespace std;
int main(int argc, char *argv[])
{
int fd=-1;

// fd1=open("/dev/port",O_RDWR|O_NDELAY);
vector<string> fnames;
fnames.push_back("/dev/port");
fnames.push_back("/dev/tty0");

string fname;


for(int i=0;i<fnames.size();i++)
{
fname = fnames[i];
fd=open(fname.c_str(),O_RDWR | O_NDELAY);
if(fd<0)
{
cout << fname << " " << fd << endl;
cout << fname << " " << strerror(errno) << endl;
}
else
{
cout << "Open ok: " << fname << endl;
}
}


return 0;
}

返回这个:

me@myPC:~/test$ ./main 
/dev/port -1
/dev/port Operation not permitted
Open ok: /dev/tty0

具有这些权限

me@myPC:~/test$ ll /dev/tty /dev/port 
crw-rw-rw- 1 root kmem 1, 4 Sep 12 14:32 /dev/port
crw-rw-rw- 1 root tty 5, 0 Sep 12 15:51 /dev/tty

最佳答案

要打开 /dev/port,除了打开文件的权限外,您还需要 CAP_SYS_RAWIO 的能力。

drivers/char/mem.c:730

static int open_port(struct inode * inode, struct file * filp)
{
return capable(CAP_SYS_RAWIO) ? 0 : -EPERM;
}

您可以通过成为 root 或使用 setcap 为单个可执行文件设置它(类似于 set-uid)来获得它。

http://linux.die.net/man/8/setcap

关于linux-kernel - 以非root用户写入/dev/port,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12388477/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com