随着嵌入式系统、操作系统和安全关键型软件对可靠性的要求日益提升,C语言编程中潜伏的安全漏洞成为重点关注对象。由加拿大标准协会(CSA)采纳的CAN/CSA-ISO/IEC TS 17961-18(等同采用ISO/IEC TS 17961:2018)《信息技术—编程语言环境与系统软件接口—C语言安全编码规则》为C语言开发提供了正式的安全编码准则。本技术规范定义了一套可实施、可验证的编码规则,旨在从源头上消除导致安全缺陷的常见编程错误。
1. 标准概况与适用范围
CAN/CSA-ISO/IEC TS 17961-18 是一个技术规范(Technical Specification,TS),它收集并标准化了针对C语言的安全编码规则。这些规则覆盖了从预处理、声明、表达式到内存管理、输入输出、并发等关键领域,重点防范缓冲区溢出、整数溢出、格式化字符串攻击、指针误用及未定义行为。该标准适用于:
- 安全关键型软件(如航空电子、医疗设备、工业控制系统)的开发;
- 采用C语言编写的基础软件与通信协议栈;
- 需要评估和选择C安全编码工具的团队;
- 组织内部制定安全编码策略时的权威参考。
标准不要求特定的开发方法论,而是提供独立的规则,开发者可结合其他安全流程(如威胁建模、测试)实施。作为加拿大国家标准,它在北美及国际范围内具有重要指导意义。
技术要点:该技术规范属于“TS”级别,说明其仍在演化中,但规则已足够成熟,可被静态分析工具和安全审计直接采用。
2. 主要技术内容与规则分类
标准的核心由一组结构化的安全编码规则组成,每条规则包括标识符、标题、严重性等级、合规性要求和示例说明。规则按领域分为以下主要类别:
- 预处理器(PRE):宏定义、条件编译中的风险;
- 声明与定义(DCL):存储类型、作用域、初始化;
- 表达式(EXP):运算符优先级、副作用、类型转换;
- 整数(INT):符号性、溢出、位操作;
- 字符串(STR):空终止、字符处理;
- 内存管理(MEM):分配、释放、生命周期;
- 输入输出(FIO):格式控制、文件处理;
- 环境(ENV):系统调用、命令行参数;
- 信号(SIG):异步安全函数;
- 并发(CON):数据竞争、线程安全。
以下表格列举了部分典型规则及其要求:
| 分类 | 规则ID(示例) | 简要要求 | 风险等级 |
| 整数 | INT32-C | 确保整数运算不会导致溢出(使用范围检查或安全函数) | 高 |
| 字符串 | STR00-C | 字符数组必须始终以空字符结尾,并对拷贝操作添加长度限制 | 高 |
| 内存 | MEM01-C | 释放动态内存后立即将指针置空,避免悬挂指针 | 中 |
| 预处理器 | PRE01-C | 宏定义中的实参应用括号括起,防止优先级类错误 | 中 |
| 输入输出 | FIO32-C | 禁止使用未检查格式化字符串(如以用户输入作为printf格式) | 高 |
常见误区:许多开发者仅关注“整数溢出”或“缓冲区溢出”等明显问题,却忽略了预处理器宏的副作用和表达式中的未定义行为,这些同样是规则的检查重点。
3. 实施与应用要点
要使CAN/CSA-ISO/IEC TS 17961-18在实际项目中发挥作用,建议采取以下步骤:
- 选择兼容的静态分析工具:工具应明确声明支持该技术规范,并能输出每条规则的检查结果。
- 裁剪规则集:根据项目领域和风险承受度,选取必须强制遵从的规则(例如安全关键系统需启用全部高严重性规则)。
- 集成到CI/CD流水线:在代码审查之前自动运行规则检查,阻断违规代码合并。
- 提供开发者培训:使团队理解规则背后的安全原理,而不仅仅是机械修正。
实施益处:遵循本规范可以降低超过80%的常见C语言安全漏洞(基于OWASP与CWE的映射数据),并提升代码的跨平台可移植性。
强制提示:标准中标识为“不可违反”的规则(如INT32-C、STR00-C)在安全审计中必须100%通过,任何违规都应视为严重缺陷。
需要注意的是,规则并非一成不变。开发者应结合具体执行环境(如内存受限系统、裸机环境)对部分规则做出合规性调整,但必须记录偏离理由并经过安全评审。
4. 与其他标准的关系
CAN/CSA-ISO/IEC TS 17961-18 与其他重要标准紧密关联:
- ISO/IEC 9899(C语言标准):安全规则建立在C标准定义的语言行为之上,大多数规则针对未定义行为或未指定行为加以限制。
- CERT C Secure Coding Standard:两者规则高度重合,但ISO/IEC TS 17961的规则表述更为正式,且面向工具验证。CSA版本与CERT社区成果互相补充。
- MISRA C:针对汽车及嵌入式安全的MISRA C更严格控制语言子集,而本规范侧重安全漏洞消除,两者可结合使用。
- ISO/IEC 23360系列(Linux标准基础):在系统编程层面为规则提供平台参考。
互操作性建议:如果项目已采用CERT C规则,可用本规范作为“工具检查目标”的补充,因为很多商用分析工具直接支持ISO/IEC TS 17961的规则标识。
常见问题(FAQ)
问:CAN/CSA-ISO/IEC TS 17961-18与ISO/IEC TS 17961:2013有何区别?
答:2018版主要更新包括:同步ISO/IEC 9899:2018(C17)的语言规范,新增对并发(CON)类别的规则,并基于实际应用经验修正了部分规则的可判定性描述。
问:该标准是否要求必须使用静态分析工具?
答:标准本身不强制工具,但推荐借助自动化工具实现规则检查。技术规范中设定了工具验证的基本准则,包括必须报告的未通过规则列表。
问:中小型项目应用此标准会加重开发负担吗?
答:初期会有适应成本,但长期看可显著减少释放后漏洞修复成本。建议先启用高严重性规则,逐步扩展,并与持续集成流程整合。
问:能否将本规范与其他安全标准(如ISO 26262)同时使用?
答:完全可以。本规范提供的编码级规则可作为功能安全标准中“软件安全要求”的实现手段,例如满足ISO 26262-6对编程规范的推荐。
总之,CAN/CSA-ISO/IEC TS 17961-18 是面向C语言安全开发的权威技术规范,它不仅提供了系统化的规则库,也为安全编码工具和过程改进设立了基准。在2026年及未来的软件开发实践中,采纳该标准将有助于构建更具韧性的软件系统。
📥 标准文件下载
🔒
请等待 10 秒,广告加载完成后将自动显示下载链接