CodeQL 文档

文件创建时未限制权限

ID: cpp/world-writable-file-creation
Kind: problem
Security severity: 7.8
Severity: warning
Precision: medium
Tags:
   - security
   - external/cwe/cwe-732
Query suites:
   - cpp-security-extended.qls
   - cpp-security-and-quality.qls

点击查看 CodeQL 代码库中的查询

创建文件时,应尽量为其赋予最严格的权限。常见的错误是创建文件时赋予世界可写权限。这会让攻击者可以写入文件,从而获得对程序的意外控制。

建议

通常情况下,文件应该只对当前用户拥有写权限。如果需要更广泛的权限,包括用户的组权限就足够了。很少有文件需要世界可写权限,因此在使用世界可写权限时要谨慎,不要对任何此类文件的内容进行假设。

在 Unix 系统上,运行程序的用户可以使用 umask 限制文件创建权限。但是,程序不应假设用户会设置 umask,而应始终默认设置严格的权限。

示例

此示例展示了两种编写默认配置文件的方式。软件通常会这样做,为用户提供一个方便的起点来定义自己的配置。但是,配置文件还可以控制软件行为的重要方面,因此重要的是,攻击者不能控制这些文件。

第一个示例使用通常的 Unix 权限 “default”,即 0666,创建默认配置文件。这使得文件世界可写,因此攻击者可以写入自己的配置,这些配置会被程序读取。第二个示例使用更严格的权限:标准 Unix 常量 S_IWUSRS_IRUSR 的组合,这意味着只有当前用户才能读写文件。

void write_default_config_bad() {
	// BAD - this is world-writable so any user can overwrite the config
	int out = creat(OUTFILE, 0666);
	dprintf(out, DEFAULT_CONFIG);
}

void write_default_config_good() {
	// GOOD - this allows only the current user to modify the file
	int out = creat(OUTFILE, S_IWUSR | S_IRUSR);
	dprintf(out, DEFAULT_CONFIG);
}

参考资料

  • ©GitHub, Inc.
  • 条款
  • 隐私