知识卡片
按输入信任程度选择编程语言
内容
解析不可信输入(如互联网用户提交的证书签名请求)的模块选用内存安全语言(Go),能从语言层面消除一整类内存相关漏洞;与核心基础设施耦合更深、必须用C++实现的模块,则靠安全环境和编译期防护(W^X、Scudo堆分配器、SafeStack)弥补语言本身不提供的保证,甚至让Go和C++各自解析一遍CSR、比对结果交叉验证。语言选型不该是团队偏好的单一决策,而应按”代码会不会直接接触外部不可信数据”分区决策。
参考来源
- 位置:《Google系统架构解密:构建安全可靠的系统》第11章《案例分析:设计、实现和维护一个受信任的公共CA》11.4.1节(源文件:`../OREILY动物书合辑 图灵新版/_epub-src/text/part0014_split_095.html`)
- 结论依据:原文说明CA混用Go和C++,因Go内存安全而用于处理CSR等不可信输入,C++因与核心基础设施耦合紧密而保留,并在处理CSR时"先用Go解析请求并比对二者的解析结果。如有不一致,则中断处理",同时列出W^X、Scudo Allocator、SafeStack等C++侧的缓解措施。
- 原始内容:由于Go是内存安全的,当CA要处理不可信输入内容时,它就具有额外的优势……在处理CSR时,在传递给C++做相同的操作前,我们先用Go解析请求并比对二者的解析结果。如有不一致,则中断处理。