请选择 进入手机版 | 继续访问电脑版

专注代码检测 - 阅镜

 找回密码
 立即注册
热搜: 安装 代码
查看: 129|回复: 0

防止错误的类型转换(type confusion)

[复制链接]

70

主题

70

帖子

232

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
232
发表于 2021-9-10 20:50:33 | 显示全部楼层 |阅读模式
在对指针、对象或变量进行操作时,需要能够正确判断所操作对象的原始类型。如果使用了与原始类型不兼容的类型进行访问,则存在安全隐患。

错误:

  1. const int NAME_TYPE = 1;
  2. const int ID_TYPE = 2;

  3. // 该类型根据 msg_type 进行区分,如果在对MessageBuffer进行操作时没有判断目标对象,则存在类型混淆
  4. struct MessageBuffer {
  5.   int msg_type;
  6.   union {
  7.     const char *name;
  8.     int name_id;
  9.   };
  10. };

  11. void Foo() {
  12.   struct MessageBuffer buf;
  13.   const char* default_message = "Hello World";
  14.   // 设置该消息类型为 NAME_TYPE,因此buf预期的类型为 msg_type + name
  15.   buf.msg_type = NAME_TYPE;
  16.   buf.name = default_message;
  17.   printf("Pointer of buf.name is %p\n", buf.name);

  18.   // 没有判断目标消息类型是否为ID_TYPE,直接修改nameID,导致类型混淆
  19.   buf.name_id = user_controlled_value;

  20.   if (buf.msg_type == NAME_TYPE) {
  21.     printf("Pointer of buf.name is now %p\n", buf.name);
  22.     // 以NAME_TYPE作为类型操作,可能导致非法内存读写
  23.     printf("Message: %s\n", buf.name);
  24.   } else {
  25.     printf("Message: Use ID %d\n", buf.name_id);
  26.   }
  27. }
复制代码


正确(判断操作的目标是否是预期类型):
  1. void Foo() {
  2.   struct MessageBuffer buf;
  3.   const char* default_message = "Hello World";
  4.   // 设置该消息类型为 NAME_TYPE,因此buf预期的类型为 msg_type + name
  5.   buf.msg_type = NAME_TYPE;
  6.   buf.name = default_msessage;
  7.   printf("Pointer of buf.name is %p\n", buf.name);

  8.   // 判断目标消息类型是否为 ID_TYPE,不是预期类型则做对应操作
  9.   if (buf.msg_type == ID_TYPE)
  10.     buf.name_id = user_controlled_value;

  11.   if (buf.msg_type == NAME_TYPE) {
  12.     printf("Pointer of buf.name is now %p\n", buf.name);
  13.     printf("Message: %s\n", buf.name);
  14.   } else {
  15.     printf("Message: Use ID %d\n", buf.name_id);
  16.   }
  17. }
复制代码


关联漏洞:
  1.   高风险-内存破坏
复制代码
回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

QQ|Archiver|手机版|小黑屋| 阅镜 ( 京ICP备2020034574号 )|网站地图|网站地图点击这里给我发消息

GMT+8, 2022-1-17 08:56 , Processed in 0.072450 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表