拒绝服务

如果应授予对特定服务的访问权限,但实际上未正确拒绝,则会发生拒绝服务。 例如,无特权应用程序可以执行的任何操作都会导致系统变得不可用,这是一种拒绝服务的情况。 这包括以下操作或操作序列:

  • 崩溃系统。

  • 导致提前终止线程或进程。

  • 创建死锁条件。 当两个或多个线程停止等待永久性状态的 stalemate 时,会发生死锁。 每个线程正在等待一个其他线程占用的资源。

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

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

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

  • 缓冲区溢出或下溢。

对于文件系统和文件系统筛选器驱动程序,此类问题有很多情况。 例如,MAX_PATH 值定义为260,原因是 Win32 子系统上的历史原因。 许多驱动程序组件都假设这表示最大路径的大小。 遗憾的是,这种情况并非如此,因为 NTFS 文件系统上的最大路径为 32767 (65534 字节) Unicode 字符。 如果筛选器驱动程序要将 MAX_PATH 长度假设编码为其基本代码,则会出现一种简单的拒绝服务攻击,这是因为在筛选器驱动程序所管理的路径中创建的路径大于此范围。

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

  • 使用所有可用的磁盘空间。

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

  • 阻止对用户应该具有访问权限的文件的访问。

通常情况下,文件系统开发人员无需执行此操作即可阻止这些类型的攻击。 但是,开发人员可以采取一些步骤来限制这些类型的拒绝服务攻击。

涉及文件系统的最简单的拒绝服务攻击是使用所有可用磁盘空间。 编写一个应用程序来执行此操作很简单,结果也很多。 如果系统中的许多应用程序和服务无法再写入磁盘,则无法正常工作。 缓解技术是磁盘配额,可限制管理员在正确使用时可用于用户所拥有的文件的磁盘空间量。 因此,在开发文件系统时提供对磁盘配额的支持是有意义的。

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

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

最后,所有驱动程序都需要考虑使用所有可用内存或其他资源来响应来自恶意或 aberrant 应用程序的请求。