对资源设定合理的访问权限
1.8 ID_unlimitedAuthority
对资源设定合理的访问权限,避免为攻击者提供不应拥有的权限或能力。
权限的分类包括但不限于:
- 文件、数据库等资源的读写权限
- 计算、IO 过程的执行权限
- 软硬件资源的占用权限
权限设定是产品设计与实现的重要环节,需落实相关的评审与测试。
示例:
#include <stdio.h>
int main() {
umask(000); // Non-compliant
FILE* fp = fopen("bar", "w"); // Old method
....
fclose(fp);
}
例中 umask 函数开放了所有用户对文件的读写权限,这是很不安全的,进程之间不应直接通过文件通信,应实现安全的接口和交互机制。
由于历史原因,C 语言的 fopen 和 C++ 语言的 fstream 都不能确保文件只能被当前用户访问,C11 提供了 fopen_s,C++17 提供了 std::filesystem::permissions 以填补这方面的需求。
C11 fopen_s 简例:
#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
int main() {
FILE* fp = NULL;
errno_t e = fopen_s(&fp, "bar", "w"); // Good
....
fclose(fp);
}
与 fopen 不同,fopen_s 可以不受 umask 等函数的影响,直接将文件的权限设为当前用户私有,其他用户不可访问,降低了文件被窃取或篡改的风险,是一种更安全的方法。
除此之外,如果需要对资源进行更精细的权限管理,可参见“access control list(ACL)”。
依据
ISO/IEC 9899:2011 K.3.5.2.1(7)
ISO/IEC 14882:2017 30.10.15.26