c++如何判断当前执行程序是否具有修改系统根目录文件的权限【进阶】

星墨酱_3143

星墨酱_3143

2026-03-24

970人浏览

原创

不可靠。access("/")仅检查传统dac权限,无法反映cap_sys_admin、user namespace、sip、uac等实际限制;应改用mkdir()等轻量syscall试探并捕获errno。

c++如何判断当前执行程序是否具有修改系统根目录文件的权限【进阶】

Linux/macOS 下用 access() 检查对 / 的写权限是否可靠?

不可靠。直接调用 access("/", W_OK) 返回 0,不代表你真能往 / 下创建或修改文件——它只检查当前进程的有效 UID/GID 是否在文件系统权限模型中被允许,而现代系统(尤其是启用了 capability 或 rootless 容器的环境)会绕过这套检查。

真正起作用的是内核级权限控制:是否拥有 CAP_SYS_ADMIN(传统 root)、CAP_DAC_OVERRIDE(绕过 DAC),或者是否运行在 unprivileged user namespace 中。普通用户即使 access() 返回成功,执行 open("/etc/hosts", O_WRONLY) 仍大概率失败并返回 EACCES 或 EROFS。

  • access() 是静态权限快照,不反映实际 syscall 执行时的上下文(如 seccomp、SELinux、mount options)
  • 若程序以非 root 用户启动但通过 setuid 或 sudo 提权,access() 可能误判(取决于调用时机)
  • macOS 上还需考虑 SIP(System Integrity Protection):即使 root 也无法修改 /System、/usr 等路径,access() 完全不感知 SIP

更务实的做法:直接尝试最小化操作 + 捕获 errno

与其预测权限,不如做一次轻量、无副作用的试探性 syscall,并根据错误码反推能力边界。例如:

C++ Code Review Master
C++ Code Review Master

组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。

下载
int fd = open("/tmp/.perm_test_XXXXXX", O_RDWR | O_CREAT | O_EXCL, 0600);
if (fd == -1) {
    if (errno == EACCES || errno == EROFS) {
        // /tmp 不可写 → 根本没机会碰 /
    }
}
close(fd);
unlink("/tmp/.perm_test_XXXXXX");

// 再试根目录下极小代价操作
int ret = mkdir("/.test_perm_XXXXXX", 0700);
if (ret == -1 && (errno == EACCES || errno == EPERM || errno == EROFS)) {
    // 明确知道无法在 / 下创建目录 → 几乎肯定不能改系统文件
}
rmdir("/.test_perm_XXXXXX");
  • 避免用 stat("/") 查 uid/gid:root 用户也可能被 chroot 或 namespace 隔离,stat 结果无意义
  • 不要用 geteuid() == 0 判断:容器里 uid=0 ≠ 真实特权(user namespace 默认启用)
  • 优先选 mkdir() 而非 open():前者不触发 page cache 或日志写入,副作用更小;且多数系统对 / 的 mkdir 权限和文件写权限一致

Windows 下判断对 C: 的修改权限要特别注意 UAC 和完整性级别

Windows 没有“root”概念,而是靠完整性级别(IL)和 UAC 虚拟化共同决定。即使你是 Administrator 组成员,进程默认 IL 是 MEDIUM,对 C: 写入会被重定向到 VirtualStore 或直接拒绝。

  • 用 CheckTokenMembership() + GetTokenInformation(TokenIntegrityLevel) 获取当前 token 的 IL;只有 IL ≥ SECURITY_MANDATORY_HIGH_RID 才可能真实写入 C:
  • UAC 弹窗不是“授权”,而是启动一个新高 IL 进程;原进程 IL 不会改变
  • 不要依赖 GetFileAttributes("C:\") & FILE_ATTRIBUTE_READONLY:该标志在 NTFS 上几乎总为 0,与实际写权限无关
  • 真实检测必须用 CreateFile("C:\test.perm", GENERIC_WRITE, ...) 并检查是否返回 INVALID_HANDLE_VALUE 且 GetLastError() 为 ERROR_ACCESS_DENIED 或 ERROR_PRIVILEGE_NOT_HELD

跨平台封装时最容易忽略的点

没有“统一判断根目录写权限”的安全方式。不同系统底层机制差异太大,强行抽象只会掩盖风险。

  • Linux/macOS:mkdir("/") 是非法操作(ENOTEMPTY),必须用子路径如 "/." 或 "/tmp" 做代理;但 "/." 在某些只读挂载下仍可能返回 ENOENT
  • Windows:GetDriveType("C:\") 返回 DRIVE_FIXED 不代表可写,SSD 硬件写保护或 BitLocker 挂起状态都会导致后续失败
  • 所有试探性调用都应设超时或限制重试次数——某些 NFS 或 FUSE 文件系统在权限检查阶段就可能卡住
  • 如果程序需要持续修改系统文件,正确做法是提前申请、明确告知用户需提升权限,而不是运行时悄悄降级行为

真正难的不是“怎么测”,而是测完之后如何让程序在权限不足时给出准确、可操作的反馈——比如区分“你不是管理员”和“你虽然是管理员但启用了 SIP/UAC 虚拟化”。这些边界情况,代码里留一个 // TODO: refine error message per platform 往往比写一百行通用检测更有价值。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

909

5

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.25

2520

5

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

2023.09.14

12446

6

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.14

1505

5

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

2023.12.21

3337

3

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

2024.03.01

5501

5

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.26

3079

3

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.27

2638

6

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

2023.08.01

1448

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习