70e368e235
Deploy Examination / deploy (push) Successful in 7s
New topic group: 网络安全专题 (cybersecurity) Subtopics: - web-security: Web 安全基础 (34 questions) - crypto-basics: 密码学基础 (34 questions) - buffer-overflow: 缓冲区溢出与漏洞利用 (34 questions) - os-security: 操作系统安全 (34 questions) - network-attack: 网络攻防 (34 questions) - secure-coding: 安全编程实践 (34 questions) Question types per subtopic: - single_choice × 20 - true_false × 10 - short_answer × 3 - code_reading × 1 Difficulty range: 1-3 (基础)
68 lines
6.6 KiB
JSON
68 lines
6.6 KiB
JSON
{
|
||
"topic": "os-security",
|
||
"type": "code_reading",
|
||
"schema_version": "1.0.0",
|
||
"generated": "2026-09-17T00:00:00+08:00",
|
||
"questions": [
|
||
{
|
||
"id": "cr-001",
|
||
"type": "code_reading",
|
||
"difficulty": 3,
|
||
"tags": [
|
||
"操作系统安全",
|
||
"windows安全",
|
||
"win32api"
|
||
],
|
||
"question": "阅读以下 Windows C/C++ 代码,分析其安全行为并回答子问题。",
|
||
"language": "c",
|
||
"code": "#include <windows.h>\n#include <stdio.h>\n\nint main() {\n HANDLE hToken = NULL;\n HANDLE hRestrictedToken = NULL;\n SID_IDENTIFIER_AUTHORITY sia = SECURITY_MANDATORY_LABEL_AUTHORITY;\n PSID pIntegritySid = NULL;\n TOKEN_MANDATORY_LABEL tml;\n\n // Step 1: Open current process token\n if (!OpenProcessToken(GetCurrentProcess(),\n TOKEN_QUERY | TOKEN_DUPLICATE | TOKEN_ADJUST_DEFAULT,\n &hToken)) {\n printf(\"OpenProcessToken failed: %lu\\n\", GetLastError());\n return 1;\n }\n\n // Step 2: Create a restricted token\n SID_AND_ATTRIBUTES sidToDisable;\n SID_IDENTIFIER_AUTHORITY ntAuth = SECURITY_NT_AUTHORITY;\n AllocateAndInitializeSid(&ntAuth, 2,\n SECURITY_BUILTIN_DOMAIN_RID,\n DOMAIN_ALIAS_RID_ADMINS,\n 0, 0, 0, 0, 0, 0,\n &sidToDisable.Sid);\n sidToDisable.Attributes = 0;\n\n if (!CreateRestrictedToken(hToken,\n DISABLE_MAX_PRIVILEGE,\n 1, &sidToDisable,\n 0, NULL,\n 0, NULL,\n &hRestrictedToken)) {\n printf(\"CreateRestrictedToken failed: %lu\\n\", GetLastError());\n FreeSid(sidToDisable.Sid);\n CloseHandle(hToken);\n return 1;\n }\n\n // Step 3: Set low integrity level\n AllocateAndInitializeSid(&sia, 1,\n SECURITY_MANDATORY_LOW_RID,\n 0, 0, 0, 0, 0, 0, 0,\n &pIntegritySid);\n tml.Label.Attributes = SE_GROUP_INTEGRITY;\n tml.Label.Sid = pIntegritySid;\n\n SetTokenInformation(hRestrictedToken,\n TokenIntegrityLevel,\n &tml,\n sizeof(tml));\n\n // Step 4: Create process with restricted token\n STARTUPINFO si = { sizeof(si) };\n PROCESS_INFORMATION pi;\n if (CreateProcessAsUser(\n hRestrictedToken,\n \"C:\\\\Windows\\\\notepad.exe\",\n NULL, NULL, NULL,\n FALSE,\n CREATE_NEW_CONSOLE,\n NULL, NULL, &si, &pi)) {\n printf(\"Process created with restricted token (PID: %lu)\\n\",\n pi.dwProcessId);\n CloseHandle(pi.hProcess);\n CloseHandle(pi.hThread);\n } else {\n printf(\"CreateProcessAsUser failed: %lu\\n\", GetLastError());\n }\n\n // Cleanup\n FreeSid(pIntegritySid);\n FreeSid(sidToDisable.Sid);\n CloseHandle(hRestrictedToken);\n CloseHandle(hToken);\n return 0;\n}",
|
||
"source": null,
|
||
"related": [],
|
||
"sub_questions": [
|
||
{
|
||
"index": 1,
|
||
"type": "single_choice",
|
||
"question": "这段代码中 CreateRestrictedToken() 的 DISABLE_MAX_PRIVILEGE 标志的作用是什么?",
|
||
"options": {
|
||
"A": "禁用所有用户的登录权限",
|
||
"B": "移除令牌中的所有特权,使新令牌几乎没有任何特权",
|
||
"C": "仅禁用网络相关的特权",
|
||
"D": "将所有特权降低为只读权限"
|
||
},
|
||
"answer": "B",
|
||
"explanation": "DISABLE_MAX_PRIVILEGE 标志告诉 CreateRestrictedToken() 移除源令牌中的所有特权(SeDebugPrivilege、SeBackupPrivilege 等),使得受限令牌几乎没有可用特权。这是实现最低权限运行的核心手段。结合代码中将 Administrators 组 SID 标记为 deny-only(sidToDisable.Attributes = 0),新建的进程既没有管理特权,也无法通过 Administrators 组获得资源访问权限。"
|
||
},
|
||
{
|
||
"index": 2,
|
||
"type": "single_choice",
|
||
"question": "代码第 3 步将 TokenIntegrityLevel 设置为 SECURITY_MANDATORY_LOW_RID 的效果是:",
|
||
"options": {
|
||
"A": "使进程可以访问所有低权限用户的文件",
|
||
"B": "将进程的完整性级别设为'低',使其无法写入中/高等级的资源(如注册表、文件系统敏感区域)",
|
||
"C": "降低进程的 CPU 优先级",
|
||
"D": "限制进程只能使用 64MB 内存"
|
||
},
|
||
"answer": "B",
|
||
"explanation": "Windows 的完整性级别机制(Mandatory Integrity Control)为安全对象分配低(Low)、中(Medium)、高(High)、系统(System)等级别。进程默认以中等级别运行。将进程的完整性级别设为 LOW 后,该进程只能写入同样标记为 LOW 完整性的对象,无法修改中等级别的对象(如大多数用户文件和注册表键)。这是 Windows 保护敏感资源不被低信任度进程篡改的重要机制,常见于 IE 的保护模式和 Chrome 的沙箱。"
|
||
},
|
||
{
|
||
"index": 3,
|
||
"type": "short_answer",
|
||
"question": "综合分析这段代码实现了什么样的安全目标?它采用了哪些安全机制的组合?",
|
||
"answer": "这段代码实现了一个最小特权进程创建模式,其安全目标是:即使以管理员身份运行本程序,创建的子进程(notepad.exe)也将以极低权限运行,无法执行特权操作或修改敏感资源。它组合了三种安全机制:1)CreateRestrictedToken + DISABLE_MAX_PRIVILEGE:移除所有特权并禁用 Administrators 组,防止提权和管理资源访问;2)TokenIntegrityLevel 设为 Low:利用强制完整性控制(MIC),阻止进程写入中高等级的安全对象;3)CreateProcessAsUser:使用受限令牌创建新进程,确保子进程从启动起就处于受限状态。这种组合防御(Defense in Depth)策略确保了即使单一机制被绕过,其他机制仍提供保护。",
|
||
"keywords": [
|
||
"最小特权",
|
||
"CreateRestrictedToken",
|
||
"完整性级别",
|
||
"CreateProcessAsUser",
|
||
"Defense in Depth",
|
||
"MIC"
|
||
],
|
||
"scoring_rubric": "满分标准:正确理解代码意图——创建低权限子进程(2分);说明 CreateRestrictedToken 的作用——移除特权和禁用组(2分);说明完整性级别设置的作用——MIC 阻止写入高完整性对象(2分);说明 CreateProcessAsUser 的作用——使用受限令牌启动新进程(1分);总结为组合防御策略(1分)。",
|
||
"explanation": ""
|
||
}
|
||
],
|
||
"explanation": ""
|
||
}
|
||
]
|
||
} |