核心思路是掐断系统调用入口,而非拦截命令——Linux通过seccomp-bpf在内核态syscall入口强制拦截mount、ptrace等高危调用,配合prctl(PR_SET_NO_NEW_PRIVS,1)禁用提权通道,实现不可绕过的最小权限控制。

核心思路不是“拦住命令”,而是“掐断调用入口”——系统调用层面的权限校验,才是真正的第一道闸门。Linux 和 Windows 都在内核态完成这一检查,绕过它,任何上层配置(如文件权限、sudo 规则)都可能失效。
Linux:从系统调用入口强制拦截
普通进程能否执行 mount、setuid、ptrace 等操作,不取决于它有没有对应可执行文件的 x 权限,而取决于内核在 syscall 入口是否允许。
- 用
capsh --print查看当前进程实际拥有的 capabilities,避免用sudo掩盖能力缺失 - 只赋予必要能力:比如只需绑定 80 端口,就执行
sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/myserver - 对敏感路径做底层过滤:用 seccomp-bpf 拦截
openat调用访问/etc/shadow,比chmod 600更不可绕过 - 启动时禁用提权通道:在关键进程启动后立即执行
prctl(PR_SET_NO_NEW_PRIVS, 1),防止后续execve获得新 capability
Windows:靠令牌与会话隔离建立硬边界
服务默认运行在 Session 0,用户桌面在 Session 1+,这不是显示隔离,而是安全隔离——服务进程天然没有访问 HKEY_CURRENT_USER 或用户桌面对象的令牌权限。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 不要启用已弃用的“允许服务与桌面交互”,改用
WTSQueryUserToken + CreateProcessAsUser在目标会话中启动 UI 进程 - 读取当前用户注册表前,先调用
WTSGetActiveConsoleSessionId获取会话 ID,再用ImpersonateLoggedOnUser模拟该用户令牌 - 完成操作后必须调用
SetThreadToken(NULL)清除模拟状态,否则后续调用会继承高权限上下文
跨平台共性:权限降级必须在调用发起前完成
一旦以高权限身份进入内核,所有子调用都继承该上下文。不存在“调用中途降权”这种机制。
- Linux 下
setuid()只影响后续 syscall 的凭证,不能回溯已进入内核的调用 - Windows 下
RevertToSelf()同样只作用于后续调用,之前已发出的请求仍按原令牌执行 - Docker 容器中仅设
--user不够安全,必须配合运行时参数no-new-privileges: true才能阻止容器内进程自行提权
配套加固:让权限控制真正落地
系统调用限制是主干,但需搭配基础权限和策略模块才能形成闭环。
- 为服务创建专用低权限用户(如
www-data),用chown -R appuser:appgroup /opt/myapp绑定资源所有权 - 敏感配置文件设为
600,日志目录设为750,杜绝其他用户意外读写 - 启用 SELinux 或 AppArmor,定义进程只能访问哪些路径、执行哪些 syscall,即使 capability 被滥用也能兜底拦截
- 用
auditd监控execve、setuid、openat等关键 syscall,异常行为实时告警

















