用户进程 P1 要使用某系统调用,该系统调用指向 C 语言函数库 libc.a 中的一个入口点。内核空间的进程进入部分唤醒监视进程 P2 ,这时它可以监视、分析和修改 P1 地址空间的内容。在 P2 进行安全处理后,内核又开始控制正常的系统调用功能。在系统调用完成后,监视进程 P2 可以检测并修改系统调用的返回值。为了防止监视进程对系统造成破坏,这里 P2 的 ruid 应与 P1 的一致(而不是使用 root )。
并不是在执行所有的系统调用时都要严格按照上述过程进行。系统调用可以根据安全要求分为三类:
◆ 总被允许的系统调用。包括 close 、 exit 、 fork 等。操作系统对这类系统调用提供的保护已能够满足通常的需求,因此不需要监视进程对它们进行特殊处理,避免了 P1 和 P2 间上下文切换的开销。
◆ 总被拒绝的系统调用。包括 setuid 、 mount 等。无特权的进程在执行这类系统调用时总是失败。 P2 只需设置 P1 的 PRSABORT 标识位并将其唤醒,这使得立即放弃执行系统调用,其返回值指示系统调用失败,并设 errno 为 EINTR 。
◆ 需要根据调用参数才能决定是否允许执行的系统调用。包括 open 、 rename 、 stat 、 kill 等。如果系统调用前处理的结果为允许执行该调用,则执行依照上面所述的过程。其中系统调用后处理部分根据具体情况也可省略。
Windows安全访问控制技术是在Windows内核执行体中放置一组安全“钩子”(Hooks)函数来控制对内核对象的访问,这些对象包括任务、inode结点和文件等。并为操作系统的关键客体,包括文件及目录、注册表、进程和服务等指定敏感标记,这样用户进程执行系统调用时,首先采用线程钩子和系统钩子等函数拦截和监控用户线程对系统核心资源的访问,进行强制访问控制检查,确定是否允许或禁止其访问,只有高级别敏感标记的主体才能对相应级别的文件及目录、注册表、进程和服务等客体进行访问。
(责任编辑:)