Записать в /dev/port как пользователь без полномочий root
Я работаю над довольно сложным кодом C++, который выполняет следующую операцию как обычный пользователь
fd = open("/dev/port",O_WRONLY);
...
lseek(fd, 0x2E,SEEK_SET);
...
write(fd,&buf,1);
Я получаю ошибку "Операция не разрешена" при открытии файла, несмотря на то, что он изменил файл.
crwxrwxrwx 1 root kmem 1, 4 Sep 12 14:32 /dev/port
Я знаю о проблемах безопасности с chmodding /dev/port, но, насколько нам известно, система будет работать в закрытой локальной сети.
Чтобы сделать это проще, это:
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
1 ответ
Решение
Открыть /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 или установив его для отдельного исполняемого файла (аналогично set-uid), используя setcap
,