- 概述
在前面的安全编码实践的文章里,我们讨论了GS编译选项,<wbr>数据执行保护</wbr>DEP功能,以及静态代码分析工具Prefast。<wbr>这里,我们讨论在</wbr>C/C++代码中禁用危险的API,<wbr>其主要目的是为了减少代码中引入安全漏洞的可能性。</wbr>
- 那些是危险的API
2.1历史
在微软产品的安全漏洞中,有很大一部分是由于不正确的使用<wbr>C</wbr>动态库(C Runtime Library) 的函数,特别是有关字符串处理的函数导致的。<wbr>表一给出了微软若干由于不当使用</wbr>C动态库函数而导致的安全漏洞【<wbr>1</wbr>,p242】。
微软安全公告 | 涉及产品 | 涉及的函数 |
MS02-039 | Microsoft SQL Server 2000 | sprint |
MS05-010 | Microsoft License Server | lstrcpy |
MS04-011 | Microsoft Windows (DCPromo) | wvsprintf |
MS04-011 | Microsoft Windows (MSGina) | lstrcpy |
MS04-031 | Microsoft Windows (NetDDE) | wcscat |
MS03-045 | Microsoft Windows (USER) | wcscpy |
表1:不当使用C动态库函数而导致的安全漏洞
不当使用C动态库函数容易引入安全漏洞,这一点并不奇怪。<wbr>C</wbr>动态库函数的设计大约是30年前的事情了。当时,<wbr>安全方面的考虑并不是设计上需要太多注意的地方。</wbr>
2.2 危险API的列表
有关完整的危险API的禁用列表,大家可以参见http:<wbr>//msdn.microsoft.com/en-us/<wbr>library/bb288454.aspx</wbr></wbr>.
在这里我们列出其中的一部分,以便大家对那些API被禁用<wbr>有所体会。</wbr>
禁用的API | 替代的StrSafe函数 | 替代的Safe CRT函数 |
有关字符串拷贝的API | ||
strcpy, wcscpy, _tcscpy, _mbscpy, StrCpy, StrCpyA, StrCpyW, lstrcpy, lstrcpyA, lstrcpyW, strcpyA, strcpyW, _tccpy, _mbccpy | StringCchCopy, StringCbCopy, StringCchCopyEx, StringCbCopyEx |
strcpy_s |