控制台缓冲区安全性和访问权限

借助 Windows 安全模型,可以控制对控制台输入缓冲区和控制台屏幕缓冲区的访问。 有关安全性的详细信息,请参阅访问控制模型

控制台对象安全描述符

调用 CreateFileCreateConsoleScreenBuffer 函数时,可以为控制台输入和控制台屏幕缓冲区指定安全描述符。 如果指定 NULL,该对象将获取默认的安全描述符。 控制台缓冲区的默认安全描述符中的 ACL 来自创建者的主令牌或模拟令牌。

CreateFileCreateConsoleScreenBufferGetStdHandle 返回的句柄具有 GENERIC_READGENERIC_WRITE 访问权限。

有效的访问权限包括 GENERIC_READGENERIC_WRITE通用访问权限

含义
GENERIC_READ (0x80000000L) 请求对控制台屏幕缓冲区的读取访问权限,使进程能够从缓冲区读取数据。
GENERIC_WRITE (0x40000000L) 请求对控制台屏幕缓冲区的写权限,使进程能够将数据写入缓冲区。

注意

即使上面的安全描述符通常允许,通用 Windows 平台控制台应用以及具有低于附加控制台完整性级别的应用也会禁止读取输出缓冲区和写入输入缓冲区。 有关更多详细信息,请参阅下面的错误方向谓词讨论。

错误方向谓词

即使控制台对象具有一个明确允许读取或写入的安全描述符,但对控制台对象的某些操作也会被拒绝。 这尤其涉及在权限较低的上下文中运行的命令行应用程序,这些应用程序共享由命令行应用程序在权限较高的上下文中创建的控制台会话。

术语“错误方向谓词”适用于与其中一个控制台对象的正常流向相反的操作。 具体而言,输出缓冲区的正常流向是写入,输入缓冲区的正常流向是读取。 因此,“错误方向”是指在输出缓冲区的读取或输入缓冲区的写入。 这些函数在低级别控制台 I/O 函数文档中有介绍。

以下两种应用场景可能遇到此类谓词:

  1. 通用 Windows 平台控制台应用。 由于这些是其他通用 Windows 平台应用程序的同级,因此其必须与其他应用程序隔离,并保证其操作的效果。
  2. 任何以低于现有会话的完整性级别有意启动的控制台应用程序,这些会话可以在 CreateProcess 期间通过标记或令牌操作来完成

如果检测到上述任一应用场景,控制台会将“错误方向谓词”标志应用到命令行应用程序连接,并拒绝对以下 API 的调用,以减小各级别间的通信面:

被拒绝的调用将收到拒绝访问错误代码,这与对象上的安全描述符拒绝读取或写入权限的情形相同。