IFUNC resolver:ld.so 重定位期的先于 main 执行原语
IFUNC resolver:ld.so 重定位期的先于 main 执行原语
一句话:STT_GNU_IFUNC 符号的 resolver 是动态链接器在重定位期"主动执行"的用户代码,
注入同名 IFUNC 即可在 .init_array/main 之前、且对常规构造函数审计不可见地拿到一段执行。
要点:
- 前提:能让攻击库进入进程的链接路径(LD_PRELOAD、库搜索顺序劫持、被篡改的依赖);
libc 本身导出 65 个 IFUNC 符号(strcpy、mempcpy、wcscpy 等),静态二进制更多,
同名符号碰撞的攻击面天然存在 - ld.so 处理引用 IFUNC 符号的重定位时必须调用 resolver 拿最终地址——攻击者 resolver
里用 raw syscall 落盘/做任何事,再返回一个"功能正常但被替换"的实现,受害者无感 - 执行时机由绑定模式决定:lazy binding 下是"首次调用",BIND_NOW(现代发行版对安全
敏感二进制的默认)下是"加载期",即控制权还没交到程序手里就先跑 - 隐蔽性来自执行点不在构造函数扫描/常规启动审计覆盖内;排查手段是审计导入导出表中
的 STT_GNU_IFUNC 符号与 resolver 行为
原语抽象:链接器协议里"代码被合法执行"的窗口(IFUNC resolver 必然被 ld.so
调用)被转成隐蔽执行点——利用的是协议要求而非漏洞,补丁无从谈起。
亲戚手法:构造函数/.init_array 隐蔽执行家族的更早时点成员;差异:执行先于
构造函数、BIND_NOW 下先于程序获得控制权,且不在常规启动项/构造函数审计清单内。
防御启示:启动完整性审计要纳入导入导出表的 STT_GNU_IFUNC 符号与 resolver
行为检查;第三方 so 供应链要有符号表级别的基线比对。
原文: https://xz.aliyun.com/news/92771
来源发布时间: 2026-09-01