硬件设备通过总线连接到CPU,CPU确实用它们进行通信 in / out 在I / O端口读取/写入值的指令(不用于当前的HW太多,在家用计算机的早期这是常见的方式),或者设备存储器的一部分被“映射”到CPU地址空间和CPU中通过在该共享内存中的已定义位置写入值来控制设备。
in
out
所有这些都不应该在“用户级”上下文中访问,其中常见的应用程序由OS执行(因此尝试写入共享设备内存的应用程序会因非法内存访问而崩溃,实际上这块内存通常甚至不会映射到用户空间,即从用户应用程序的角度来看不存在)。直接 in / out 指令在CPU级别也被阻止。
该设备由驱动程序代码控制,该代码运行是专门配置的用户级上下文,其具有特定的端口和内存映射(微内核模型,其中驱动程序不是内核的一部分,如OS MINIX)。这种体系结构更加健壮(驱动程序崩溃无法取消内核,内核可以隔离有问题的驱动程序并重新启动它,或者只是完全删除它),但内核和用户级别之间的上下文切换是一项非常昂贵的操作,因此吞吐量数据受到了一点伤害。
或者设备驱动程序代码在内核级别(像Linux这样的单片内核模型)上运行,因此驱动程序代码中的任何漏洞都可以直接攻击内核(仍然不是微不足道的,但比通过某些内核尝试将隧道从用户上下文中删除要容易得多BUG)。但I / O的整体性能更好(特别是对于图形卡或RAID磁盘集群等设备,其中数据带宽为每秒GiB)。例如,这就是早期USB驱动程序存在巨大安全风险的原因,因为它们往往会被大量窃听,因此特制的USB设备可以在内核级上下文中从设备执行一些流氓代码。
因此,正如Hyd已经回答的那样,在一般情况下,当一切正常工作时,用户级应用程序应该无法在其用户沙箱之外发出单个位,并且系统调用之外的可疑行为将被忽略或崩溃该应用程序。
如果您找到了破解此规则的方法,那么当操作系统供应商收到通知时,它会出现安全漏洞,并且通常会尽快修补。
虽然目前的一些问题很难修补。例如,当前DRAM芯片的“行锤击”根本不能固定在SW(OS)或CPU(配置/固件闪存)级别!目前的大多数PC硬件都容易受到这种攻击。
或者在移动世界中,这些设备正在使用基于传统设计的无线电芯片,并且多年前开发了封闭源固件,因此如果您有足够的资源来支付对这些设备的研究费用,您很可能会抓住任何特定设备。设备由假BTS站向目标设备发送恶意无线电信号。
等等......与安全研究人员修补所有漏洞的供应商之间的持续战争,以及黑客找到理想的零日漏洞利用,或者至少挑选那些没有使用已知漏洞快速修补设备/ SW的用户。
不正常。如果可能是因为操作系统软件错误。如果发现软件错误,它会被快速修复,因为它被认为是软件漏洞,这等于坏消息。
“系统”调用在比应用程序更高的处理器级别执行:通常是内核模式(但系统系统具有多个系统级模式)。
您所看到的“系统”调用实际上只是一个包装器,它设置寄存器然后触发某种类型的更改模式异常(该方法是系统特定的)。系统异常处理程序将调度到适当的系统服务器。
你不能只编写自己的函数并做坏事。没错,有时人们会发现允许绕过系统保护的错误。作为一般原则,除非通过系统服务执行,否则无法访问设备。