新的安全编码规则

在Visual Studio v16.8 Preview 3中,我们添加了一些新的安全编码规则,来帮助开发者更容易找到一些更加容易导致Bug的编码错误,这些错误涵盖了从简单的功能缺失到严重的安全漏洞问题。
这些规则都是来自于真实世界的产品缺陷报告,在微软,我们会在我们的每一款产品中运行这些安全编码规则,以满足产品在安全和合规方面的需求。

在今天的文章中,我们会介绍VARIANT及其衍生的VARIANTARG和PROPVARIANT结构相关的编码规则。为了更加容易的使用这些规则,我们构建了一个名为VariantClear的代码分析扩展工具,这个扩展将会检测代码是否符合预期的编码规则。为什么叫这个扩展为VariantClear呢?因为它的主要目的就是为了检测那些误用VariantClear函数的代码。

VariantClear扩展将会检测出如下的代码警告:

> C33001: VARIANT ‘var’ 在它被反初始化时被重置。

> C33004: VARIANT ‘var’ 在它被初始化之前被重置,且它被标记为输出(Out)参数。

> C33005: VARIANT ‘var’ 被标记为输入或输入/输出参数,但是它没有被初始化。

VariantClear 规则

VARIANT是一个非常方便好用的结构体,可以使用它来对各种不同的数据类型进行数据交换。在任意时刻,它都可以被用来表示一个数据类型,或者空值。在这个结构体中有一个名为VARIANT::vt的成员,用来表示被封装的数据类型或者空值类型。

一个VARIANT结构必须被在使用或者传入到其他代码之前进行显式的初始化。否则,就会出现访问随机内存数据的问题,进而带来各种意想不到的Bug。

当一个VARIANT结构体不再使用的时候,也需要将它显式的重置。否则,会出现潜在的资源泄露或者对已离开其作用域的资源的错误访问。

通常,可以使用VariantInit函数来对一个VARIANT结构体进行初始化。对应地,可以使用VariantClear函数对它进行重置。

另外,还有一些对VARIANT结构的高级封装结构,例如CComVariant和_variant_t。
在构造阶段,它们的构造函数将调用VariantInit来对结构进行初始化,并将其数据类型设置为空值类型。
在析构阶段,它们的析构函数将调用VariantClear来对结构体进行销毁并将数据类型设置回空值。

VariantClear规则将尝试对目标代码进行分析,并对那些没有对VARIANT结构体进行合适的初始化或反初始化的代码给出提示。

C33001警告

当一个未初始化的VARIANT结构体传递给一个会使用VariantClear函数来重置VARIANT的API的时候,会触发这个警告。
因为,这类API会期待传入的VARIANT结构体是已经初始化的。但是很多开发者总是会忘记初始化这个步骤。
下面是一个简单的例子:

在上面的代码中,会触发C33001警告。因为VARIANT结构体仅在some_condition为true时才会被初始化。如果这个标志为false,则当它传递给VariantClear函数时是未初始化的。
为了修复这个问题,我们可以以如下的方式修改代码,确保调用VariantClear时结构体肯定是经过初始化的。 如下图所示:

C33004警告

当一个VARIANT结构体被标记为Out参数,而这个参数可能在输入的时候并没有被初始化,当它进一步被传递给一个会使用VariantClear函数来重置这个结构体的API时,会触发此警告。

当调用一个函数的时候,一个被标记为Out的参数并不一定会被初始化。只有当它函数返回的时候,它才会被初始化。

从更加安全的角度来看,在进行代码分析的时候,一个Out参数被认为是未初始化的。如果当这个参数被传递到一个函数,而这个函数可能会使用VariantClear操作这个结构体时,它会尝试重置这个结构体,或者使用内存里的随机数据。下面是一个简单的例子:

为了修复这个问题,可以在访问Out参数时对它进行初始化,如下图所示:

C33005警告

当一个未初始化的VARIANTBeijing传递给一个需要输入型参数的函数的时候,会触发此警告。
如下图所示:

通过这个C33005警告,我们可以更加清楚地明白为什么C44004警告会被触发。
当一个未经初始化的VARIANT的结构体被当做一个输入型参数传递的时候,会显式地违反C33005规则。

如何在Visual Studio中启用新的规则

下图中列出了可以用在工程上的不同的规则,可以根据这个表格在Visual Studio中启用规则。

总结

当里个当,声明变量的时候,还是不要忘记初始化。

最后

Microsoft Visual C++团队的博客是我非常喜欢的博客之一,里面有很多关于Visual C++的知识和最新开发进展。大浪淘沙,如果你对Visual C++这门古老的技术还是那么感兴趣,则可以经常去他们那(或者我这)逛逛。
本文来自:《New Safety Rules in C++ Code Analysis》

对没有标记为安全的activex控件进行初始化和脚本运行_新的C++安全编码规则出炉...相关推荐

  1. 对没有标记为安全的activex控件进行初始化和脚本运行_RASP攻防 —— RASP安全应用与局限性浅析...

    文|[腾讯安全平台部数据安全团队] qiye & baz 前言 随着Web应用攻击手段变得复杂,基于请求特征的防护手段,已经不能满足企业安全防护需求.在2012年的时候,Gartner引入了& ...

  2. [转]ActiveX控件安全初始化之一:实现ISafeObject接口

    [转]自http://www.cnblogs.com/carekee/articles/1772201.html  ActiveX控件安全初始化之一:实现ISafeObject接口 ActiveX控件 ...

  3. ie浏览器java 脚本下载_如何设置ie浏览器中的activex控件和插件java脚本下载用户验证...

    ActiveX是Microsoft提出的一组使用COM(ComponentObjectModel,部件对象模型)使得软件部件在网络环境中进行交互的技术集.它与具体的编程语言无关.作为针对Interne ...

  4. 修改注册表添加信任站点及启用Activex控件(转载)

    // //    添加信息站点及将指定IP添加到本地Intranet中, //    "*"=dword:00000002 表示受信任的站点区域 //    "*&quo ...

  5. 点击打印出现IE已经阻止此站点用不安全方式使用 ActiveX 控件解决方

    以不点击网页中的打印按钮,而是选择"文件""打印"即可. 主菜单"工具"--Internet选项--安全--自定义级别, 将"安全 ...

  6. IE已经阻止此站点以不安全的方式使用ActiveX控件的解决

    声明:这是转帖的 原帖地址:http://blog.pfan.cn/yuqiexing/52344.html IE8很烦躁.今天尝试ocx控件发消息的时候,死活不行.终于看到一行小字: "电 ...

  7. Internet Explorer 已经阻止此站点以不安全的方式使用ActiveX控件(多种解决方法)

    一.电脑出现IE已经阻止此站点以不安全的方式使用ActiveX控件,因此该网页无法正确显示"的处理办法: 1.更改安全级别.. 如果你看不懂或者不会,我教你一个简单的. 打开IE.找到上方的 ...

  8. windows添加信任站点和开启所有activex控件

    Windows添加信任站点和开启所有ActiveX控件 事情是这样的,一位朋友是做软件支持的,可是他和我说每次支持都是要先手动去ie添加信任站点,然后是自定义级别然后把所有的activex控件全部启动 ...

  9. [转]使用C#开发ActiveX控件全攻略

    先说说ActiveX的基本概念. 根据微软权威的软件开发指南MSDN(Microsoft Developer Network)的定义,ActiveX插件以前也叫做OLE控件或OCX控件,它是一些软件组 ...

最新文章

  1. 计算机网络的寻址问题ARP协议(Mac地址 ip地址)
  2. 激发新型城市创新动能 第四范式分享智慧城市探索之路
  3. jquery的$.each和$().each
  4. 史上最全的stm32资料库4---常见问题及编译工具篇
  5. mysql 升级 openssl_【1分钟教程】LNMP架构应用实战 Openssl升级操作
  6. OSChina 周五乱弹 —— 如何向妹子解释越位
  7. tomcat启动慢, Creation of SecureRandom instance for session ID generation using [SHA1PRNG]took [xx] mil
  8. mysql什么是主键和外键?
  9. 【AD20学习笔记】PCB封装库的创建
  10. pdman 创建表同步数据库_PDMan-2.0 正式发布:用心开源,免费的国产数据库建模工具PowerDesigner...
  11. 01-交换机级联实验
  12. 成为Java GC专家系列(2) ——监控Java垃圾回收
  13. 股票世界观-招财大牛猫公众号整理
  14. [读书][笔记]WINDOWS PE权威指南《零》PE基础
  15. 轴心时代的三大东方圣人老子、孔子和释迦牟尼
  16. java 连接sqlserver_java如何连接sqlserver数据库
  17. 如何成为一名正义黑客?你应该学习什么?
  18. [演讲]北大鄂维南院士:智能时代意味着什么?
  19. GitHub 高星开源项目今日发起
  20. 安装Virtualbox出现严重错误

热门文章

  1. java 向量空间模型_VSM向量空间模型对文本的分类以及简单实现
  2. python class 属性是什么_python class 的属性
  3. 【数理知识】矩阵束 Matrix Pencil
  4. 【Paper】2013_Autonomous Cooperation Between UAV and UGV to Improve Navigation and Environmental
  5. P9 线性系统状态空间分析-《Matlab/Simulink与控制系统仿真》程序指令总结
  6. 2.16 关于 Python Numpy 的说明-深度学习-Stanford吴恩达教授
  7. memset函数及其用法,C语言memset函数详解
  8. 2、前端环境搭建(19.04.12)
  9. Java文件上传功能代码 —— 普遍适用
  10. nginx源码安装教程(CentOS)