是否可以通过不使用提供的系统调用来规避操作系统安全性?

时间:2016-08-16 21:43:11

标签: security assembly operating-system system-calls

据我所知,当操作系统通过所述操作系统提供的系统调用使用系统和文件系统时,操作系统会对用户强制执行安全策略。

是否可以通过实施自己的硬件指令而不是使用OS提供的系统调用接口来规避此安全性?即使将一个位写入您通常无法访问的文件也足够了。

4 个答案:

答案 0 :(得分:2)

HW设备通过总线连接到CPU,CPU确实使用它们与in / out指令进行通信,以便在I / O端口读取/写入值(当前HW不会使用太多,在家用电脑的早期,这是常见的方式),或者设备存储器的一部分被“映射”到CPU地址空间,并且CPU通过在该共享存储器中的定义位置写入值来控制设备。

所有这些都不应该在“用户级”上下文中访问,其中常见的应用程序由OS执行(因此尝试写入共享设备内存的应用程序会因非法内存访问而崩溃,实际上这段内存通常不会甚至映射到用户空间,即从用户应用程序的角度来看不存在)。在CPU级别也会阻止直接in / out指令。

设备由驱动程序代码控制,驱动程序代码运行是专门配置的用户级上下文,具有特定的端口和内存映射(微内核模型,其中驱动程序不是内核的一部分,如OS MINIX) 。这种体系结构更加健壮(驱动程序崩溃无法取消内核,内核可以隔离有问题的驱动程序并重新启动它,或者只是完全删除它),但内核和用户级别之间的上下文切换是一项非常昂贵的操作,因此吞吐量数据受到了一点伤害。

或者设备驱动程序代码在内核级别(像Linux这样的单片内核模型)上运行,因此驱动程序代码中的任何漏洞都可以直接攻击内核(仍然不是很简单,但比尝试从用户上下文中获取隧道要容易得多)通过一些内核bug)。但I / O的整体性能更好(特别是对于图形卡或RAID磁盘集群等设备,其中数据带宽为每秒GiB)。例如,这就是早期USB驱动程序存在巨大安全风险的原因,因为它们往往会被大量窃听,因此特制的USB设备可以在内核级环境中从设备执行一些流氓代码。

因此,正如Hyd已经回答的那样,在一般情况下,当一切正常工作时,用户级应用程序应该无法在其用户沙箱之外发出单个位,并且系统调用之外的可疑行为将被忽略,或者崩溃应用程序。

如果您找到了破解此规则的方法,那么当操作系统供应商收到通知时,它会出现安全漏洞,并且通常会尽快修补。

虽然目前的一些问题很难修补。例如,当前DRAM芯片的“行锤击”根本不能固定在SW(OS)或CPU(配置/固件闪存)级别!目前的大多数PC硬件都容易受到这种攻击。

或者在移动世界中,这些设备正在使用基于传统设计的无线电芯片,并且多年前开发了封闭源固件,因此如果您有足够的资源来支付对这些设备的研究费用,那么您很可能会通过伪造的BTS站向目标设备发送恶意无线电信号,抓住任何特定设备。

等等......安全研究人员与安全研究人员修补所有漏洞之间的持续战争,以及黑客寻​​找理想的零日攻击,或者至少挑选那些没有使用已知错误修补设备/ SW的用户。

答案 1 :(得分:1)

不正常。如果可能是因为操作系统软件错误。如果发现软件错误,它会被快速修复,因为它被认为是软件漏洞,这等于坏消息。

答案 2 :(得分:1)

首先,为简单起见,我认为操作系统和内核是一回事。

执行代码时,CPU可以处于不同的模式。 假设一个假想的CPU只有两种执行模式(主管和用户)

  • 在超级用户模式下,您可以执行任何指令,并且您可以完全访问硬件资源。
  • 在用户模式下,有一些您无法访问的指令子集,例如有处理硬件或更改CPU模式的指令。尝试执行其中一条指令将导致OS通知您的应用程序行为不当,并将终止操作系统。此通知是通过中断完成的。此外,在用户模式下,您只能访问部分内存,因此您的应用程序甚至无法触摸它不应该的内存。

现在,这个工作的诀窍是,在Supervisor模式下,你可以切换到用户模式,因为它是一个特权较少的模式,但在用户模式下,你不能回到管理员模式,因为不再允许使用该指令。 返回Supervisor模式的唯一方法是通过系统调用或中断。这使操作系统可以完全控制硬件。

这个假设CPU的所有内容如何组合的一个可能示例:

  • CPU以超级用户模式启动
  • 由于CPU以超级用户模式启动,因此首先要运行的是访问整个系统。这是操作系统。
  • 操作系统无论如何都要设置硬件,内存保护等。
  • 操作系统在为该应用程序配置权限后启动您想要的任何应用程序。启动应用程序切换到用户模式。
  • 应用程序正在运行,只能访问操作系统启动时允许的资源。任何对硬件资源的访问都需要通过系统调用。

我只解释了单个应用程序的流程。 作为一个奖励,可以帮助您了解这是如何与多个运行的应用程序结合在一起,简化了抢先式多任务如何工作的视图:

  • 在现实世界中。操作系统将在启动任何应用程序之前设置硬件计时器。
  • 当此计时器到期时,它会导致CPU中断它正在做的任何事情(例如:运行应用程序),切换到管理员模式并在预定位置执行代码,这属于操作系统和应用程序不在有权访问。
  • 由于我们重新进入超级用户模式并运行操作系统代码,因此操作系统现在选择要运行的下一个应用程序,设置所有必需的权限,切换到用户模式并恢复该应用程序。
  • 这个计时器中断是你如何获得多任务处理的错觉。操作系统在应用程序之间不断变换。

这里的底线是,除非操作系统(或硬件设计)中存在错误,否则应用程序从用户模式进入超级用户模式的唯一方法是通过操作系统本身进行系统调用。

这是我在我的爱好项目(虚拟计算机)https://github.com/ruifig/G4DevKit中使用的机制。

答案 3 :(得分:0)

“系统”调用在比应用程序更高的处理器级别执行:通常是内核模式(但系统系统有多种系统级模式)。

您所看到的“系统”调用实际上只是一个包装器,它设置寄存器然后触发某种类型的更改模式异常(该方法是系统特定的)。系统异常处理程序将调度到适当的系统服务器。

你不能只写自己的功能并做坏事。没错,有时人们会发现允许绕过系统保护的错误。作为一般原则,除非您通过系统服务进行设备,否则无法访问设备。