c++ - 如何创建对其他进程只读的共享内存映射?
问题描述
我有一个分叉 setuid 程序,其中父进程创建一个匿名的只读共享内存映射。但是没有特权的子进程可以简单的改变内存保护,改变内存!(见下面的例子)
我如何禁止这样做?匿名映射有可能吗,还是我需要 shm_open/shmget?
编译并运行g++ -Wall -Wextra test.cpp && sudo ./a.out
#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/mman.h>
using namespace std;
int main()
{
size_t len = 4096;
char* data = (char*)mmap(NULL, len, PROT_READ, MAP_ANONYMOUS|MAP_SHARED, -1, 0);
volatile unsigned* shared_value = (unsigned*)data;
if (fork() > 0) { // Parent process
cout << "[Parent] uid=" << getuid() << endl;
usleep(2000000);
cout << "[Parent] value is " << *shared_value << endl;
usleep(2000000);
cout << "[Parent] value is " << *shared_value << endl;
} else { // Child process
usleep(1000000);
cout << "[Child] uid=" << getuid() << endl;
if (setuid(1000) < 0) {
perror("setuid");
}
cout << "[Child] uid=" << getuid() << endl;
if (mprotect(data, len, PROT_READ|PROT_WRITE) < 0) {
perror("mprotect");
}
usleep(2000000);
*shared_value = 456;
cout << "[Child] changed value" << endl;
}
}
输出是:
[Parent] uid=0
[Child] uid=0
[Child] uid=1000
[Parent] value is 0
[Child] changed value
[Parent] value is 456
解决方案
推荐阅读
- python-3.x - 如何修复这个特定的“NotADirectoryError: [Errno 20] Not a directory”错误?
- c# - 将 DP API IKey 转换为 IdentityModel SecurityKey
- css - 如何使用边距处理计算高度?
- ubuntu - 詹金斯在开始会话关闭后失败
- python - 将文件从python转换为exe
- c# - 如何找到此复选框“允许此代码与原始代码不同”?
- python - 在 Pint 中定义自己的单位字符串格式
- reactjs - Auth0 回调 url 不适用于我的 netlify 应用程序
- typescript - 软类型检查函数参数
- svg - QT5 Svg 不渲染在 QGraphicsView 上设置的透视变换