Files
wonder 70e368e235
Deploy Examination / deploy (push) Successful in 7s
feat: add cybersecurity topic with 6 subtopics (204 questions)
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 (基础)
2026-09-17 13:33:04 +08:00

68 lines
6.6 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"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": ""
}
]
}