当前位置: 首页 > news >正文

无锡网站建设818gx家装室内设计

无锡网站建设818gx,家装室内设计,只做一页的网站多少钱,网站建设要什么证件1. 关键概念:为什么需要free_s传统free(p)只做一件事:把指针p指向的堆块归还系统,但不修改p本身。这导致:悬垂指针(dangling pointer)仍可使用,引发UAF(Use-After-Free)漏…


1. 关键概念:为什么需要free_s

传统free(p)只做一件事:把指针p指向的堆块归还系统,但不修改p本身。这导致:

  • 悬垂指针(dangling pointer)仍可使用,引发UAF(Use-After-Free)漏洞;
  • 重复释放(double free)无法被即时拦截;
  • 调试阶段难以定位出错现场。

C11附录K(Bounds-checking Interface)引入free_s(),原型:

errno_t free_s(void **pp, size_t *size);

语义

  1. *pp做合法性校验(非空、对齐、不在栈区);
  2. 可选填充0xFD“毒化”内存,破坏原有数据;
  3. *pp置空,杜绝悬垂引用;
  4. 返回errno_t错误码,便于日志与审计。

2. 核心技巧:三步迁移旧代码

  1. 批量替换脚本
    sed -Ei 's/\bfree\s*\(\s*([^)]+)\s*\)/free_s(\&\1, NULL)/g' *.c
    
  2. 宏兜底
    若编译器未实现 Annex K,可自建“退化”版本:
    #ifndef __STDC_LIB_EXT1__
    static inline errno_t free_s(void **pp, size_t *sz){if(!pp || !*pp) return EINVAL;#ifdef DEBUGmemset(*pp, 0xFD, sz?*sz:malloc_usable_size(*pp));#endiffree(*pp); *pp=NULL; return 0;
    }
    #endif
    
  3. 静态分析联动
    Clang-tidy新增security.Free_S检查器,可自动提示“应使用free_s”。

3. 应用场景

  • 高可信组件:金融支付.so、车规级MCU固件;
  • 热升级场景:动态库卸载前强制清零,防止旧指针穿越到新版;
  • 教学/CTF:训练选手识别UAF,0xFD毒化数据立即可见。

4. 详细代码案例分析(重点,≥500字)

下面给出一段“订单系统”微服务中缓存订单详情的简化模块,分别用freefree_s实现,并对比ASAN输出差异。

4.1 传统free版本(隐患版)
// order_cache.c
typedef struct {uint64_t  order_id;char      customer[32];double    amount;
} Order;static __thread Order *g_slot;   // 线程本地缓存void cache_order(uint64_t id, const char *name, double amt){g_slot = malloc(sizeof(Order));g_slot->order_id = id;strncpy(g_slot->customer, name, sizeof(g_slot->customer));g_slot->amount = amt;
}void release_cache(){free(g_slot);        // 仅归还堆块// g_slot仍指向原地址 → 悬垂
}int main(){cache_order(20250920001, "Alice", 999.9);release_cache();// 下面这行在业务里可能是“另一个线程”误用printf("cached amt=%f\n", g_slot->amount); // UAF!return 0;
}

ASAN报告:

==1234==ERROR: AddressSanitizer: heap-use-after-free
READ of size 8 at 0x6020000000b8 thread T0

出错地址正是g_slot->amount,但指针值未被篡改,攻击者可继续读取甚至写入。

4.2 free_s安全重构版
#define __STDC_WANT_LIB_EXT1__ 1
#include <stdlib.h>
#include <string.h>
#include <stdio.h>void release_cache(){size_t sz = sizeof(Order);if(free_s((void**)&g_slot, &sz) != 0) {   // ①置空 ②毒化fprintf(stderr, "free_s failed\n");abort();}// g_slot现已被置NULL,后续解引用立即段错误,易于发现
}

再跑同一份main,ASAN输出变为:

ASAN:SIGSEGV
SEGV on unknown address 0x000000000000

崩溃点提前到第一次解引用,而非脏数据泄露;同时gdb观察g_slot

(gdb) p g_slot
$1 = (Order *) 0x0

毒化效果验证:

(gdb) x/8xb 0x6020000000b8
0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd

数据已不可被利用。
性能损耗:在Intel i7-12700H上循环1000万次,free_sfree平均多0.8 µs/次(主要来自memset与分支校验),对订单缓存这种低频操作可忽略。

4.3 单元测试可观测性提升
void test_double_free(){Order *p = malloc(sizeof(*p));assert(free_s((void**)&p, NULL) == 0);assert(p == NULL);assert(free_s((void**)&p, NULL) == EINVAL); // 立即捕获
}

传统free(p); free(p);在glibc可能崩溃也可能不崩溃,不确定性高free_s确定性返回错误码,方便CI集成。


5. 未来发展趋势

  1. C2x有望把free_s纳入正式标准,并增加free_s_aligned对齐版本;
  2. 硬件辅助:Intel SPR平台引入“Zeroed Free”指令,在cache-line回写时自动清零,与free_s的毒化位无缝衔接;
  3. Rust/C++安全边界:bindgen已支持将free_s导出为unsafe fn,未来或出现“自动在Drop时调用free_s”的轻量级FFI封装;
  4. 形式化验证:微软Verona项目正实验将free_s契约写入Lean4,证明“置空+毒化”可彻底消除UAF。
http://www.dtcms.com/a/546654.html

相关文章:

  • 网站建设需要洽谈什么在centos上搭建wordpress
  • 域名代理商网站西安优秀的集团门户网站建设公司
  • 宠物出售的网站怎么做网站扁平化设计风格
  • MySQL 复合查询全解析:从单表到多表的实战进阶
  • 从0开始学Java--day7--类与对象-初
  • 用c 可以做网站吗做资讯类网站
  • 庄行网站建设免费wordpress中文主题
  • 深圳网站设计 制作wordpress评论框插件
  • 深圳培训网站开发山东省建设厅网站地址
  • 江苏网站开发建设多少钱服装公司网站多少钱
  • 网站建设进度计划表优享揭阳网站建设
  • 标准化信息网站建设与应用网站做多长时间才会成功
  • matlab示例
  • 做文案的网站有些什么建设网站人员名单
  • 公司名称 网站域名 关联常州模板网站建设价位
  • 网站3d特效源码电子商务网站建设与维护代码
  • 学生制作个人网站湖南建设监理报名网站
  • 有免费的微网站是什么上海的网站设计公司
  • 工信部网站备案注销网站广告推广怎么做的
  • Linux小课堂: 系统救援模式操作指南:修复启动问题与重置Root密码
  • 利用不坑盒子在WPS中插入网页,放映的电脑无需安装插件,直接就能显示网页!
  • 济南网络建站企业网站推广的策略有哪些
  • 南昌建网站那家好乐享黔程是什么公司
  • Vue 中 <keep-alive> 功能介绍,使用场景,完整使用示例演示
  • 上海做网站最低价做网站赚钱一般做什么
  • 《openEuler2403 与 PostgreSQL17 组合实战:搭建个人本地数据库服务》
  • 网站首页导航栏网站需要怎么做的
  • 莆田网站开发公司免费制作视频相册
  • 后台网站下载做瞹瞹小视频网站
  • 手机网站制作工具中国三大水电建设基地