拒绝服务

当应授予对特定服务的访问权限,但实际上被错误地拒绝时,会发生拒绝服务。 例如,无特权应用程序可以执行导致系统不可用的任何操作实际上都是拒绝服务。 这将包括以下操作或操作序列:

  • 系统崩溃。

  • 导致线程或进程过早终止。

  • 创建死锁条件。 当两个或多个线程停止等待处于永久停滞状态时,会发生死锁。 每个线程都在等待其他线程之一持有的资源。

  • 创建实时锁定条件。 当两个或更多个处理器因等待获取资源而无法进行时, (通常是队列) 上的锁,并且拥有该资源的线程处于类似的非进度状态时,可能会发生实时锁定。

此类问题经常出现在驱动程序中,因为它们包含可由普通应用程序利用的潜在 bug。 此类型的攻击可能很简单,难以防范。 驱动程序中此类问题的常见原因包括:

  • 不正确的用户缓冲区验证。

  • 缓冲区溢出或下溢。

对于文件系统和文件系统筛选器驱动程序,存在此类问题的情况很多。 例如,由于 Win32 子系统的历史原因,MAX_PATH值定义为 260。 许多驱动程序组件假定这表示最大路径的大小。 遗憾的是,情况并非如此,因为 NTFS 文件系统上的最大路径为 32,767 个 Unicode 字符, (65,534 字节) 。 如果筛选器驱动程序将MAX_PATH长度假设编码为其代码库,则应用程序在筛选器驱动程序管理的路径中创建大于此路径的路径时,将引发简单的拒绝服务攻击。

另一个常见问题是应用程序通常会将用户模式指针嵌入到专用 FSCTL 请求中。 文件系统受到三大类拒绝服务攻击:

  • 消耗所有可用磁盘空间。

  • 使用所有可用磁盘带宽。

  • 阻止访问用户应有权访问的文件。

通常,文件系统开发人员几乎无法阻止这些类型的攻击。 但是,开发人员可以采取一些步骤来允许管理员限制这些类型的拒绝服务攻击。

涉及文件系统的最简单拒绝服务攻击是用尽所有可用磁盘空间。 编写应用程序来执行此操作很简单,后果是深远的。 如果系统中的许多应用程序和服务无法再写入磁盘,它们将无法正常运行。 缓解技术是磁盘配额,它可以限制管理员正确使用用户拥有的文件的可用磁盘空间量。 因此,在开发文件系统时包含对磁盘配额的支持是有意义的。

恶意或编写不当的应用程序也可能尝试消耗所有磁盘带宽。 受到此类攻击的常规用户的后果是系统迟缓或无响应。 目前,操作系统没有限制应用程序使用的带宽的机制。 文件系统还会为每个打开的文件对象和文件句柄使用内核内存。 恶意应用程序可能会尝试持续打开大量文件,并使其保持打开状态,直到内存耗尽。 这些问题的主要缓解方法是审核和日志记录,以便管理员可以监视计算机中执行大量 I/O 或使用大量其他资源的应用程序。 同样,文件系统和文件系统筛选器驱动程序包括审核支持是明智之举,以更好地最大限度地减少这种类型的拒绝服务。

恶意应用程序可能会尝试阻止其他用户访问正常使用所需的文件。 尽量减少这些问题的一个重要策略是确保在开发文件系统时正确实现与文件对象关联的安全信息。

最后,所有驱动程序都需要注意消耗所有可用内存或其他资源来响应来自恶意或异常应用程序的请求。