开源之夏-7(ext)
这份笔记关注几个工具的学习。因为目前必须要用,急需掌握。
笔记链接列表:
- [make/cmake]
- [build.info]
- [LoadLibrary/dlopen]
- [DSO]
难点是,OpenSSL家族的项目作为历史悠久的库,有很多自研老工具的使用,资料不多。
- 构建系统:使用perl脚本,使用build.info。将GmSSL子项目迁移,需要掌握Cmake
(Cmake等工具还未出现的时候,perl脚本用于构建项目,生成Makefile) - 动态加载库DSO:OpenSSL(以及 Apache、NGINX 等)自己包的一层跨平台“动态库加载”小框架,本质等价于 Unix 的 dlopen/dlsym + Windows 的 LoadLibrary/GetProcAddress,只是为了可移植性和内部统一接口而造出来的“轮子”。
(早期 Windows 没有 dlopen,VMS 用另外一套 | 统一抽象后,老代码零改动 )
▶
DSO安全性分析
OpenSSL DSO 在“加载前/后”多做了一轮路径、权限、符号白名单的过滤,而系统原生 API(dlopen/LoadLibrary)默认几乎不做任何安全检查,这就是两者在安全性上的核心差异。
- 系统原生 API 的“裸奔”风险
项目 Unix dlopen Windows LoadLibrary 搜索路径 默认按 LD_LIBRARY_PATH
、DT_RPATH
、当前目录……极易被劫持按当前目录、PATH、注册表 App Path,DLL 劫持经典攻击面 文件校验 不做任何哈希/签名验证 不做 符号限制 可以加载任意符号,甚至同名符号覆盖(ELF symbol interposition) 可以加载任意导出函数 权限检查 只依赖文件系统权限 只依赖文件系统权限
- OpenSSL DSO 额外做的安全加固
加固点 说明 效果 受控搜索路径 DSO_load
默认不搜索当前目录,优先OPENSSL_DIR
或显式目录;也可传入回调过滤减少“同名库文件”被植入的风险 文件名白名单 只允许加载 sdf
、pkcs11
、legacy
等约定好的名字(取决于上层 engine/provider 配置)防止随意加载恶意 .so
符号前缀/白名单 部分 engine 在 DSO_bind_func
前先做strncmp(symbol, "SDF_", 4)
等过滤防止同名符号污染 只读映射 内部使用 `RTLD_NOW RTLD_LOCAL (Unix)或
LOAD_LIBRARY_SEARCH_SYSTEM32`(Win)ENGINE/Provider 配置 支持在配置文件中关闭动态加载,或显式指定“仅允许静态链接” 彻底关闭动态加载攻击面
- 总结
- 系统 API:只管“把文件映射进来”,安全完全交给操作系统。
- OpenSSL DSO:在“映射进来”前后再加一层“白名单 + 路径限制”,相当于给
dlopen
套了条安全带。
开源之夏-7(ext)
https://43.242.201.154/2025/08/18/开源之夏-7/