文件创建时未限制权限¶
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
创建文件时,应尽量为其赋予最严格的权限。常见的错误是创建文件时赋予世界可写权限。这会让攻击者可以写入文件,从而获得对程序的意外控制。
建议¶
通常情况下,文件应该只对当前用户拥有写权限。如果需要更广泛的权限,包括用户的组权限就足够了。很少有文件需要世界可写权限,因此在使用世界可写权限时要谨慎,不要对任何此类文件的内容进行假设。
在 Unix 系统上,运行程序的用户可以使用 umask
限制文件创建权限。但是,程序不应假设用户会设置 umask
,而应始终默认设置严格的权限。
示例¶
此示例展示了两种编写默认配置文件的方式。软件通常会这样做,为用户提供一个方便的起点来定义自己的配置。但是,配置文件还可以控制软件行为的重要方面,因此重要的是,攻击者不能控制这些文件。
第一个示例使用通常的 Unix 权限 “default”,即 0666
,创建默认配置文件。这使得文件世界可写,因此攻击者可以写入自己的配置,这些配置会被程序读取。第二个示例使用更严格的权限:标准 Unix 常量 S_IWUSR
和 S_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);
}
参考资料¶
CERT Oracle C 安全编码标准: FIO06-C. 使用适当的访问权限创建文件 .
常见弱点枚举:CWE-732.